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

文章目录

  • [一、初识 MyBatis Plus](#一、初识 MyBatis Plus)
    • [1.1 MyBatis Plus 是什么](#1.1 MyBatis Plus 是什么)
    • [1.2 MyBatis Plus 和 MyBatis 的区别](#1.2 MyBatis Plus 和 MyBatis 的区别)
  • [二、在 Spring Boot 项目中集成 MyBatis Plus](#二、在 Spring Boot 项目中集成 MyBatis Plus)
    • [2.1 环境准备](#2.1 环境准备)
    • [2.2 引入 MyBatis Plus 依赖](#2.2 引入 MyBatis Plus 依赖)
    • [2.3 定义 Mapper](#2.3 定义 Mapper)
    • [2.4 测试 MyBatis Plus 的使用](#2.4 测试 MyBatis Plus 的使用)
  • [三、MyBatis Plus 常用注解](#三、MyBatis Plus 常用注解)
    • [3.1 为什么需要注解](#3.1 为什么需要注解)
    • [3.2 @TableName](#3.2 @TableName)
    • [3.3 @TableId](#3.3 @TableId)
    • [3.4 @TableField](#3.4 @TableField)
  • [四、MyBatis Plus 常见配置](#四、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文件下即可:

xml 复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

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

2.3 定义 Mapper

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

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

java 复制代码
public interface UserMapper extends BaseMapper<User> {
}

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

2.4 测试 MyBatis Plus 的使用

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

java 复制代码
@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<User> 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);
    }
}

在上面的代码中,注释掉的语句是原来通过 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_)的情况非常有用。

示例:

java 复制代码
@TableName("user")
public class User {
    private Long id;
    private String name;
}

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

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

3.3 @TableId

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

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

示例:

java 复制代码
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
}

@TableId 注解支持两个属性:

属性 类型 必须指定 默认值 描述
value String "" 表名
type Enum IdType.NONE 指定主键类型

IdType支持的类型有:

描述
AUTO 数据库 ID 自增
NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert 前自行 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)
UUID 32 位 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 注解用于指定数据库表字段与实体类属性之间的映射关系。

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

示例:

java 复制代码
@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;
}

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

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

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

属性 类型 必填 默认值 描述
value String "" 数据库字段名
exist boolean true 是否为数据库表字段
condition String "" 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window)
update String "" 字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)
insertStrategy Enum FieldStrategy.DEFAULT 举例:NOT_NULL insert into table_a(column) values (#{columnProperty})
updateStrategy Enum FieldStrategy.DEFAULT 举例:IGNORED update table_a set column=#{columnProperty}
whereStrategy Enum FieldStrategy.DEFAULT 举例:NOT_EMPTY where column=#{columnProperty}
fill Enum FieldFill.DEFAULT 字段自动填充策略
select boolean true 是否进行 select 查询
keepGlobalFormat boolean false 是否保持使用全局的 format 进行处理
jdbcType JdbcType JdbcType.UNDEFINED JDBC 类型 (该默认值不代表会按照该值生效)
typeHandler TypeHander 类型处理器 (该默认值不代表会按照该值生效)
numericScale String "" 指定小数点后保留的位数

四、MyBatis Plus 常见配置

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

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

yml 复制代码
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 # 是否开启二级缓存

对上述配置的说明:

  • 因为 MyBatis Plus 支持 MyBatis ,因此在 MyBatis Plus 中也支持手写 SQL形式的 Mapper 映射。因为 mapper 文件的读取地址可以由我们自己配置。
  • id-type:可指定在默认情况下 id 的生成方式,比如 auto、 assign_id 等。
  • map-underscore-to-camel-case:开启下划线和驼峰的命名规则直接的映射转换。
  • cache-enabled:是否开启二级缓存。
相关推荐
天幕繁星13 天前
JSqlParser、JavaCC实操
mybatis·mybatis plus·jsqlparser·javacc
孤蓬&听雨8 个月前
MyBatis和MyBatis Plus比较详解
java·mybatis·mybatis plus·持久层
鱼鱼大头鱼8 个月前
1. 使用MyBatis的ResultHandler实现流式查询,避免大数据量一次加载
mybatis·mybatis plus·resulthandler·mybatis流式查询·流式查询
厂里英才9 个月前
Mybatis plus批量插入的优化
java·spring boot·后端·mybatis plus
青石路9 个月前
都说了能不动就别动,非要去调整,出生产事故了吧 → 补充
mybatis·mybatis plus·druid·hikari
strggle_bin1 年前
使用Mybatis-plus分页查询的Total与实际条数不对应
mybatis plus
Joseph 乔1 年前
【MyBatis-Plus】多数据源分页配置(低版本暂时就支持一种(可选),高版本多支持)
mybatis plus
求知.1 年前
【MyBatis Plus】深入探索 MyBatis Plus 的条件构造器,自定义 SQL语句,Service 接口的实现
mybatis plus