Mybatis-plus基础
1.引入依赖
必要依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--引入mybatis自动配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
<version>2.1.1</version>
</dependency>
多数据源扩展依赖:
<!-- mybatis-plus 多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
测试依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-test</artifactId>
<version>3.5.3.1</version>
</dependency>
2.配置和启动
mybatis-plus:
type-aliases-package: com.ruoyi.**.domain
mapper-locations: classpath*:mapper/**/*Mapper.xml
#plus多数据源配置
# Spring配置
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
username: root
password: root
slave_1:
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
username: root
password: root
在启动类上加注解:
//注意只能扫描mapper接口所在的包,不然有可能会为servic层接口创建代理对象
@MapperScan("com.ruoyi.**.mapper")
或在每一个Mapper接口上加上@Mapper注解
3.CURD接口
service接口
public interface ISysUserService extends IService<SysUser>
service实现类
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper,SysUser> implements ISysUserService
mapper接口:
public interface SysUserMapper extends BaseMapper<SysUser>
详见官网:CRUD 接口 | MyBatis-Plus (baomidou.com)
4.注解
常用注解:
@TableName("sys_user")
@TableField("nickname")
@TableField(exist = false) //实体类排除表中不存在的字段
@TableId("user_id",type=IdType.AUTO)//AUTO ASSIGN_ID(默认雪花算法) ASSIGN_UUID(默认UUID)
注解 | MyBatis-Plus (baomidou.com)
5.分页
添加分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
构建分页对象
//方式一:
Page<SysUser> page = new Page<>();
page.setCurrent(2L);//当前第几页
page.setSize(10L);//每页多少条数据
//方式二:
Page<SysUser> page = new Page<>(2,10);
内置分页方法:
//BaseMapper中:
Page<T> P selectPage(P page, Wrapper<T> queryWrapper);
Page<T> P selectMapsPage(P page, Wrapper<T> queryWrapper);
//ServiceImpl中:
// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page);
// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper);
6.逻辑删除
只对自动注入的 sql 起效:
- 插入: 不作限制
- 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
- 更新: 追加 where 条件防止更新到已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段
- 删除: 转变为 更新
例如:
- 删除:
update user set deleted=1 where id = 1 and deleted=0 - 查找:
select id,name,deleted from user where deleted=0
步骤一:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
步骤二:
@TableLogic
private Integer deleted;
7.通用枚举配置
方式一: 使用 @EnumValue 注解枚举属性 完整示例
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue//标记数据库存的值是code
@JsonValue
private final int code;
//。。。
}
方式二: 枚举属性,实现 IEnum 接口如下:
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
@JsonValue
private int value;
private String desc;
@Override
public Integer getValue() {
return this.value;
}
}
实体属性使用枚举类型:
public class User {
/**
* 名字
* 数据库字段: name varchar(20)
*/
private String name;
/**
* 年龄,IEnum接口的枚举处理
* 数据库字段:age INT(3)
*/
private AgeEnum age;
/**
* 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
如何序列化枚举值为前端返回值?
使用@JsonValue注解处理:
@EnumValue//标记数据库存的值是code
@JsonValue
private final int code;
8.自动填充
创建和更新时间
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
// 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
// 起始版本 3.3.0(推荐)
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
实体类:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime; //注意字段类型和MetaObjectHandler实现类中的类型一致
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;