mybatisPlus官网
详细mybatisPlus解析
1.快速入门
1.1 入门案例
1. 引入MybatisPlus的起步依赖(导入依赖)(使用mybatisplus依赖替代mybatis依赖);
2. 定义Mapper(自定义Mapper继承MybatisPlus提供的BaseMapper接口,如public interface UserMapper extends BaseMapper<User>{})
BaseMapper中的方法规则:
新增-insert();
修改-updateXXX();
删除-deleteXXX();
查询-selectXXX();
注意:继承父类BaseMapper时,一定要带上实体类泛型,如User;
1.2 常见注解
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息;
实体类符合数据库表格字段定义【约定大于定义】:
- 类名驼峰转下划线作为表名;
- 名为id的字段作为主键;
- 变量名驼峰转下划线作为表的字段名;
注:以上是要做到实体类和数据库表格字段定义规则;
实体不符合数据库表格字段定义(需要使用注解):
1. @TableName:用来指定表名,如@TableName("tb_user)加到实体类User上;
2. @TableId:用来指定表中的主键字段信息,如@TableId(value="id",type=IdType.type)加到主键属性上;
- value:指数据库表中的主键名;
- IdType.type:type指数据库表中的主键是否呈现自增长类型(AUTO:数据库自增长,INPUT:通过set方法自行输入,ASSIGN_ID:分配ID(默认id使用),接口IdentitierGenerator的方法nextId来生成id,默认实现类为DefaultdentifierGenerator雪花算法-Long类型);
3. @TableField:用来指定表中的普通字段信息,如@TableField("数据库表中字段名");
使用@TableField的常见场景:
- 成员变量名于数据库字段名不一致;
- 成员变量名以is开头,且是布尔值;
- 成员变量名于数据库关键字冲突,如order关键字:@TableField("`order`");
- 成员变量不是数据库字段,如@TableField(exist = false),表示被标识的变量不是数据库表中的字段;
1.3 常见配置
MyBatisPlus的配置项继承了Mybatis原生配置和一些自己特有的配置:
mybatis-plus:
type-aliases-package: com.yueyue.mp.domain.po
mapper-locations: "classpath*:/mapper/**/*.xml"
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
global-config:
db-config:
id-type: assign_id
update-strategy: not_null
2.核心功能
2.1 条件构造器
Wrapper(AbstractWrapper(AbstractLambdaWrapper(LambdaUpdateWrapper,LamndaQueryWrapper)),UpdateWrapper,QueryWrapper)
LambdaUpdateWrapper:当在使用数据库表中对应的字段时,直接使用实体类进行引用字段,而非写定,若为写定的则为硬编码;
2.2 自定义sql
利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL语句中剩下的部分;
(1)基于Wrapper构建where条件;
(2)在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew;
(3)自定义SQL,并使用Wrapper条件;
2.3 Service接口
Service接口中方法规则:
新增--saveXXX();
新增或修改--saveOrUpdateXXX();
删除--removeXXX();
查询多个--listXXX();
查询一个--getXXX();
查询数量--countXXX();
分页查询--pageXXX();
复杂条件查询--lambdaXXX();
service层提供接口类继承IService接口类,其中还存在ServiceImpl实现类
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}
UserMapper:对应的mapper层;
User:实体类;
(1)MP的Service接口使用流程是怎样的?
自定义Service接口继承IService接口;
public interface IUserService extends IService<User>{}
(2)自定义Service实现类,实现自定义接口并继承ServiceImpl类;
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}
注意:
1. 在controller层中使用service层,推荐使用【构造函数】注入:
在类上加上注解@RequiredArgsConstructor
private final IUserService userService;
2.可以使用hutool工具将一个实体类中的字段值复制到含有相同属性的实体类中;
dto:
vo:查询时使用;
3.扩展功能
3.1 代码生成
1. 实体类
使用注解(@TableName("user")、@TableId(type=IdType.AUTO等等)),使实体类和数据库表对应;
2. mapper层
public interface UserMapper extends BaseMapper<User>{}
3. service接口
public interface IUserService extends IService<User>{}
4. service接口实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}
代码生成器:
MybatisX官方快速开发插件,其是IDEA的快速开发插件,能够生成代码;
Mybatisplus插件,其也是IDEA的快速开发插件,能够生成代码(推荐使用);
5. 安装上面两种插件;
6. 在idea中上方出现Other选项,在其中配置连接数据库,
7. 选择Other中的code Generator,填写module(没有子模块不用填);
3.2 静态工具
Db:方法和IService中类似,但Db中的方法都是静态的,在调用方法的方式上有所不同;
3.3 逻辑删除
逻辑删除:基于代码逻辑模拟删除效果,但并不会真正删除数据;
application.yml文件中配置逻辑删除的字段名称和值:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag #全局逻辑删除的实体字段名,字段类型可以是boolean、integer
logic-delete-value: 1 #逻辑已删除值(默认为 1)
logic-not-delete-value: 0 #逻辑未删除值(默认为 0)
3.4 枚举处理器
枚举处理器:实体类中有一个用户状态字段;
在application.yml中配置全局枚举处理器
3.5 JSON处理器
数据库表中,存在【json】类型的字段,其实体类应该对应类型是【String】类型,但我们所需要的是直接将json类型的值,调整为对象类型对应的值;
将json类型数据转换为对象类型数据:
1. 定义与实体类A中json类型中数据对应的实体类B;
2. 在实体类A中定义json类型数据为实体类B,且实体类A中json类型字段上面加上注解@TableField(typeHandler = JacksonTypeHandler.class)
4.插件功能
4.1 分页插件
1. 在配置类中注册MyBatisPlus的核心插件,同时添加分页插件;
2. 直接使用:
interceptor.addInnerInterceptor(),添加使用的插件等;
3. 直接使用分页的API
4.2 通用分页实体
直接将分页功能,存放到一个分页公共类中,如果想要进行分页操作,直接调用分页类中的函数即可。