MyBatisPlus
1.简介
MyBatisPlus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生
官网:https://baomidou.com/
MyBatis-Plus特性:
- 无侵入:只做增强不做改变,不会对现有的工程产生影响
- 强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作
- 支持Lambda:编写查询条件无需担心字段写错
- 支持主键自动生成
- 内置分页插件
开发方式
- 单独使用MyBatis-Plus
- 基于Spring使用MyBatis-Plus
- 基于SpringBoot使用MyBatis-Plus(最常用)
maven坐标
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency>
2.CRUD接口
MP框架提供常用的CRUD方法,这些方法都是定义在BaseMapper接口中的,开发过程中经常使用这写方法操作数据库
3.常用注解
3.1 @TableName注解
通过@TableName注解可以映射实体类和表的对应关系
-
名称:@TableName
-
类型:类注解
-
位置:模型类上
-
作用:设置当前类对应与数据库表关系
-
示例
@TableName("t_user") //当前实体类对应的表为t_user public class User {private Long id; }
注:如果类名和表名一致,MP可以自动进行映射,此时@TableName注解可以省略
3.2 @TableField注解
通过@TableField注解可以映射实体类的属性和表字段的对应关系
-
名称:@TableField
-
类型:属性注解
-
位置:模型类属性上
-
作用:设置当前属性对应的数据库表中的字段关系
-
相关属性
value:设置数据库表字段名称
exist:设置属性在数据库表字段中是否存在,默认为true
-
示例
public class User {@TableField(value="pwd") //当前属性对应的字段为pwdprivate String password;@TableField(exist = false) //当前属性在表中没有对应的字段private String online; }
如果属性名和字段名一致,MP可以自动进行映射,此时@TableField注解可以省略
如果属性名使用驼峰命名法命名,字段名使用对应的下划线分割命名,MP可以自动进行映射,此时@TableField可以省略
3.3@TableId注解
通过@TableId注解可以映射实体类的属性和表主键字段的对应关系,还可以设置主键的生成策略
-
名称:@TableId
-
类型:属性注解
-
位置:模型类中用于标注在逐渐的属性上
-
相关属性
value:设置数据库主键字段名称,如果属性名和字段名一致,可以省略此属性
type:设置主键的生成策略,值参照IdType枚举值
-
示例
public class User {@TableId(type = IdType.AUTO) //当前id属性和表的主键字段id对应,并且设置主键生成策略为AUTOprivate Long id; }
主键生成策略
- AUTO:使用数据库id自增策略控制id生成
- NONE:不设置id生成策略
- INPUT:用户手工输入id
- ASSIGN_ID:以雪花算法生成id(可兼容数值型与字符串型)
为了简化开发,可以在application,yml中配置全局的主键生成策略
mybatis-plus:global-config:db-config:id-type: assign_id #全局设置主键生成策略
4.条件构造器
MP对于Service层的支持,提供操作数据库的方法
IService接口:
IService接口实现类:
MP对于Mapper层的支持,提供操作数据库的方法
4.1 条件构造器介绍
通过条件构造器(Wrapper),可以控制最终生成的 SQL 语句的条件部分,如下:
- select ____ from table where ____ order by ____
- update table set ____ where ____
- delete from table where____
通过条件构造器,就可以控制上面SQL语句中____位置的SQL片段,在项目开发过程中经常使用到
mybatis-plus支持service层继承IService接口,mapper层继承BaseMapper接口,IService接口和BaseMapper接口中有很多方法,都需要条件构造器作为参数
4.2使用较多的条件构造器
-
QueryWrapper
通过QueryWrapper条件构造器,可以控制最终生成的查询、删除类的SQL语句
SQL结构:
select_from table where_order by_
delete from table where_
示例:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {//创建 QueryWrapper对象QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.select("id","name");//设置查询字段queryWrapper.gt("age",20);//添加查询条件,要求age大于20queryWrapper.eq("province","陕西省");//添加查询条件,要求省份是陕西省queryWrapper.like("name","zhangsan");//模糊查询queryWrapper.orderByDesc("id");//排序条件,根据id字段进行降序排序 List<Student> studentList = getList(queryWrapper);}
-
LambdaQueryWrapper
使用QueryWrapper设置条件时,是通过字符串指定字段名,在编译阶段无法发现错误,程序运行阶段就会抛出异常
LambdaQueryWrapper的作用和QueryWrapper相同,都是控制最终生成的查询、删除类的SQL语句。不同点在于语法层面。QueryWrapper是通过字段名来设置条件,LambdaQueryWrapper是通过Lambda语法来设置条件,可以做到在编译时期能够发现错误
示例:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {//创建LambdaQueryWrapper对象LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper();queryWrapper.select(Student:id,Student:name);//设置查询字段queryWrapper.gt(Student:age,20);//添加查询条件,要求age大于20queryWrapper.eq(Student:privince,"陕西省");//添加查询条件,要求省份是陕西省queryWrapper.like(Student:name,"zhangsan");//模糊查询queryWrapper.orderByDesc(Student:id);//排序条件,根据id字段进行降序排序 List<Student> studentList = getList(queryWrapper);}
-
UpdateWrapper
通过 UpdateWrapper 条件构造器,可以控制最终生成的更新类的SQL语句。
**SQL结构:**update table set _______ where _______
示例:
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {//创建QueryWrapper对象UpdateWrapper updateWrapper = new UpdateWrapper();updateWrapper.set("name","zhangsan");//将姓名修改为zhangsanupdateWrapper.gt("age",20);//添加查询条件,要求age大于20update(updateWrapper)}
-
LambdaUpdateWrapper
LambdaUpdateWrapper的作用和UpdateWrapper相同,都是控制最终生成的更新类的SQL语句。不同点在于语法层面。UpdateWrapper是通过字段名来设置条件,LambdaUpdateWrapper是通过Lambda语法来设置条件,可以做到在编译期就能够发现错误。
@Service public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {//创建QueryWrapper对象UpdateWrapper updateWrapper = new UpdateWrapper();updateWrapper.set(Student:name,"zhangsan");//将姓名修改为zhangsanupdateWrapper.gt(Student:age,20);//添加查询条件,要求age大于20update(updateWrapper)}
项目开发中建议使用 LambdaUpdateWrapper 来代替 UpdateWrapper
在使用条件构造器进行条件构造时,可以使用链式编程