- @TableName:用来指定表名
- @Tableld:用来指定表中的主键字段信息
- @TableField:用来指定表中的普通字段信息
- 成员变量名与数据库字段名不一致
- 成员变量名以is开头且是布尔值
- 成员变量名与数据库关键字冲突
- 成员变量不是数据库字段
-
public interface UserMapper extends BaseMapper<User> {} - 自定义Service接口继承IService接口
-
pubic interface IUserService extends IService<User> {}
-
- 自定义Service实现类,实现自定义接口并继承Servicelmpl类
-
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}
-
- MP的批量新增,基于预编译的批处理,在mysql执行时依然是逐条执行,性能没有达到最好
- 配置jdbc参数,开启rewriteBatchedStatements=true,性能最好,mysql驱动会把一条条的sql重写成一条sql语句
- 推荐MybatisX(基于图形化界面完成
MybatisPlus的代码生成) - 在表中添加一个字段标记数据是否被删除
- 当删除数据时把标记置为true
- 查询时过滤掉标记为true的数据
- 会导致数据库表垃圾数据越来越多,从而影响查询效率
- SQL中全都需要对逻辑删除字段做判断,影响查询效率
MybatisPlus入门
常用注解
IdType(默认雪花算法):
| 值 | 描述 |
|---|---|
| AUTO | 数据库自增长 |
| INPUT | 通过set方法自行输入 |
| ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
| ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法) |
使用@TableField的常见场景:
@TableName("tb_user")
public class User {
@TableId(value= "id", type= IdType.AUTO )
private Long id;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
@TableField("`order`")
private Integer order;
@TableField(exist = false)
private String address;
}
使用配置
mybatis-plus:
type-aliases-package:com.itheima.mp.domain.po #别名扫描包,指定实体类时只需写类名
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 #id为雪花算法生成
update-strategy:not_null #更新策略:只更新非空字段
核心功能
BaseMapper
IService接口
IService批量新增
拓展功能
代码生成器
根据数据库表结构生成PO、Mapper、Service等相关代码
DB静态工具
有的时候Service之间也会相互调用,为了避免出现循环依赖问题,MybatisPlus提供一个静态工具类:Db,其中的一些静态方法与IService中方法签名基本一致,也可以帮助我们实现CRUD功能
逻辑删除
对于一些比较重要的数据,我们往往会采用逻辑删除的方案,即:
一旦采用了逻辑删除,所有的查询和删除逻辑都要跟着变化,非常麻烦。 为了解决这个问题,MybatisPlus就添加了对逻辑删除的支持。
注意,只有MybatisPlus生成的SQL语句才支持自动的逻辑删除,自定义SQL需要自己手动处理逻辑删除。
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
注意: 逻辑删除本身也有自己的问题,比如:
因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。或者是采用定时任务定期删除
枚举处理器
MybatisPlus提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。
要让MybatisPlus处理枚举与数据库类型自动转换,我们必须告诉MybatisPlus,枚举中的哪个字段的值作为数据库值。 MybatisPlus提供了@EnumValue注解来标记枚举属性
同时要在application.yml中配置全局枚举处理器
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
仅仅这两步会返回的是枚举类型,可以通过@JsonValue注解标记JSON序列化时展示的字段,这样就可以返回我们想要看到的值
package com.itheima.mp.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;
@Getter
public enum UserStatus {
NORMAL(1, "正常"),
FREEZE(2, "冻结")
;
@EnumValue
@JsonValue
private final int value;
private final String desc;
UserStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
JSON处理器
处理JSON可以使用JacksonTypeHandler处理器,方便将一个数据库中为JSON类型字段的数据转换为java中的对象
要改两处地方:
1.将PO中对应的字段改为你要转为的对象类型,并在字段上加@TableField(typeHandler = JacksonTypeHandler.class)
2.在类名上面加@TableName(value = "对应的表名",autoResultMap = true),开启自动结果集映射
插件功能
分页插件
配置分页插件
@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 初始化核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}