• 【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置



    一、初识 MyBatis Plus

    1.1 MyBatis Plus 是什么

    MyBatis Plus(简称 MyBatis-Plus 或 MP)是一个流行的Java持久层框架,它在 MyBatis 的基础上进行了扩展,旨在简化数据库操作和提高开发效率。它提供了丰富的功能和工具,使开发者能够更轻松地进行数据库操作,包括增删改查等常见操作。MyBatis Plus 还提供了一套方便的 API 和注解,可以减少编写重复性代码的工作。

    MyBatis Plus 的官网:https://www.baomidou.com

    1.2 MyBatis Plus 和 MyBatis 的区别

    MyBatis Plus 与原始的 MyBatis 框架有以下主要区别:

    • 功能增强:MyBatis Plus 在 MyBatis 的基础上提供了更多的功能,如通用的 CRUD 操作、分页查询、条件构造器等。这些功能减少了开发人员的工作量,提高了开发效率。

    • 注解支持:MyBatis Plus 引入了一系列注解,如@TableName@TableId@TableField等,使得实体类的映射更加灵活和方便,不再需要 XML 映射文件。

    • 更强大的条件构造器:MyBatis Plus 的条件构造器允许我们以更加直观和链式的方式构建 SQL 查询条件,而不必担心拼接 SQL 字符串。

    • 自动代码生成:MyBatis Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类和 Mapper 接口,极大地简化了开发过程。

    总的来说,MyBatis Plus 是 MyBatis 的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了 MyBatis 的灵活性和强大性能。

    二、在 Spring Boot 项目中集成 MyBatis Plus

    2.1 环境准备

    为了更好的演示 MyBatis Plus 的使用,我首先准备了一个 Spring Boot Demo 示例代码,其中使用了 MyBatis 实现了对一张 User 表的增删改查操作:

    这个 Demo 的结构如下:

    User 表的结构如下:

    并且通过单元测试,使用了对 User 表的增删改查功能的测试:

    以上就会整个 Demo 的结构,下面将使用 MyBatis Plus 来代替 MyBatis,实现对 User 表的增删改查操作。

    2.2 引入 MyBatis Plus 依赖

    MyBatis Plus 提供了 Spring Boot 的自动装配功能starter,并且同时实现了 MyBatis 的相关功能,其 Maven 依赖如下,将其拷贝到 pom,xml文件下即可:

    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <version>3.5.3.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意,由于 MyBatis Plus 同时包含了 MyBatis 的功能,因此以前的 MyBatis 依赖则可以直接删除掉:

    2.3 定义 Mapper

    为了简化对数据库表的增删改查操作,MyBatis Plus 提供了一个基础的BaseMapper接口,其中以及包含了对单表的增删改查操作:

    因此我们自己定义的Mapper只需要继承这个接口,就能够使用这些方法。例如,改造原来的UserMapper

    public interface UserMapper extends BaseMapper<User> {
    }
    
    
    • 1
    • 2
    • 3

    此时,原来UserMapper接口中的方法和 UserMapper.xml中写的SQL语句也都可以不要了:

    2.4 测试 MyBatis Plus 的使用

    最后,我们可以在 UserMapperTest 类中,改造我们的测试方法,将原来增删改查的方法改成从 BaseMapper 中继承过来的方法:

    @SpringBootTest
    class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void testInsert() {
            User user = new User();
            user.setId(6L);
            user.setUsername("Lucy");
            user.setPassword("123");
            user.setPhone("11111111111");
            user.setBalance(200);
            user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
            user.setCreateTime(LocalDateTime.now());
            user.setUpdateTime(LocalDateTime.now());
            // userMapper.saveUser(user);
            userMapper.insert(user);
        }
    
        @Test
        void testSelectById() {
            // User user = userMapper.queryUserById(5L);
            User user = userMapper.selectById(5L);
            System.out.println("user = " + user);
        }
    
    
        @Test
        void testQueryByIds() {
            // List users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));
            List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 4L));
            users.forEach(System.out::println);
        }
    
        @Test
        void testUpdateById() {
            User user = new User();
            user.setId(5L);
            user.setBalance(20000);
            // userMapper.updateUser(user);
            userMapper.updateById(user);
        }
    
        @Test
        void testDeleteUser() {
            // userMapper.deleteUser(5L);
            userMapper.deleteById(5L);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    在上面的代码中,注释掉的语句是原来通过 MyBatis 来实现的,在这些注释代码的下一行则是有 MyBatis Plus 提供的功能。运行这些测试代码,全部顺利通过。至此,是不是觉得 MyBatis Plus 比 MyBatis 好用多了啊。

    三、MyBatis Plus 常用注解

    3.1 为什么需要注解

    在上面的例子中,仅仅是引入了 MyBatis Plus 的依赖,然后在自己的 Mapper 接口中继承了 BaseMapper,就实现了对单表的增删改查操作,那么问题来了:就是 MyBatis Plus 是如何知道对哪张表进行操作的呢?

    通过观察我们自己的 UserMapper 可以发现,继承的 BaseMapper 是一个泛型接口,我们指定了 user 表对应的 POUser,例如:

    此时,泛型中的 User就是与数据库对应的PO类。Mybatis Plus 就是根据 PO 实体的信息来推断出表的信息,从而生成具体的 SQL语句。在默认情况下,MyBatis Plus 会根据 PO 实体进行以下操作:

    • Mybatis Plus 会把 PO 实体的类名按照 驼峰转下划线 的规则将其作为数据库表名;
    • Mybatis Plus 会把 PO 实体的所有变量名按照 驼峰转下划线的规则作为表的字段名,并根据变量类型推断字段类型;
    • Mybatis Plus 会把名为 id 的字段作为该表的主键。

    但是,在很多的实际情况下都与上面默认的情况不符。比如,数据库表以tb_开头、主键名不是id、字段是一些特殊的关键字等等。这些情况在MyBatis中,可以在Mapper.xml文件中进行解决,但是在 Mybatis Plus中就可以使用下面的注解进行解决了。

    3.2 @TableName

    @TableName 注解用于指定数据库表的名称。

    默认情况下,MyBatis Plus 会根据实体类的类名转化为数据库表名,但如果数据库表名与实体类的类名不匹配,就可以使用这个注解来明确指定表名。这对于处理表名以特殊前缀开头(例如tb_)的情况非常有用。

    示例:

    @TableName("user")
    public class User {
        private Long id;
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @TableName 注解除了指定表名以外,还可以指定很多其它属性:

    属性类型必须指定默认值描述
    valuestring“”表名
    schemastring“”schema
    keepGlobalPrefixbooleanfalse是否保持使用全局的 tablePrefix 的值(当全局tablePrefix生效时)
    resultMapstring“”xml 中 resultMap 的 id (用于满足特定类型的实体类对象绑定)
    autoResultMapbooleanfalse是否自动构建resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)
    excludePropertystring[]{}需要排除的属性名 @since 3.3.1

    3.3 @TableId

    @TableId 注解用于指定主键字段。

    默认情况下,MyBatis Plus 会将名为 "id" 的字段作为主键,但如果表的主键字段名称不是 "id",就可以使用这个注解来指定实体类中的主键字段。

    示例:

    @TableName("user")
    public class User {
        @TableId
        private Long id;
        private String name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    @TableId 注解支持两个属性:

    属性类型必须指定默认值描述
    valueString“”表名
    typeEnumIdType.NONE指定主键类型

    IdType支持的类型有:

    描述
    AUTO数据库 ID 自增
    NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
    INPUTinsert 前自行 set 主键值
    ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
    ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)
    ID_WORKER分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)
    UUID32 位 UUID 字符串(please use ASSIGN_UUID)
    ID_WORKER_STR分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)

    这里比较常见的有三种:

    • AUTO:利用数据库的id自增长
    • INPUT:手动生成 id
    • ASSIGN_ID:雪花算法生成 Long 类型的全局唯一 id,这是默认的 ID 策略

    3.4 @TableField

    @TableField 注解用于指定数据库表字段与实体类属性之间的映射关系。

    如果字段名与属性名不匹配,或者需要进行特殊的映射,就可以使用这个注解来定义字段名、是否为主键、是否为插入或更新时的条件等。

    示例:

    @TableName("user")
    public class User {
        @TableId
        private Long id;
        private String name;
        private Integer age;
        @TableField("isMarried")
        private Boolean isMarried;
        @TableField("concat")
        private String concat;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在一般情况下并不需要给字段添加@TableField注解,一些特殊情况除外,例如:

    • 成员变量名与数据库字段名不一致
    • 成员变量是以isXXX命名,按照 JavaBean 的规范,Mybatis Plus 识别字段时会把 is 去除,这就导致与数据库的字段名不符。
    • 成员变量名与数据库一致,但是与数据库的关键字冲突。使用@TableField注解给字段名添加 `` 转义。

    另外,@TableField 注解还支持其他参数:

    属性类型必填默认值描述
    valueString“”数据库字段名
    existbooleantrue是否为数据库表字段
    conditionString“”字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window)
    updateString“”字段 update set 部分注入,例如:当在version字段上注解update=“%s+1” 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)
    insertStrategyEnumFieldStrategy.DEFAULT举例:NOT_NULL insert into table_a(column) values (#{columnProperty})
    updateStrategyEnumFieldStrategy.DEFAULT举例:IGNORED update table_a set column=#{columnProperty}
    whereStrategyEnumFieldStrategy.DEFAULT举例:NOT_EMPTY where column=#{columnProperty}
    fillEnumFieldFill.DEFAULT字段自动填充策略
    selectbooleantrue是否进行 select 查询
    keepGlobalFormatbooleanfalse是否保持使用全局的 format 进行处理
    jdbcTypeJdbcTypeJdbcType.UNDEFINEDJDBC 类型 (该默认值不代表会按照该值生效)
    typeHandlerTypeHander类型处理器 (该默认值不代表会按照该值生效)
    numericScaleString“”指定小数点后保留的位数

    四、MyBatis Plus 常见配置

    MyBatis Plus 同样支持使用 yaml 格式的配置,关于 MyBatis Plus 的配置可以从起官网中进行了解:使用配置

    下面是关于 MyBatis Plus 的常用配置:

    mybatis-plus:
      type-aliases-package: com.demo.mp.domain.po # 别名扫描包
      mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值
      global-config:
        db-config:
          id-type: auto # 指定 id 的生成方式
      configuration:
        map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射
        cache-enabled: false # 是否开启二级缓存
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    对上述配置的说明:

    • 因为 MyBatis Plus 支持 MyBatis ,因此在 MyBatis Plus 中也支持手写 SQL形式的 Mapper 映射。因为 mapper 文件的读取地址可以由我们自己配置。
    • id-type:可指定在默认情况下 id 的生成方式,比如 auto、 assign_id 等。
    • map-underscore-to-camel-case:开启下划线和驼峰的命名规则直接的映射转换。
    • cache-enabled:是否开启二级缓存。
  • 相关阅读:
    socket通信原理?10分钟掌握python socket实现邮件客户端吧!
    C语言中编译时出现警告C4013(C语言不加函数原型产生的潜在错误)
    【声呐仿真】学习记录1.5-使用docker配置dave(先看这个!)、解决一些问题
    aspose导出word转pdf并加水印
    MOS管特性及其几种常用驱动电路详解,电子工程师手把手教你
    MySQL高级学习笔记
    前端——HTML基础
    数据库习题
    C++高级功能笔记
    vue虚拟dom和diff算法
  • 原文地址:https://blog.csdn.net/qq_61635026/article/details/134057779