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