美文网首页
MyBatis-Plus使用入门

MyBatis-Plus使用入门

作者: 文景大大 | 来源:发表于2021-06-17 18:06 被阅读0次

    一、准备工作

    1.1 数据库MySQL

    下载安装过程略。

    1.2 数据库可视化工具DBeaver

    下载安装过程略。

    1.3 表及数据的准备

    • 创建表

      CREATE TABLE `zx_user` (
        `user_id` bigint(20) NOT NULL COMMENT '用户ID',
        `user_name` varchar(30) DEFAULT NULL COMMENT '用户姓名',
        `age` int(11) DEFAULT NULL COMMENT '用户年龄',
        `user_email` varchar(50) DEFAULT NULL COMMENT '用户邮箱',
        PRIMARY KEY (`user_id`),
        UNIQUE KEY `zx_user_un` (`user_id`),
        UNIQUE KEY `zx_user_un2` (`user_email`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
      
    • 插入测试数据

      INSERT INTO zx_user (user_id, user_name, age, user_email) VALUES
      (1, 'Jone', 18, 'test1@baomidou.com'),
      (2, 'Jack', 20, 'test2@baomidou.com'),
      (3, 'Tom', 28, 'test3@baomidou.com'),
      (4, 'Sandy', 21, 'test4@baomidou.com'),
      (5, 'Billie', 24, 'test5@baomidou.com');
      

    1.4 SpringBoot工程下载

    start.spring.io上下载一个SpringBoot工程,要求的依赖有web,导入本地IDEA后,创建子项目mybatis和mybatis-plus,分别演示各自功能的使用。

    父工程pom需要增加mysql驱动依赖、连接池依赖和Lombok依赖:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.6</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    

    mybatis子工程的pom还需要增加如下依赖项:

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
    

    mybatis-plus子工程pom还需要增加如下依赖项:

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    

    1.5 数据源配置

    mybatis子项目做如下的配置。

    application.properties中加上如下的配置。

    # 配置数据源信息
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    
    # 配置mapper xml的位置
    mybatis.mapper-locations=classpath:mapper/*Mapper.xml
    
    # 是否显示执行sql
    logging.level.com.xun.mapper=debug
    

    mybatis-plus做如下的配置。

    application.properties中加上如下的配置。

    # 配置数据源信息
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://x.x.x.x:3306/zhangxun?characterEncoding=utf-8&&serverTimezone=Asia/Shanghai&&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    
    # 是否显示执行sql
    logging.level.com.xun.mapper=debug
    

    二、MyBatis增删查改案例

    2.1 新建实体类

    在合适的包下面新建实体类。

    @Data
    public class User {
    
        private Long userId;
        private String userName;
        private Integer age;
        private String userEmail;
    
    }
    

    2.2 新建Mapper接口

    路径为com.xun.mapper,后续在启动类上设置@MapperScan时需要指定该路径。

    @Repository
    public interface UserMapper {
    
        public List<User> listUsers();
    
        public List<User> getUserById(String userId);
    
        public Integer addUser(User user);
    
        public Integer deleteUserById(String userId);
    
        public Integer updateUserNameById(User user);
    }
    

    2.3 新建Mapper.xml

    在resources/mapper下面新建该文件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.xun.mapper.UserMapper">
        <insert id="addUser" parameterType="com.xun.bean.User">
            insert into zx_user (user_id, user_name, age, user_email)
            values (#{userId}, #{userName}, #{age}, #{userEmail});
        </insert>
    
        <update id="updateUserNameById" parameterType="com.xun.bean.User">
            update zx_user set user_name = #{userName} where user_id = #{userId}
        </update>
    
        <delete id="deleteUserById" parameterType="string">
            delete from zx_user where user_id = #{userId}
        </delete>
    
        <select id="listUsers" resultType="com.xun.bean.User">
            select zu.user_id userId, zu.user_name userName, zu.age age, zu.user_email userEmail from zx_user zu;
        </select>
    
        <select id="getUserById" resultType="com.xun.bean.User" parameterType="string">
            select zu.user_id userId, zu.user_name userName, zu.age age, zu.user_email userEmail from zx_user zu where
            zu.user_id = #{userId};
        </select>
    </mapper>
    

    2.4 新建controller

    @RestController
    public class UserController {
        @Autowired
        private UserMapper userMapper;
    
        @GetMapping("/listUsers")
        public List<User> listUsers(){
            return userMapper.listUsers();
        }
    
        @GetMapping("/getUserById/{userId}")
        public List<User> getUserById(@PathVariable String userId){
            return userMapper.getUserById(userId);
        }
    
        @PostMapping("/addUser")
        public Integer addUser(@RequestBody User user){
            return userMapper.addUser(user);
        }
    
        @DeleteMapping("/deleteUserById/{userId}")
        public Integer deleteUserById(@PathVariable String userId){
            return userMapper.deleteUserById(userId);
        }
    
        @PutMapping("/updateUserNameById")
        public Integer updateUserNameById(@RequestBody User user){
            return userMapper.updateUserNameById(user);
        }
    }
    

    2.4 配置启动

    @MapperScan("com.xun.mapper")
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    最后使用postman模拟测试,全部成功。

    三、MyBatis-Plus增删查改案例

    3.1 新建实体类

    在合适的包下面新建实体类,其中@TableName不是必须的,如果不写或者只写该注解不带值,那么默认查询的表名称就是实体类的名称User,如果表名和实体类名不一致,就需要像如下一样绑定表名和实体类名。

    @Data
    @TableName("zx_user")
    public class User {
    
        private Long userId;
        private String userName;
        private Integer age;
        private String userEmail;
    
    }
    

    默认情况下mybatis-plus会认为实体类字段名称和数据库表字段的名称是对应的,比如userName对应user_name,userId对应user_id,age对应age;如果实体类的字段名称是userNameStr,那么就会去数据库表中找user_name_str字段,所以,如果不存在对应关系的话,就需要增加注解@TableField,通过value属性指定该实体类字段对应的数据库表字段名称,如下所示:

    @TableField("user_name")
    private String userNameStr;
    

    3.2 新建Mapper接口

    路径为com.xun.mapper,后续在启动类上设置@MapperScan时需要指定该路径。

    public interface UserMapper extends BaseMapper<User> {
    }
    

    其中,Mapper接口需要继承BaseMapper父类,父类中包含了常用的增删查改方法,我们就不用自己再定义了,甚至都不用再写xml文件了。

    3.3 新建Controller

    3.3.1 查询

    • selectList

      @GetMapping("/listUsers")
      public List<User> listUsers(){
          // SELECT user_id,user_name,age,user_email FROM zx_user
          return userMapper.selectList(null);
      }
      

      如果想根据某个条件进行查询:

      @GetMapping("/getUserById/{userId}")
      public List<User> getUserById(@PathVariable String userId){
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          // "user_id"指定数据库表字段名称,eq代表等于
          queryWrapper.eq("user_id", userId);
          // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?)
          return userMapper.selectList(queryWrapper);
      }
      
    • selectById

      @GetMapping("/getSingleUserById/{userId}")
      public User getSingleUserById(@PathVariable String userId){
          // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id=?
          return userMapper.selectById(userId);
      }
      

      要想如上根据Id来进行查询能正常执行,我们需要指定实体类中那个字段是Id,不然mubatis-plus就无法工作了,比如:

      @Data
      @TableName("zx_user")
      public class User {
          @TableId
          private Long userId;
          private String userName;
          private Integer age;
          private String userEmail;
      }
      

      @TableId有两个属性,value可以指定数据库表字段的名字,type表示这个Id的规则,具体有如下枚举选项:

      /**
           * 数据库ID自增
           * <p>该类型请确保数据库设置了 ID自增 否则无效</p>
           */
      AUTO(0),
      /**
           * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
           */
      NONE(1),
      /**
           * 用户输入ID
           * <p>该类型可以通过自己注册自动填充插件进行填充</p>
           */
      INPUT(2),
      
      /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
      /**
           * 分配ID (主键类型为number或string),
           * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
           *
           * @since 3.3.0
           */
      ASSIGN_ID(3),
      /**
           * 分配UUID (主键类型为 string)
           * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
           */
      ASSIGN_UUID(4);
      

      我们现在还不涉及插入,此处可以先保持默认。

    • selectBatchIds

      基本用法同上面的selectById,只不过是根据多个Id进行查询。

      @GetMapping("/getUserByIds/{userIds}")
      public List<User> getUserByIds(@PathVariable String userIds){
          List<String> userIdList = Arrays.asList(userIds.split(","));
          // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_id IN ( ? , ? , ? )
          return userMapper.selectBatchIds(userIdList);
      }
      
    • selectByMap

      @GetMapping("/getUserByName/{userName}")
      public List<User> getUserByName(@PathVariable String userName) {
          Map<String,Object> paramMap = new HashMap<>();
          // 还可以输入多个其它查询条件
          paramMap.put("user_name", userName);
          // SELECT user_id,user_name,age,user_email FROM zx_user WHERE user_name = ?
          return userMapper.selectByMap(paramMap);
      }
      
    • selectCount

      用于计算满足查询条件的记录数量。

      @GetMapping("/countUsers/{userId}")
      public Integer countUsers(@PathVariable String userId) {
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          queryWrapper.eq("user_id", userId);
          // SELECT COUNT( * ) FROM zx_user WHERE (user_id = ?)
          return userMapper.selectCount(queryWrapper);
      }
      
    • selectOne

      用于确保只返回一条满足查询条件的记录,倘若查到的记录数大于1,系统就会报错。

      @GetMapping("/getSingleUser/{userId}")
      public User getSingleUser(@PathVariable String userId) {
          QueryWrapper<User> queryWrapper = new QueryWrapper<>();
          queryWrapper.eq("user_id", userId);
          // SELECT user_id,user_name,age,user_email FROM zx_user WHERE (user_id = ?)
          return userMapper.selectOne(queryWrapper);
      }
      

    3.3.2 新增

    @PostMapping("/addUser")
    public Integer addUser(@RequestBody User user){
        // INSERT INTO zx_user ( user_id, user_name, age, user_email ) VALUES ( ?, ?, ?, ? )
        return userMapper.insert(user);
    }
    

    新增的时候需要注意的是,主键应该如何生成,此时我们的实体类User上面没有指定主键@TableId的规则,默认就是NONE,表示由用户输入。下面对各种主键规则进行介绍:

    • NONE和INPUT,表示由用户输入;
    • AUTO表示需要自增,前提是数据库表中该主键设置了自增特性;
    • ASSIGN_ID和ASSIGN_UUID表示当插入数据的主键为空时由特定算法给生成一个;

    3.3.3 修改

    // 更新操作
    @PutMapping("/updateUserNameById")
    public Integer updateUserNameById(@RequestBody User user){
        // UPDATE zx_user SET user_name=? WHERE user_id=?
        return userMapper.updateById(user);
    }
    
    @PutMapping("/update/{userName}")
    public Integer update(@RequestBody User user, @PathVariable String userName){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_name", userName);
        // user参数表示需要更新的内容,wrapper表示匹配记录的条件
        // 即使user参数中有userId,也不会去更新数据库的主键user_id
        // UPDATE zx_user SET user_name=?, age=? WHERE (user_name = ?)
        return userMapper.update(user, queryWrapper);
    }
    

    3.3.4 删除

    删除操作的方法和查询非常类似,这里就不做详细讲解,直接给出代码示例。

    @DeleteMapping("/deleteUserById/{userId}")
    public Integer deleteUserById(@PathVariable String userId){
        // DELETE FROM zx_user WHERE user_id=?
        return userMapper.deleteById(userId);
    }
    
    @DeleteMapping("/deleteBatchIds/{userIds}")
    public Integer deleteBatchIds(@PathVariable String userIds){
        List<String> userIdList = Arrays.asList(userIds.split(","));
        // DELETE FROM zx_user WHERE user_id IN ( ? , ? )
        return userMapper.deleteBatchIds(userIdList);
    }
    
    @DeleteMapping("/deleteByMap/{userName}")
    public Integer deleteByMap(@PathVariable String userName){
        Map<String,Object> paramMap = new HashMap<>();
        // 还可以输入多个其它查询条件
        paramMap.put("user_name", userName);
        // DELETE FROM zx_user WHERE user_name = ?
        return userMapper.deleteByMap(paramMap);
    }
    
    @DeleteMapping("/delete/{userId}")
    public Integer delete(@PathVariable String userId){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", userId);
        // DELETE FROM zx_user WHERE (user_id = ?)
        return userMapper.delete(queryWrapper);
    }
    

    3.4 配置启动

    @MapperScan("com.xun.mapper")
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    最后使用postman模拟测试,全部成功。

    相关文章

      网友评论

          本文标题:MyBatis-Plus使用入门

          本文链接:https://www.haomeiwen.com/subject/qsncyltx.html