1、lambda条件构造器:lambda条件构造器除了具备普通条件构造器的好处以外内,还具有防误写功能。
创建Lambda条件构造器的几种方式:
//1
LambdaQueryWrapper<T> wrapper = new QueryWrapper<T>().lambda();
//2
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<T>();
//3
LambdaQueryWrapper<T> wrapper = Wrappers.<T>lambdaQuery();
例1:
LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery();
//方法引用的方式查询User表中name字段包含雪,并且年龄字段小于40的数据
wrapper.like(User::getName,"雪").lt(User::getAge,40);
List<User> userList = userMapper.selectList(wrapper);
例2:
/** 名字为王姓并且(年龄小于40或邮箱不为空)
* sql写法:name like '王%' and (age < 40 or email is not null)
*/
LambdaQueryWrapper<User> wrapper = Wrappers.<User>lambdaQuery();
wrapper.likeRight(User::getName,"王").and(lqw->lqw.lt(User::getAge,40).or().isNotNull(User::getEmail));
List<User> userList = userMapper.selectList(wrapper);
2、使用条件构造器自定义sql:有时候Mybatis-Plus的BaseMapper提供的方法满足不了我们的需求了,但是我们还是想用条件构造器的话,这时候我们可以自定义sql。
例:
//在userMapper自定义方法
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
在userMapper.xml定义sql
<select id="selectAll" resultType="com.mp.entity.User">
select * from User ${ew.customSqlSegment}
</select>
3、分页查询
MP分页插件实现物理分页
新建一个配置类,把PaginationInterceptor注入进来
@Configuration
public class MybatisPlusConfig{
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
在BaseMapper中提供了两个分页方法:
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
分页查询时会执行一条查询总记录数的sql,如果不想查询总记录数,可以使用Page带boolean isSearchCount的构造方法,传false即为不查。
自定义分页查询(可用于多表联查)
例:
//第一个参数要为page
IPage<UserVo> selectMultiPage(Page page,@Param("user") User user);
//带条件构造器的自定义分页查询
IPage<UserVo> selectMultiPage2(Page page,@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
4、Mp通用Mapper更新方法:
根据 ID 修改:
//根据 ID 修改,如果entity有的属性为null的话,则其对应的表中的列不会出现在update语句中
int updateById(@Param(Constants.ENTITY) T entity);
带有条件构造器的更新
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
当只需某个或少量字段时,可以使用UpdateWrapper的set方法,这时实体类传null就可以了。
5、Mp通用Mapper删除方法
根据 ID 删除:
int deleteById(Serializable id);
根据 columnMap 条件,删除记录(类似于selectByMap,通过map中的条件进行删除)
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);