MyBatis-Plus-(二)MyBatis-Plus操作数据库

本文最后更新于:February 19, 2022 pm

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。支持任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库。

目录

主键策略

1
2
@TableId(type = IdType.AUTO)
private Long id;

其中,不同的策略:

1
2
3
4
5
6
7
8
public enum IdType {
AUTO(0), //自增,使用时数据库中必须设置为自增
NONE(1), //未设置主键
INPUT(2), //手动输入
ASSIGN_ID(3), //雪花算法生成主键
ASSIGN_UUID(4); //指定主键为不含中划线的UUID
}

插入

1
int insert = userMapper.insert(User user);

更新

1
2
3
4
5
6
7
@Test
void upda() {
User user = new User();
user.setId(3L);
user.setAge(23);
int i = userMapper.updateById(user); //传入一个有id的对象,会将数据库中的数据修改为此对象对应的值。也可以使用update()方法,但此方法需要提供一个条件查询器。
}

此方法,没有传入的值不会进行修改。(自动拼接动态SQL)

自动填充

方式一

数据库修改。给字段添加自动更新。

方式二

用代码实现。需要先删除对应字段的默认值、自动更新。

方法

步骤:

  1. 给实体类对应字段添加注解。
  2. 编写处理器。

给实体类对应字段添加注解。

给实体类添加注解。

1
2
3
4
@TableField(fill = FieldFill.UPDATE) //在更新时填充
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) //在插入和更新时填充
private Date inTime;

其他值:

1
2
3
4
5
6
public enum FieldFill {
DEFAULT, //不处理
INSERT, //插入
UPDATE, //更新
INSERT_UPDATE; //插入和更新
}

编写处理器。

处理器的编写看你用了哪一种策略,如果是插入时就编写插入的处理;如果是更新时就编写更新时的处理。在上面的实体类中,使用了插入和更新,所有需要变成这两个的处理策略。

createTime是更新时,inTime是插入和更新时。

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
package com.tothefor.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

//插入时的策略
@Override
public void insertFill(MetaObject metaObject) {
//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("inTime",new Date(),metaObject);

}

//更新时的策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("inTime",new Date(),metaObject);
this.setFieldValByName("createTime",new Date(),metaObject);

}
}

在插入或者更新时,对应的字段会更新。对应时间格式,会自动填充。所以不用担心Java时间和MySQL时间的格式问题。

查询

1
2
3
4
5
userMapper.selectById(); //查询id
userMapper.selectList(); //查询全部
userMapper.selectBatchIds(); //批量查询
userMapper.selectByMap(); //条件查询,key为字段,value为待查的值
....

分页查询

  1. 配置插件类。
  2. 使用。

插件配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.tothefor.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@MapperScan("com.tothefor.mapper")
@Configuration
public class MyPageHelper {

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
void page() {
Page<User> page = new Page<>(3,2);
userMapper.selectPage(page, null);

List<User> records = page.getRecords(); //当前页的数据
records.forEach(it -> System.out.println(it));

System.out.println(page.getPages()); //总页数
System.out.println(page.getTotal()); //总个数
System.out.println(page.getRecords().size()); //当前页的个数,非最后一页时等同于页大小
System.out.println(page.getCurrent()); //当前页是第几页
System.out.println(page.getSize()); //页大小

}

删除

1
2
3
4
5
6
7
@Test
void del() {
userMapper.delete(); //使用条件查询器删除
userMapper.deleteBatchIds(); //根据id批量删除
userMapper.deleteById(); //根据id删除
userMapper.deleteByMap(); //条件查询,key为字段名称,value为条件值
}

逻辑删除

官方文档

需要添加一个判断是否删除的字段(如:is_delete)。

步骤:

  1. 数据库添加字段。
  2. 修改实体类,添加注解@TableLogic。
  3. 写配置。
1
2
@TableLogic
private boolean isDelete;

配置:

1
2
3
4
5
6
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDelete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置实体类中的注解)
logic-delete-value: true # 逻辑已删除值(默认为 1)
logic-not-delete-value: false # 逻辑未删除值(默认为 0)

使用同删除方法一样使用。