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
在使用條件構造器進行條件構造時,可以使用鏈式編程