mybatis plus 深入學習
常見注解
1.@TableName
描述:表名注解,標識實體類對應的表 使用位置:實體類
@TableName ( "sys_user" )
public class User { private Long id; private String name; private Integer age; private String email;
}
屬性 類型 必須指定 默認值 描述 value String 否 “” 表名 schema String 否 “” schema keepGlobalPrefix boolean 否 false 是否保持使用全局的 tablePrefix 的值(當全局 tablePrefix 生效時) resultMap String 否 “” xml 中 resultMap 的 id(用于滿足特定類型的實體類對象綁定) autoResultMap boolean 否 false 是否自動構建 resultMap 并使用(如果設置 resultMap 則不會進行 resultMap 的自動構建與注入) excludeProperty String[] 否 {} 需要排除的屬性名 @since 3.3.1
2.@TableId
@TableName ( "sys_user" )
public class User { @TableId private Long id; private String name; private Integer age; private String email;
}
屬性 類型 必須指定 默認值 描述 value String 否 “” 主鍵字段名 type Enum 否 IdType.NONE 指定主鍵類型
IdType
值 描述 AUTO 數據庫 ID 自增 NONE 無狀態,該類型為未設置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT) INPUT insert 前自行 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 方法) ID_WORKER 分布式全局唯一 ID 長整型類型(please use ASSIGN_ID
) UUID 32 位 UUID 字符串(please use ASSIGN_UUID
) ID_WORKER_STR 分布式全局唯一 ID 字符串類型(please use ASSIGN_ID
)
LambdaQueryrapper和QueryWrapper
查詢的數據和另一張表的某一列有關
假如我想查年齡大于30歲用戶的訂單信息
int age = 30 ;
LambdaQueryWrapper < Order > orderWrapper = Wrappers . < Order > lambdaQuery ( ) . inSql ( Order :: getUserId , "SELECT id FROM user where age > " + age) ; List < Order > orderList = orderDao. selectList ( orderWrapper) ;
動態條件構建
LambdaQueryWrapper < User > queryWrapper = Wrappers . < User > lambdaQuery ( ) ;
if ( StringUtils . isNotBlank ( username) ) { queryWrapper. like ( User :: getUsername , username) ;
}
if ( minAge != null ) { queryWrapper. ge ( User :: getAge , minAge) ;
}
if ( maxAge != null ) { queryWrapper. le ( User :: getAge , maxAge) ;
}
queryWrapper. ge ( minAge != null , User :: getAge , minAge) . le ( maxAge != null , User :: getAge , maxAge) ;
List < User > userList = userDao. selectList ( queryWrapper) ;
mysql函數嵌入
假設你有一個實體類User
,其中包含了一個日期字段birthDate
,你想要查詢生日在特定月份的用戶,并將生日格式化為"yyyy-MM-dd"格式:
@Test public static void Test2 ( ) { int selectedMonth = 1 ; LambdaQueryWrapper < User > queryWrapper = Wrappers . < User > lambdaQuery ( ) . apply ( "MONTH(birth_date) = {0}" , selectedMonth) . select ( User :: getId , User :: getName , User :: getBirthDate ) ; List < User > userList = userDao. selectList ( queryWrapper) ; DateTimeFormatter formatter = DateTimeFormatter . ofPattern ( "yyyy-MM-dd" ) ; for ( User user : userList) { String formattedBirthDate = user. getBirthDate ( ) . format ( formatter) ; System . out. println ( "User ID: " + user. getId ( ) + ", Name: " + user. getName ( ) + ", Formatted Birth Date: " + formattedBirthDate) ; } }
自定義SQL片段構建
有時候,可能需要構建復雜的查詢條件,而標準的查詢方法不足以滿足需求。在這種情況下,可以使用自定義SQL片段來構建查詢條件。例如,如果你需要使用OR條件連接多個子條件,可以這樣做:
QueryWrapper < User > queryWrapper = new QueryWrapper < > ( ) ;
queryWrapper. or ( qw -> qw. like ( "username" , "Alice" ) . or ( ) . like ( "username" , "Bob" ) ) ; List < User > userList = userDao. selectList ( queryWrapper) ;
使用了.or(qw -> ...)
來構建自定義的OR條件,然后在其中使用多個.like()
條件。這樣就創建了一個查詢條件,要么用戶名包含"Alice"要么包含"Bob"的用戶。
LambdaQueryWrapper < SysUserEntity > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( SysUserEntity :: getStatus , 1 ) . and ( i-> i. eq ( SysUserEntity :: getDeptId , 3 ) . or ( ) . eq ( SysUserEntity :: getDeptId , 5 ) ) ;
List < SysUserEntity > userEntityList = userService. list ( queryWrapper) ;
sql語句user_id,username,password,salt,dept_id,email,mobile,avatar,nick_name,real_name,mini_openid,status,create_user_id,create_time FROM sys_user WHERE (status = ? AND (dept_id = ? OR dept_id = ?))
選擇性加載數據
避免不必要的數據加載是提高查詢性能的關鍵。在查詢時,只選擇那些你實際需要的字段,而不是加載整個實體對象。使用select
方法來指定要查詢的字段,以減少數據傳輸和內存占用。
LambdaQueryWrapper < User > queryWrapper = new LambdaQueryWrapper < > ( ) ; . select ( User :: getId , User :: getName ) . eq ( User :: getStatus , 1 ) ; List < User > userList = userDao. selectList ( queryWrapper) ;
分頁查詢
如果查詢結果集很大,使用分頁查詢來限制返回的數據量。MyBatis-Plus提供了分頁查詢的支持,可以使用Page
類來進行分頁操作。
Page < User > page = new Page < > ( 1 , 10 ) ;
LambdaQueryWrapper < User > queryWrapper = new LambdaQueryWrapper < > ( ) ; . eq ( User :: getStatus , 1 ) ; IPage < User > userPage = userDao. selectPage ( page, queryWrapper) ;
BaseMapper
參數說明
類型 參數名 描述 T entity 實體對象 Collection entityList 實體對象集合 int batchSize 插入批次數量 別名 et 實體類對象 別名 ew 查詢條件wrapper對象
basemapper類
package com. baomidou. mybatisplus. core. mapper ; import com. baomidou. mybatisplus. core. conditions. Wrapper ;
import com. baomidou. mybatisplus. core. metadata. IPage ;
import java. io. Serializable ;
import java. util. Collection ;
import java. util. List ;
import java. util. Map ;
import org. apache. ibatis. annotations. Param ; public interface BaseMapper < T > extends Mapper < T > { int insert ( T entity) ;
T entity = new T ( ) ;
baseMapper. insert ( entity) ;
int deleteById ( Serializable id) ;
Serializable id = 1L ;
baseMapper. deleteById ( id) ;
int deleteByMap ( @Param ( "cm" ) Map < String , Object > columnMap) ;
Map < String , Object > columnMap = new HashMap < > ( ) ;
columnMap. put ( "name" , "zs" ) ;
columnMap. put ( "" , "" ) ;
baseMapper. deleteByMap ( columnMap) ;
int delete ( @Param ( "ew" ) Wrapper < T > wrapper) ;
LambdaQueryWrapper < T > wrapper = new LambdaQueryWrapper < > ( ) ;
wrapper. eq ( T :: getName , "zs" ) ;
baseMapper. delete ( wrapper) ;
int deleteBatchIds ( @Param ( "coll" ) Collection < ? extends Serializable > idList) ;
Collection < ? extends Serializable > idList = Arrays . asList ( 1L , 2L , 3L ) ;
baseMapper. deleteBatchIds ( idList) ;
int updateById ( @Param ( "et" ) T entity) ;
T entity = new T ( ) ;
entity. setId ( 1L ) ;
baseMapper. updateById ( entity) ;
int update ( @Param ( "et" ) T entity, @Param ( "ew" ) Wrapper < T > updateWrapper) ;
T entity = new T ( ) ;
LambdaUpdateWrapper < T > updateWrapper = new LambdaUpdateWrapper < > ( ) ;
updateWrapper. eq ( T :: getName , "zs" ) ;
baseMapper. update ( entity, updateWrapper) ;
T selectById ( Serializable id) ;
Serializable id = 1L ;
T entity = baseMapper. selectById ( id) ;
List < T > selectBatchIds ( @Param ( "coll" ) Collection < ? extends Serializable > idList) ;
Collection < ? extends Serializable > idList = Arrays . asList ( 1L , 2L , 3L ) ;
List < T > entityList = baseMapper. selectBatchIds ( idList) ;
List < T > selectByMap ( @Param ( "cm" ) Map < String , Object > columnMap) ;
Map < String , Object > columnMap = new HashMap < > ( ) ;
columnMap. put ( "name" , "zs" ) ;
List < T > entityList = baseMapper. selectByMap ( columnMap) ;
T selectOne ( @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < T > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( T :: getName , "zs" ) ;
T entity = baseMapper. selectOne ( queryWrapper) ;
Integer selectCount ( @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < T > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( T :: getName , "zs" ) ;
int count = baseMapper. selectCount ( queryWrapper) ;
List < T > selectList ( @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < T > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( T :: getAge , 18 ) ;
List < T > entityList = baseMapper. selectList ( queryWrapper) ;
List < Map < String , Object > > selectMaps ( @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < T > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( T :: getAge , 18 ) ;
List < Map < String , Object > > mapList = baseMapper. selectMaps ( queryWrapper) ;
List < Object > selectObjs ( @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < User > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( User :: getAge , 18 ) ;
List < Object > ageList = userMapper. selectObjs ( queryWrapper) ;
< E extends IPage < T > > E selectPage ( E page, @Param ( "ew" ) Wrapper < T > queryWrapper) ;
LambdaQueryWrapper < T > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( T :: getAge , 18 ) ;
Page < T > page = new Page < > ( 1 , 10 ) ;
IPage < T > pageResult = baseMapper. selectPage ( page, queryWrapper) ;
List < T > entityList = pageResult. getRecords ( ) ;
long total = pageResult. getTotal ( ) ;
< E extends IPage < Map < String , Object > > > E selectMapsPage ( E page, @Param ( "ew" ) Wrapper < T > queryWrapper) ;
Page < Map < String , Object > > mapPage = userMapper. selectMapsPage ( page, queryWrapper) ; }
IService類
和mapper層方法大差不差
說明:
通用 Service CRUD 封裝IService 接口,進一步封裝 CRUD 采用 get 查詢單行
remove 刪除
list 查詢集合
page 分頁
前綴命名方式區分 Mapper
層避免混淆, 泛型 T
為任意實體對象 建議如果存在自定義通用 Service 方法的可能,請創建自己的 IBaseService
繼承 Mybatis-Plus
提供的基類 對象 Wrapper
為 條件構造器
save
boolean save ( T entity) ;
boolean saveBatch ( Collection < T > entityList) ;
boolean saveBatch ( Collection < T > entityList, int batchSize) ;
參數說明
類型 參數名 描述 T entity 實體對象 Collection entityList 實體對象集合 int batchSize 插入批次數量
案例
SysUserEntity user = new SysUserEntity ( ) ;
user. setUsername ( "zs" ) ;
user. setMobile ( "1234567891" ) ;
userService. save ( user) ; List < SysUserEntity > userEntityList = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 10 ; i++ ) { SysUserEntity user = new SysUserEntity ( ) ; user. setUsername ( "zs" ) ; user. setMobile ( "1234567891" ) ; userEntityList. add ( user) ;
} userService. saveBatch ( userEntityList) ;
userService. saveBatch ( userEntityList, 2 ) ;
SaveOrUpdate
boolean saveOrUpdate ( T entity) ;
boolean saveOrUpdate ( T entity, Wrapper < T > updateWrapper) ;
boolean saveOrUpdateBatch ( Collection < T > entityList) ;
boolean saveOrUpdateBatch ( Collection < T > entityList, int batchSize) ;
參數說明
類型 參數名 描述 T entity 實體對象 Wrapper updateWrapper 實體對象封裝操作類 UpdateWrapper Collection entityList 實體對象集合 int batchSize 插入批次數量
案例
SysUserEntity user = new SysUserEntity ( ) ;
user. setuserId ( 3 ) ;
user. setUsername ( "zs" ) ;
user. setMobile ( "1234567891" ) ;
userService. saveOrUpdate ( user) ;
List < SysUserEntity > userEntityList = new ArrayList < > ( ) ;
for ( int i = 0 ; i < 10 ; i++ ) { SysUserEntity user = new SysUserEntity ( ) ; if ( i % 2 == 0 ) { user. setuserId ( i) ; } user. setUsername ( "zs" ) ; user. setMobile ( "1234567891" ) ; userEntityList. add ( user) ;
}
userService. saveOrUpdateBatch ( userEntityList) ;
userService. saveOrUpdateBatch ( userEntityList, 2 ) ;
Remove
boolean remove ( Wrapper < T > queryWrapper) ;
boolean removeById ( Serializable id) ;
boolean removeByMap ( Map < String , Object > columnMap) ;
boolean removeByIds ( Collection < ? extends Serializable > idList) ;
參數說明
類型 參數名 描述 Wrapper queryWrapper 實體包裝類 QueryWrapper Serializable id 主鍵 ID Map<String, Object> columnMap 表字段 map 對象 Collection<? extends Serializable> idList 主鍵 ID 列表
案例
LambdaQueryWrapper < SysUserEntity > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper. eq ( SysUserEntity :: getUsername , "zs" ) ;
boolean removeResult = userService. remove ( queryWrapper) ;
Long idToRemove = 1L ;
boolean removeByIdResult = userService. removeById ( idToRemove) ;
Map < String , Object > columnMap = new HashMap < > ( ) ;
columnMap. put ( "username" , "zs" ) ;
boolean removeByMapResult = userService. removeByMap ( columnMap) ;
List < Long > idListToRemove = Arrays . asList ( 1L , 2L , 3L ) ;
boolean removeByIdsResult = userService. removeByIds ( idListToRemove) ;
Update
boolean update ( Wrapper < T > updateWrapper) ;
boolean update ( T updateEntity, Wrapper < T > whereWrapper) ;
boolean updateById ( T entity) ;
boolean updateBatchById ( Collection < T > entityList) ;
boolean updateBatchById ( Collection < T > entityList, int batchSize) ;
參數說明
類型 參數名 描述 Wrapper updateWrapper 實體對象封裝操作類 UpdateWrapper T entity 實體對象 Collection entityList 實體對象集合 int batchSize 更新批次數量
案例
UpdateWrapper < SysUserEntity > updateWrapper = new UpdateWrapper < > ( ) ;
updateWrapper. eq ( "username" , "zs" ) ;
boolean updateResult1 = userService. update ( updateWrapper) ;
UpdateWrapper < SysUserEntity > whereWrapper = new UpdateWrapper < > ( ) ;
whereWrapper. eq ( "username" , "zs" ) ;
SysUserEntity updateEntity = new SysUserEntity ( ) ;
updateEntity. setMobile ( "1234567890" ) ;
boolean updateResult2 = userService. update ( updateEntity, whereWrapper) ;
SysUserEntity entityToUpdate = new SysUserEntity ( ) ;
entityToUpdate. setId ( 1L ) ;
entityToUpdate. setUsername ( "newZs" ) ;
boolean updateByIdResult = userService. updateById ( entityToUpdate) ;
List < SysUserEntity > entityListToUpdate = new ArrayList < > ( ) ;
boolean updateBatchByIdResult1 = userService. updateBatchById ( entityListToUpdate) ;
boolean updateBatchByIdResult2 = userService. updateBatchById ( entityListToUpdate, 2 ) ;
Get
T getById ( Serializable id) ;
T getOne ( Wrapper < T > queryWrapper) ;
T getOne ( Wrapper < T > queryWrapper, boolean throwEx) ;
Map < String , Object > getMap ( Wrapper < T > queryWrapper) ;
< V > V getObj ( Wrapper < T > queryWrapper, Function < ? super Object , V > mapper) ;
參數說明
類型 參數名 描述 Serializable id 主鍵 ID Wrapper queryWrapper 實體對象封裝操作類 QueryWrapper boolean throwEx 有多個 result 是否拋出異常 T entity 實體對象 Function<? super Object, V> mapper 轉換函數
案例
Long userId = 1L ;
SysUserEntity userById = userService. getById ( userId) ;
QueryWrapper < SysUserEntity > queryWrapper1 = new QueryWrapper < > ( ) ;
queryWrapper1. eq ( "username" , "zs" ) . last ( "limmit 1" ) ;
SysUserEntity userOne1 = userService. getOne ( queryWrapper1) ;
QueryWrapper < SysUserEntity > queryWrapper2 = new QueryWrapper < > ( ) ;
queryWrapper2. eq ( "status" , 1 ) ;
SysUserEntity userOne2 = userService. getOne ( queryWrapper2, true ) ;
QueryWrapper < SysUserEntity > queryWrapper3 = new QueryWrapper < > ( ) ;
queryWrapper3. eq ( "age" , 25 ) ;
Map < String , Object > userMap = userService. getMap ( queryWrapper3) ;
QueryWrapper < SysUserEntity > queryWrapper4 = new QueryWrapper < > ( ) ;
queryWrapper4. eq ( "gender" , "male" ) ;
Function < Object , String > mapper = obj -> { return "User: " + ( ( SysUserEntity ) obj) . getUsername ( ) ;
} ;
String username = userService. getObj ( queryWrapper4, mapper) ;
List
List < T > list ( ) ;
List < T > list ( Wrapper < T > queryWrapper) ;
Collection < T > listByIds ( Collection < ? extends Serializable > idList) ;
Collection < T > listByMap ( Map < String , Object > columnMap) ;
List < Map < String , Object > > listMaps ( ) ;
List < Map < String , Object > > listMaps ( Wrapper < T > queryWrapper) ;
List < Object > listObjs ( ) ;
< V > List < V > listObjs ( Function < ? super Object , V > mapper) ;
List < Object > listObjs ( Wrapper < T > queryWrapper) ;
< V > List < V > listObjs ( Wrapper < T > queryWrapper, Function < ? super Object , V > mapper) ;
參數說明
類型 參數名 描述 Wrapper queryWrapper 實體對象封裝操作類 QueryWrapper Collection<? extends Serializable> idList 主鍵 ID 列表 Map<String, Object> columnMap 表字段 map 對象 Function<? super Object, V> mapper 轉換函數
Page
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) ;
參數說明
類型 參數名 描述 IPage page 翻頁對象 Wrapper queryWrapper 實體對象封裝操作類 QueryWrapper
Count
int count ( ) ;
int count ( Wrapper < T > queryWrapper) ;
參數說明
類型 參數名 描述 Wrapper queryWrapper 實體對象封裝操作類 QueryWrapper