3、MyBatis 映射文件

本文将系统讲解Redis基础知识,涉及概念、常用操作指令,如添加、更新和删除标签,以及主从复制等内容,并通过实例演示如何使用MyBatis进行用户、订单和角色管理,包括SQL查询和映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该栏目会系统的介绍 Redis 的知识体系,共分为相关概念、操作指令、主从复制等模块



基本结构

映射文件基本结构


语句操作标签

描述标签
添加标签insert
更新标签update
删除标签delete
查询标签select
# 条件标签where
# 判断标签if
# 循环标签foreach
查询标签select
SQL片段标签sql
结果集标签resultMap

案例

  • 表相关SQL
<!--用户表-->
CREATE TABLE `users` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户Id',
  `username` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '用户名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `birth` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '出生日期',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

<!--订单表-->
CREATE TABLE `orders` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单主键',
  `user_id` int(11) DEFAULT NULL COMMENT '用户主键',
  `order_code` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '订单号',
  `total` double(11,2) DEFAULT NULL COMMENT '订单总额',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

<!--权限表-->
CREATE TABLE `roles` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色Id',
  `role_name` varchar(64) COLLATE utf8mb4_bin NOT NULL COMMENT '角色名称',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

<!--用户权限表-->
CREATE TABLE `user_role` (
  `user_id` int(11) NOT NULL COMMENT '用户Id',
  `role_id` int(11) DEFAULT NULL COMMENT '角色Id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
  • 实体类
/**
 * 用户实体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    private int userId;

    private String username;

    private int age;

    private Date birth;

    private List<Order> orders;

    private List<Role> roles;

    public User(String username, int age, Date birth) {
        this.username = username;
        this.age = age;
        this.birth = birth;
    }

}

/**
 * 订单实体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order implements Serializable {

    private int orderId;

    private String orderCode;

    private double total;

    private User user;

}

/**
 * 角色实体
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role implements Serializable {

    private int roleId;

    private String roleName;

}
  • UserMapper.java接口
/**
 * 用户操作接口
 */
public interface UserMapper {

    void save(User user);

    void update(User user);

    void deleteById(int id);

    List<User> findAll();

    User findById(int id);

    List<User> findByUsername(String username);

    List<User> findByIds(List<Integer> ids);

    List<Order> findOrderAndUser();

    List<User> findUserAndOrders();

    List<User> findUserAndRoles();
    
}
  • UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.itnear.mapper.UserMapper">

    <!--插入用户-->
    <insert id="save" useGeneratedKeys="true" keyProperty="userId" parameterType="user">
        insert into users(username,age,birth) values(#{username},#{age},#{birth})
    </insert>

    <!--更新用户-->
    <update id="update" parameterType="user">
        update users set username = #{username} where user_id = #{userId}
    </update>

    <!--根据Id删除用户-->
    <delete id="deleteById" parameterType="int">
        delete from users where user_id = #{userId}
    </delete>

    <!--查询所有用户-->
    <select id="findAll" resultType="user">
        select * from users;
    </select>

    <!--根据Id查询单个用户-->
    <select id="findById" resultType="user" parameterType="int">
        select * from users where user_id = #{userId}
    </select>

    <!--    -->

    <!--封装公共SQL片段-->
    <sql id="selectUser">
        select * from users
    </sql>

    <!--根据用户名模糊查询用户-->
    <select id="findByUsername" parameterType="string" resultType="user">
        <include refid="selectUser"/>
        <where>
            <if test="username != null">
                username like concat('%',#{username},'%')
            </if>
        </where>
    </select>

    <!--根据id集合查询相关用户-->
    <select id="findByIds" parameterType="list" resultType="user">
        <include refid="selectUser"/>
        <where>
            <foreach collection="list" item="userId" separator="," open="user_id in(" close=")">
                #{userId}
            </foreach>
        </where>
    </select>

    <!--一多一查询:查询订单及其所属用户-->
    <resultMap id="orderMap" type="order">
        <id column="order_id" property="orderId"/>
        <result column="order_code" property="orderCode"/>
        <result column="total" property="total"/>
        <association property="user" javaType="user">
            <id column="user_id" property="userId"/>
            <result column="username" property="username"/>
            <result column="age" property="age"/>
            <result column="birth" property="birth"/>
        </association>
    </resultMap>
    <select id="findOrderAndUser" resultMap="orderMap">
        select * from orders o,users u where o.user_id = u.user_id
    </select>

    <!--一对多查询:查询用户及其订单信息-->
    <resultMap id="userMap" type="user">
        <id column="user_id" property="userId"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="birth" property="birth"/>
        <collection property="orders" ofType="order">
            <id column="order_id" property="orderId"/>
            <result column="order_code" property="orderCode"/>
            <result column="total" property="total"/>
        </collection>
    </resultMap>
    <select id="findUserAndOrders" resultMap="userMap">
        select * from users u,orders o where u.user_id = o.user_id
    </select>

    <!--多对多:查询用户及其权限列表-->
    <resultMap id="userRoleMap" type="user">
        <id column="user_id" property="userId"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
        <result column="birth" property="birth"/>
        <collection property="roles" ofType="role">
            <id column="role_id" property="roleId"/>
            <result column="role_name" property="roleName"/>
        </collection>
    </resultMap>
    <select id="findUserAndRoles" resultMap="userRoleMap">
        select * from users u,user_role ur,roles r where u.user_id = ur.user_id and ur.role_id = r.role_id
    </select>
    
</mapper>
  • 测试类
/**
 * 项目启动类:配置方式
 */
public class ApplicationRunner {

    public static void main(String[] args) throws IOException {
        final InputStream stream = Resources.getResourceAsStream("mybatis-config.xml");
        final SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(stream);
        final SqlSession sqlSession = sessionFactory.openSession();

        basicSqlMapper(sqlSession);
        advancedSqlMapper(sqlSession);
    }

    /**
     * 基础SQL测试
     */
    private static void basicSqlMapper(SqlSession sqlSession) {
        final UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 添加用户
        final User user = new User("NearJC", 18, new Date());
        userMapper.save(user);
        sqlSession.commit();  // 提交事务

        // 修改用户名
        user.setUsername("NearBJ");
        userMapper.update(user);
        sqlSession.commit();

        // 查询单个用户
        final User dbUser = userMapper.findById(1);
        System.out.println("用户信息:" + user);

        // 查询所有用户
        final List<User> users = userMapper.findAll();
        for (User u : users) {
            System.out.println(u);
        }

        // 删除用户
        // userMapper.deleteById(user.getUserId());
        // sqlSession.commit();
    }

    /**
     * 高级SQL映射
     */
    private static void advancedSqlMapper(SqlSession sqlSession) {
        final UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 根据用户名模糊查询用户
        List<User> users = userMapper.findByUsername("Near");
        for (User user : users) {
            System.out.println("模糊查询到的用户信息:" + user);
        }

        // 根据id集合查询相关用户
        users = userMapper.findByIds(Arrays.asList(1, 2, 3, 4, 5));
        for (User user : users) {
            System.out.println("d集合查询到的用户信息:" + user);
        }

        // 一对一查询:查询订单及所属用户信息
        List<Order> orders = userMapper.findOrderAndUser();
        for (Order order : orders) {
            System.out.println("订单及用户信息" + order);
        }

        // 一对多查询:查询用户及相关订单
        users = userMapper.findUserAndOrders();
        for (User user : users) {
            System.out.println("用户及订单信息:" + user);
        }

        // 多对多查询:查询用户及相关角色
        users = userMapper.findUserAndRoles();
        for (User user : users) {
            System.out.println("用户及权限信息:" + user);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值