MyBatis-Plus:(简称MP),是
Mybatis
的增强工具,在MyBatis
的基础上只做了增强,不做改变。为简化开发、提高效率而生
一、SpringBoot集成MP
1、创建数据库,并插入数据
-- 创建一张用户表
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` varchar(255) DEFAULT NULL COMMENT '用户姓名',
`user_age` int DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
-- 插入数据
INSERT INTO user(user_name, user_age) VALUES ('test_user_01', 20);
INSERT INTO user(user_name, user_age) VALUES ('test_user_02', 21);
INSERT INTO user(user_name, user_age) VALUES ('test_user_03', 22);
INSERT INTO user(user_name, user_age) VALUES ('test_user_04', 23);
2、新建SpringBoot项目
3、加入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--springboot使用这个版本-->
<version>2.2.1.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.xyh</groupId>
<artifactId>mybatisplus</artifactId>
<version>1.0.0</version>
<name>mybatisplus</name>
<properties>
<java.version>1.8</java.version>
<!--指定mybatis-plus版本-->
<mybatis-plus-versoin>3.3.1</mybatis-plus-versoin>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-versoin}</version>
</dependency>
<!--mysql驱动:其他版本的springboot,这里引入的依赖可能不同-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4、配置数据库信息
在
application.properties
中添加数据库配置。
根据jdbc
驱动的不同,需要配置不同的数据库链接配置
SpringBoot2.0之前默认集成jdbc5驱动;SpringBoot2.1之后默认集成jdbc8驱动
jdbc5驱动:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp-test
spring.datasource.username=root
spring.datasource.password=123456
jdbc8驱动:
driver-class-name
需要使用com.mysql.cj.jdbc.Driver
url
中需要指定时区serverTimeZone=GMT%2b8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp-test?serverTimeZone=GMT%2b8
spring.datasource.username=root
spring.datasource.password=123456
5、编写代码
创建实体类包,并新建User实体类
在com.xyh.mybatisplus
包下,新建entity
实体类包,并新建UserEntity
对象
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
private Long id;
private String userName;
private String userAge;
}
创建mapper包,并新建UserMapper接口
在com.xyh.mybatisplus
包下,新建mapper
包,并新建UserMapper
对象
@Repository//将Dao层的实现类标识为Spring容器中的组件
public interface UserMapper extends BaseMapper<UserEntity> {
}
在启动类上添加注释
在启动类上,添加@MapperScan("com.xyh.mybatisplus.mapper")
注解
@SpringBootApplication
//指定要扫描的Mapper接口所在的包名,让MyBatis自动创建Mapper接口的实现类。
@MapperScan("com.xyh.mybatisplus.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置sql输出日志
在application.properties
中添加sql输出日志配置。
#mybatis输出sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
6、测试
编写测试类,查询数据库中所有数据,用于测试上述步骤是否已经成功。
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
@Test
public void testSelectAll(){
//查询所有的user数据
List<UserEntity> userList = userMapper.selectList(null);
//输出
System.out.println(userList);
}
}
二、扩展
1、主键策略
AUTO
:自增、NONE
:默认、INPUT
:自己输入、ASSIGN_ID
: 雪花id、ASSIGN_UUID
: UUID
配置方式:
- 实体类中使用注解指定:
@TableId(type = IdType.AUTO)
- 在application.properties中全局配置:
mybatis-plus.global-config.db-config.id-type=auto
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
//设置主键策略为 AUTO--自增
@TableId(type = IdType.AUTO)
private Long id;
private String userName;
private String userAge;
}
测试插入
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
UserEntity user = new UserEntity();
user.setUserName("test_user_insert_01");
user.setUserAge(10);
int insert = userMapper.insert(user);
System.out.println("插入成功条数:" + insert);
}
}
2、自动填充
一般的数据表中,都会记录create_time(创建时间)、和update_time(更新时间),用于记录数据的变化情况
a、表中添加两个字段
alter table `user` add column `create_time` datetime COMMENT '创建时间';
alter table `user` add column `update_time` datetime COMMENT '更新时间';
b、实体类中添加数据,并添加注解
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
//设置主键策略为 AUTO--自增
@TableId(type = IdType.AUTO)
private Long id;
private String userName;
private Integer userAge;
//创建时间
@TableField(fill = FieldFill.INSERT)//插入的时候自动填充
private Date createTime;
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)//插入或更新的时候自动填充
private Date updateTime;
}
c、创建MyMetaObjectHandler
在com.xyh.mybatisplus
包下,新建handler
包,并新建MyMetaObjectHandler
对象,实现MetaObjectHandler
接口
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入的时候,自动填充的数据
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
/**
* 更新的时候,自动填充的数据
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
测试插入
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
@Test
public void testInsertWithFill(){
UserEntity user = new UserEntity();
user.setUserName("test_user_insert_02");
user.setUserAge(10);
int insert = userMapper.insert(user);
System.out.println("插入成功条数:" + insert);
}
}
测试更新
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
@Test
public void testUpdateWithFill(){
UserEntity user = new UserEntity();
user.setId(7L);
user.setUserAge(11);
int update = userMapper.updateById(user);
System.out.println("更新成功条数:" + update);
}
}
3、分页查询
a、配置分页插件
在com.xyh.mybatisplus
包下,新建config
包,并新建MyBatisPlusConfig
对象。添加PaginationInterceptor
的bean
/**
* Created by: xuyuhang
* Created time: 2023/5/20 21:21
* Description: mybatis-plus配置
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 分页配置
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
b、测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
@Test
public void testSelectPage(){
//创建Page对象,并传入两个参数:pageNum--当前页,pageSize--页记录数
Page<UserEntity> page = new Page<>(1,3);
Page<UserEntity> userPage = userMapper.selectPage(page, null);
System.out.println("总页数:" + userPage.getPages());
System.out.println("当前页:" + userPage.getCurrent());
System.out.println("查询数据集合" + userPage.getRecords());
System.out.println("总记录数:" + userPage.getTotal());
System.out.println("是否存在下一页:" + userPage.hasNext());
System.out.println("是否存在上一页:" + userPage.hasPrevious());
}
}
4、逻辑删除
- 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条数据
- 逻辑删除:假删除,将对应数据中代表删除的字段,修改为"已删除状态",之后数据库中依旧可以查询到此条数据
a、数据库中添加字段
-- 插入deleted字段,历史数据默认为 0 :未删除
alter table `user` add column `deleted` boolean default 0 COMMENT '删除标志,0:未删除,1:已删除';
b、实体类中添加属性
@Data//使用lombok自动添加get、set方法
@TableName("user")//如果表名和类名不一致,需要指定表名
public class UserEntity {
//设置主键策略为 AUTO--自增
@TableId(type = IdType.AUTO)
private Long id;
private String userName;
private Integer userAge;
//创建时间
@TableField(fill = FieldFill.INSERT)//插入的时候自动填充
private Date createTime;
//更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)//插入或更新的时候自动填充
private Date updateTime;
//删除标志,0:未删除,1:已删除
@TableLogic
private Integer deleted;
}
c、添加配置
#如果配置值=默认值,下面配置可以省略
#删除的value值(默认:1)
mybatis-plus.global-config.db-config.logic-delete-value=1
#未删除的value值(默认:0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
测试使用
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
/**
* 测试逻辑删除
* 注:历史共6条数据,默认都为未删除
*/
@Test
public void testLogicDelete(){
//删除一条数据
userMapper.deleteById(7);
//查询共有几条数据
List<UserEntity> userList = userMapper.selectList(null);
System.out.println(userList);
}
}
三、条件构造器(Wrapper)
1、ge、gt、le、lt、isNull、isNotNull
符号 | 含义 | sql中表示 |
---|---|---|
ge | 大于等于 | >= |
gt | 大于 | > |
le | 小于等于 | <= |
lt | 小于 | < |
isNull | 为null | is null |
isNotNull | 不为null | is not null |
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
/**
* 测试QueryWrapper中的 ge 操作
*/
@Test
public void testQueryWrapper_ge(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 gt 操作
*/
@Test
public void testQueryWrapper_gt(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 le 操作
*/
@Test
public void testQueryWrapper_le(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.le("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 lt 操作
*/
@Test
public void testQueryWrapper_lt(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 isNull 操作
*/
@Test
public void testQueryWrapper_isNull(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("create_time");
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 isNotNull 操作
*/
@Test
public void testQueryWrapper_isNotNull(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.isNotNull("create_time");
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
}
2、eq、ne
符号 | 含义 | sql中表示 |
---|---|---|
eq | 等于 | = |
ne | 不等于 | != 或 <> |
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
/**
* 测试QueryWrapper中的 eq 操作
*/
@Test
public void testQueryWrapper_eq(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 ne 操作
*/
@Test
public void testQueryWrapper_ne(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.ne("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
}
3、between、notBetween
符号 | 含义 | sql中表示 |
---|---|---|
between | 区间 | BETWEEN ? AND ? |
notBetween | 区间 | NOT BETWEEN ? AND ? |
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
/**
* 测试QueryWrapper中的 between 操作
*/
@Test
public void testQueryWrapper_between(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.between("user_age", 12, 30);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 between 操作
*/
@Test
public void testQueryWrapper_notBetween(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.notBetween("user_age", 12, 30);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
}
4、like、notLike、likeLeft、likeRight
符号 | 含义 | sql中表示 |
---|---|---|
like | 模糊查询 | like ‘%condition%’ |
notLike | 模糊查询 | not like ‘%condition%’ |
likeLeft | 模糊查询 | like ‘%condition’ |
likeRight | 模糊查询 | like ‘condition%’ |
@RunWith(SpringRunner.class)
@SpringBootTest
public class WrapperTest {
//引入UserMapper
@Autowired
private UserMapper userMapper;
/**
* 测试QueryWrapper中的 like 操作
*/
@Test
public void testQueryWrapper_like(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 notLike 操作
*/
@Test
public void testQueryWrapper_notLike(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.notLike("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 likeLeft 操作
*/
@Test
public void testQueryWrapper_likeLeft(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.likeLeft("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
/**
* 测试QueryWrapper中的 likeRight 操作
*/
@Test
public void testQueryWrapper_likeRight(){
QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.likeRight("user_age", 12);
Integer selectCount = userMapper.selectCount(queryWrapper);
System.out.println("共有"+ selectCount + "条数据符合查询条件");
}
}