MyBatisPlus介绍
从名字中就可以感觉到MybatisPlus与MyBatis之间的渊源,而MyBatis是一个非常流行的持久层框架,主要来做数据库的增删改查,而MyBatisPlus这种命名方式让人不得不往MyBatis的升级版去联想,事实也确实如此,MyBatisPlus就是对MyBatis框架的增强与升级,但MyBatisPlus并不是来替代MyBatis的,MyBatisPlus的官网logo是一只蓝色的小鸟,MyBatis官网的logo是一只红色的小鸟,并且在MyBatisPlus官网下的标语就是 **MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。**因此两者是一种合作的关系。
而且两者搭配使用,可以翻倍提高开发效率。因此MybatisPlus也成为了企业开发的必备工具。
那么MyBatisPlus是如何对MyBatis进行增强的呢?
我们可以从MyBatisPlus的官网文档入手

在实际开发中,书写的大多数SQL语句都是单表得CRUD,花费时间最多的就是单表CRUD的代码编写上,而这些功能往往都是比较重复的,比较基础的,比较浪费时间,而MyBatisPlus就帮助开发者干了一件事情:只需要简单配置,设置不用配置,约定大于配置,那么MyBatisPlus就可以帮助开发者实现单表的CRUD的操作,,开发者只需要直接调用对应的方法就能实现对应的功能,这样就节省了开发中大量去编写单表CRUD的时间,开发效率也会随之水涨船高,这就是MyBatisPlus最重要的功能。
但是MyBatisPlus不仅仅帮我们实现了单表CRUD功能,还有一些拓展功能,比如,代码生成,自动分,逻辑删除等等。
官方文档:简介 | MyBatis-Plus
官方文档主要分为四大部分:
-
快速入门:快速了解MyBatisPlus的基本特性。
-
核心功能:以后再开发中写的最多的代码
-
拓展:拓展的一些高级功能
-
插件:一些插件功能,比如分页插件,乐观锁插件等等
快速入门
快速开始
入门案例:
需求:基于项目,实现下列功能
-
新增用户功能
-
根据ID查询用户
-
根据ID批量查询用户
-
根据ID更新用户
-
根据ID删除用户
以前的MyBatis冗余代码:
java
<?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.lyc.mybatisplusdemo.mapper.UserMapper">
<insert id="saveUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">
insert into `user` (`id`,`username`,`password`,`phone`,`info`,`status`,`balance`)
values (#{id},#{username},#{password},#{phone},#{info},#{status},#{balance})
</insert>
<update id="updateUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">
update `user`
<set>
<if test="username != null">
username = #{username},
</if>
<if test="password != null">
password = #{password},
</if>
<if test="phone != null">
phone = #{phone},
</if>
<if test="info != null">
info = #{info},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="balance != null">
balance = #{balance},
</if>
</set>
where id = #{id}
</update>
<delete id="deleteUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">
delete from `user` where id = #{id}
</delete>
<select id="getUserById" resultType="com.lyc.mybatisplusdemo.pojo.User">
select * from `user` where id = #{id}
</select>
<select id="getUserByIds" resultType="com.lyc.mybatisplusdemo.pojo.User">
select * from `user`
<if test="ids != null">
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
limit 10
</select>
</mapper>
虽然逻辑很简单,就是一些单表的增删改查的语句,浪费了大量的时间,导致开发效率受到了影响,而如果使用MyBatisPlus,这些单表查询语句都不需要书写了,
如何使用MyBatisPlus?
步骤:
- 引入MyBatisPlus的起步依赖
MyBatisPlus官方提供了Starter,其中集成了MyBatis和MyBatisPlus的所有功能,并且实现了自动装配的效果。
因此我们可以使用MyBatisPlus的starter代替MyBatis的starter:
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.12</version>
</dependency>
- 自定义Mapper
自定义的Mapper集成MyBatisPlus提供的BaseMapper接口:
因为BaseMapper中已经提前定义好了大量的增删改查的方法,而且命名方式简单明了。
那么我们就可以继承BaseMapper,从而调用这些方法。
java
public interface UserMapper extends BaseMapper<User> {
}
注意事项:在继承BaseMapper接口时,需要将泛型的类型换成实体类的类型。
测试代码:
java
package com.lyc.mybatisplusdemo.mapper;
import com.lyc.mybatisplusdemo.pojo.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class UserMapperTest {
@Resource
private UserMapper userMapper;
@Test
void testInsert(){
User user = new User();
user.setId(5L);
user.setUsername("lyc");
user.setPassword("123456");
user.setPhone("12345678901");
user.setBalance(200);
user.setInfo("{\"age\":24,\"intro\":\"英文老师\",\"gender\":\"female\"}");
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userMapper.saveUser(user);
}
@Test
void testSelectById(){
User user = userMapper.getUserById(5L);
System.out.println("user = "+user);
}
@Test
void testSelectByIds(){
List<User> users = userMapper.getUserByIds(List.of(1L,2L,3L,4L,5L));
users.forEach(System.out::println);
}
@Test
void testUpdateById(){
User user = new User();
user.setId(5L);
user.setBalance(20000);
userMapper.updateUser(user);
}
}
因为MyBatisPlus是对MyBatis的增强,因此即使我们将依赖替换成MyBatisPlus,开始在Mapper.xml中的文件依然可以使用。
进行测试:

而使用MyBatisPlus无需再书写SQL语句以及声明方法了。
将这些都删除。
在修改测试单元代码,直接调用父类BaseMapper中的方法即可
java
package com.lyc.mybatisplusdemo.mapper;
import com.lyc.mybatisplusdemo.pojo.User;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class UserMapperTest {
@Resource
private UserMapper userMapper;
@Test
void testInsert(){
User user = new User();
user.setId(5L);
user.setUsername("lyc");
user.setPassword("123456");
user.setPhone("12345678901");
user.setBalance(200);
user.setInfo("{\"age\":24,\"intro\":\"英文老师\",\"gender\":\"female\"}");
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userMapper.insert(user);
}
@Test
void testSelectById(){
User user = userMapper.selectById(5L);
System.out.println("user = "+user);
}
@Test
void testSelectByIds(){
List<User> users = userMapper.selectBatchIds(List.of(1L,2L,3L));
users.forEach(System.out::println);
}
@Test
void testUpdateById(){
User user = new User();
user.setId(5L);
user.setBalance(20000);
userMapper.updateById(user);
}
@Test
void testDeleteById(){
userMapper.deleteById(5L);
}
}
再次进行测试:

测试成功。
查询数据库看是否插入数据

测试成功。
总结:
使用MyBatisPlus的基本步骤:
-
使用MyBatisPlus依赖,代替MyBatis依赖
-
定义Mapper接口并继承BaseMaper
MyBatisPlus确实做到了对Mybatis的无侵入:润物无声
常见注解
MyBatisPlus是如何获取数据库信息的呢?
原因:MyBatisPlus通过扫描实体类,并给予反射获取实体类信息作为数据库表信息。
在前面的入门案例中,在继承BaseMapper类后需要指定泛型,就是对应的实体类的类型,而MyBatisPlus就可以基于反射拿到实体类类型,拿到实体类类型就可以基于反射拿到对应的class对象,即对应字节码,拿到对应字节码就可以拿到实体类信息,就基于实体类信息作为数据库表信息。
为了拿到准确的数据表信息,MyBatisPlus有一系列的约定。
-
类名驼峰转下划线作为表名
-
名为id的字段作为主键
-
变量名驼峰转下划线作为表的字段名
如果实体类不符合约定,就必须自己去定义表明主键名,以及字段名。
如何自定义呢?MyBatisPlus为我们提供了注解来帮助我们自定义设置。
常用注解:
-
@TableName:用来指定表名
-
@Tabled:用来指定表中的主键字段信息
-
@TableField:用来指定表中的普通字段信息
如果实体类和表的对应关系不符合MyBatisPlus的约定,就可以使用这些注解声明。
注意事项:
我们在使用MyBatisPlus,一定要保证自己的实体类以及表中有一个名为id的字段(如果实体类中主键不为ID,那么也要使用注解@Tabled("id")),要使MyBatisPlus找到主键。
在数据库中的主键可以添加约束,比如 Auto_increment(自增),而在实体类中我们可以使用@Tabled(value="id",type = "IdType.AUTO")等等,
IdType枚举:
-
Auto:数据库自增长(数据库自己生成)
-
INPUT:通过set方法自行输入(由调用者填入)
-
ASSIGN_ID:分配id,基于接口IdentiterGenertaor的方法nextld()来生成id(我们也可以重写方法来覆盖原来的方法),默认实现类为DefaultIdentifiterGenerator,它内部自带一种雪花算法来帮助我们生成id,生成的是一个Long型的整数,长度为20位。(由MyBatisPlus帮助生成ID)
使用@TableField的常见场景
-
成员变量名与数据库字段名不一致
-
成员名以is开头,且类型为布尔值的字段,MyBatisPlus会基于反射类型的机制去获取字段名称,会将is减去作为变量名,变量名驼峰转下划线作为表的字段名便不起作用了,这时可能就与数据库中的字段名不一致。这种就需要去使用@TableField。
-
成员变量名与数据库关键字冲突,这时我们需要使用转义字符,例如
@TableField("`order`")
- 成员变量不是数据库字段,这时就需要使用**
@TableField(exist = false)
**
更多详情在官方文档中查看:注解配置 | MyBatis-Plus
案例展示:
java
@TableName("tb_user")
public class User {
//用户ID
//主键自增
@TableId(type = IdType.AUTO)
private Long id;
//用户名
@TableField("`username`")
private String username;
//密码
@TableField(exist = false)
private String password;
//注册手机号
private String phone;
//详细信息
private String info;
//使用状态(1正常2冻结)
private Integer status;
//账户余额
private Integer balance;
//创建时间
private LocalDateTime createTime;
//更新时间
private LocalDateTime updateTime;

使用 @TableId(type = IdType.AUTO)就可以使id自增,但是如果不设置type,那默认策略是什么呢?
进行测试:
将测试单元中的setId()省略,以及实体类的 @TableId(type = IdType.AUTO)注解省略,再次进行测试:
测试成功,检查数据库
发现id值为long型,有20位,证明使用的是MybatisPlus中的雪花算法

证明默认使用的策略就是ASSIGN_ID(雪花算法)。
常见配置
在前面我们只是导入了MyBatisPlus的起步依赖,就可以自动装配,无需配置就可直接使用,十分方便,但是MyBatisPlus也是支持一些自定义配置的,那么MyBatisPlus支持哪些常见的配置呢?
MyBatisPlus的配置项继承了MyBatis原生配置和自己特有的配置。例如:
java
mybatis-plus:
type-aliases-package: com.lyc.mp.pojo # 别名扫描包
mapper-locations: "classpath*:mapper/**/*.xml" # 扫描mapper.xml文件
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名与下划线命名的映射
cache-enabled: false # 是否开启二级缓存
global-config: # 全局配置
db-config: # 数据库配置
id-type: assign_id # 主键策略 雪花算法
update-strategy: not_null # 更新策略 只更新非空字段
第一个: type-aliases-package
:类型别名的扫描包,需要指定对应的实体类的包,就会扫描实体类
作用:将来在定义Mapper.xml文件中的语句时,如果需要定义实体类的类型,就不需要写全路径名,直接写类的简化名即可。
第二个: mapper-locations
:mapper.xml文件的地址,可以扫描到指定包下的Mapper.xml文件。(MyBatisPlus更擅长单表查询,如果业务的SQL语句过于复杂或多表查询,就不建议使用MyBatisPlus,还是建议写Mapper.xml文件)
第三个: map-underscore-to-camel-case: true
:开启驼峰命名与下划线命名的映射,开启后实体类与数据库中的字段名就会自动转换格式
第四个:cache-enabled: false
:是否开启二级缓存
第五个:id-type
:在前面学习的注解@TableId中的type中的默认配置,在配置文件中是全局配置,优先级没有注解高,如果注解配的是主键自增,那么是以注解内容为准,如果注解没有配置,则以配置类中的配置为准。
第六个:update-strategy
: 更新策略,我们在前面中学习的MyBatisPlus只更新实体类中存在的字段,实体类中没有而数据库中存在的字段并不更新,这就是更新策略,上述讲的这种策略就是只更新非空字段。
以上的配置大多数都是有默认值的,几乎都不需要配置,除非要自定义修改。
如果要进行自定义修改时记不清配置名,有两种方法:
-
查询官网:配置 | MyBatis-Plus
-
根据集成工具代码提示及补全,因此只需要记忆一小部分即可,无需全部记忆
总结:
MyBatisPlus的基本使用流程:
-
引入起步依赖
-
自定义Mapper接口继承BaseMapper接口
-
在实体类添加注解声明表信息
-
在application.yml根据需要添加配置。
以上就是MyBatisPlus的快速入门,希望对大家有所帮助!