MyBatis-Plus是一个基于MyBatis的增强脚手架,使用其封装好的各类接口可能在实际开发过程无需手写SQL快速完成业务开发,尤其在JDK1.8后的Lambda语法下使用更为方便
为什么通过 MyBatis-Plus 能够实现快速开发?
深入查看其结构你会发现,MyBatis-Plus 某种意义上来说就是一个已经搭建好的开发脚手架。
通过 Spring 泛型能力,实际业务 Service 类继承 IService 类便可调用父类已经封装好的方法。
此外,业务 Mapper 类继承 BaseMapper 同理。
MyBatis-Plus 核心类:IService、ServiceImpl、BaseMapper(泛型入参)。
关于泛型本文不再过多赘述,很多 SSM 和 SSH 整合教程中均有大量描述。
本文不会全部列举所有方法,仅对常用的方法举例。
调用方法 this.
// 插入一条新数据
boolean save(T entity)
// 插入或更新一条数据
// 这里的实现是先查后插(务必注意实体类需要有@TableId主键)
boolean saveOrUpdate(T entity)
// @TableId(value = "id", type = IdType.AUTO) 主键可以是自增也可以是INPUT
// 批量插入
boolean saveBatch(Collection<T> entityList)
// 批量插入或更新(实际应用为了数据可控不经常直接掉这个方法)
boolean saveOrUpdateBatch(Collection<T> entityList)
// 更新数据,实体类需要有@TableId主键
boolean updateById(T entity)
// 通过自定Lambda实现更新
boolean update(Wrapper<T> updateWrapper)
// 直接写在方法内(简单条件)
// 拼接出来的SQL:UPDATE `user` u SET u.`user_name` = 'UPDATE' WHERE u.`id` = 1
this.update(Wrappers.<User>lambdaUpdate().set(User::getUserName,"UPDATE").eq(User::getId,1));
// 条件拼接(复杂拼接)
// 此处简单举例,理解其中的意思即可
LambdaUpdateWrapper<User> updateWrapper = Wrappers.lambdaUpdate();
if(StringUtils.isNotBlank(user.getUserName())){
updateWrapper.set(User::getUserName,user.getUserName());
}
if(user.getId() !=null) {
updateWrapper.eq(User::getId,user.getId());
}
this.update(updateWrapper);
// 根据主键查询对象
T getById(Serializable id)
// 根据自定义Lambda查询对象
// 务必注意如果返回结果为多条getOne会报错
T getOne(Wrapper<T> queryWrapper)
// 根据自定义Lambda数目
int count(Wrapper<T> queryWrapper)
// 查询全表数据
List<T> list()
// 根据自定义Lambda查询列表
List<T> list(Wrapper<T> queryWrapper)
// 查询全表分页
// 返回可以是IPage接口也可以是任意的IPage实现类
<E extends IPage<T>> E page(E page)
// 根据自定义Lambda查询分页
<E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper)
// 根据自定义Lambda查询一个Map类型的列表
// Map类型的返回比较适用于自行封装的方法
// 比如有很多类似的业务表想进行统一封装查询就可以用Map返回
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper)
// 如上方的更新一样,查询也可以直接入参到方法也可以单独写
// 以分页举例
LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery();
if(StringUtils.isNotBlank(user.getUserName())){
queryWrapper.like(User::getUserName,user.getUserName());
}
if(user.getId() !=null) {
queryWrapper.eq(User::getId,user.getId());
}
this.page(page,queryWrapper);
// 现阶段绝大多数系统都会采用软删除模式
// 修改如status字段进行数据隐藏,因此删除的方法几乎不怎么用
// 基于主键删除
boolean removeById(Serializable id)
// 基于自定义Lambda删除
boolean remove(Wrapper<T> queryWrapper)
实际上 IService 中有很多方法都是直接或间接调用 BaseMapper 完成数据库操作的。
在业务 Service 想要使用 Mapper 无需注入,直接**this.baseMapper.**即可。
// 插入数据(等同于save())
int insert(T entity)
// 根据自定义Lambda查询对象(等同于getOne())
int insert(T entity)T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
一般我们如果需要调用 MyBatis-Plus 提供的方法时,不怎么获取用 this.baseMapper 操作。
this.baseMapper 主要作用是调用自己在业务 Mapper 中定义的方法。
public interface UserMapper extends BaseMapper<User> {
/**
* 根据页面定制对象查询用户
* @param page
* @param status
* @return
*/
IPage<UserVo> pageForVo(Page page, Integer status);
}
// UserServiceImpl可以直接调用
this.baseMapper.pageForVo(page,null);
温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。