前言
MyBatis大家肯定都有所了解,那今天要讲的这个MyBatisPlus是什么呢?顾名思义,plus就是更强、更NB的意思,那有同学就要问了,我项目好好的,干嘛要用的这个。那回答来了,首先MyBatisPlus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,内置基本常用的CRUD方法,支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,内置分页插件等。有兴趣的可以去MP官网查看详细文档-MyBatisPlus。
闲话不说了,开始集成。
一、数据表创建
DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user
(
id BIGINT (20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT (11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
`create_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (id)
);
INSERT INTO t_user (id,`name`,age,email)
VALUE
(1,'test1',20,'test1@mp.com'),
(2,'test2',23,'test2@mp.com')
二、MP配置
1、引入依赖
在pom文件中引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2、配置application
spring:
profiles:
active: dev
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
username: root
password: root
#日志输出
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、添加业务代码
实体类
@Data
@TableName("t_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
mapper接口
@Repository
public interface UserMapper extends BaseMapper<User> {
}
注意!! 需要在启动类上去扫描我们的mapper包下的所有接口 @MapperScan(" com.springboot.mp.mapper") 根据你自己项目的mapper实际位置
4、测试
测试类
@RunWith(SpringRunner.class)
@SpringBootTest()
public class MpApplicationTests {
@Autowired
UserMapper userMapper;
@Test
public void list() {
List<User> users = userMapper.selectList(null);
users.stream().forEach(item-> System.out.println(item.toString()));
}
}
测试结果
三、扩展
1、字段自动填充
创建时间、修改时间这两个字段操作肯定都应该自动化完成。
(1) 在之前创建的User类中添加
@TableField(fill = FieldFill.INSERT)
private Data createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Data updateTime;
(2) 创建MpMetaObjectHandler类
@Slf4j
@Component
public class MpMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
try {
//根据属性名字设置要填充的值
if (metaObject.hasGetter("createTime")) {
this.setFieldValByName("createTime", new Date(), metaObject);
}
if (metaObject.hasGetter("updateTime")) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
} catch (Exception e) {
log.warn("自动注入异常");
}
updateFill(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
try {
if (metaObject.hasGetter("updateTime")) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
} catch (Exception e) {
log.warn("自动注入异常");
}
}
}
(3) 测试
在刚才的测试类中新建添加的测试方法
@Test
public void insert() {
User user = new User();
user.setId(5L);
user.setName("test3");
user.setAge(26);
user.setEmail("test3@mp.com");
userMapper.insert(user);
}
运行结果
查看数据库发现新增的数据创建时间、修改时间已自动注入
2、条件构造器
MP内置了很多CRUD方法,但是如果这些方法都不满足你业务需求该什么办呢?来看看MP条件构造器吧。
测试方法
@Test
public void getUserByAge(){
List<User> users = userMapper.selectList(new QueryWrapper<User>().lambda().eq(User::getAge, 26));
users.stream().forEach(item-> System.out.println(item.toString()));
}
结果
可以看到已经查到了我们想要的结果,还有很多条件构造器,我就不一一演示了,有兴趣可以去官网查看。
3、分页插件
(1) 编写MP配置类
@Configuration
// 指定要扫描的Mapper类的包的路径
@MapperScan("com.springboot.mp.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置数据库类型为mysql
paginationInnerInterceptor.setDbType(DbType.MYSQL);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}
}
(2) 编写UserMapper,新增page方法
IPage<User> page(Page<User> page);
(3) 编写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.springboot.mp.mapper.UserMapper">
<select id="page" resultType="com.springboot.mp.domain.User">
select * from user
</select>
</mapper>
(4) 测试
测试类
@Test
public void list() {
Page<User> page = new Page<>(1, 1);// 页数,每页条数
IPage<User> iPage = userMapper.page(page);
System.out.println(iPage);
System.out.println("总页数:" + iPage.getPages());
System.out.println("总记录数:" + iPage.getTotal());
}
结果
到此为止,MP集成配置基本就完事了。其实MP还有很多可以扩展的地方,比如逻辑删除、通用枚举、乐观锁等,有兴趣大家可以去了解一下,或者评论下对那个感兴趣,我这边有时间可以更新一下内容。