MyBatis-Plus特性之一就是通过少量配置即可实现单表大部分 CRUD 操作,学过Spring Boot时,在学习JPA时,可能用到过Repository接口相关的一系列接口(CrudRepository,PagingAndSortingRepository,JpaRepository),我们的数据库访问层接口只需要继承Repository相关接口就可以实现简单的增删改查分页操作,无需自己实现。同样MyBatis-Plus提供了与上面功能类似的Mapper接口,只需要继承该接口即可以实现简单的增删改查操作。
MyBatis-plus的内置Mapper即接口BaseMapper接口,应用测接口可以继承该接口,无需编写实现类就可以完成简单增删改查操作。BaseMapper接口定义了很多增删改查的操作如下介绍:
//该方法用于往数据库插入一条记录:
int insert(T entity);
//根据 entity 条件,删除记录,条件被封装为Wrapper对象
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
//删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);
//根据 ID 删除
int deleteById(Serializable id);
//根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
/根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);
//根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
//根据 ID 查询
T selectById(Serializable id);
//根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
//查询(根据ID 批量查询)
List selectBatchIds(@Param(Constants.COLLECTION) Collection extends Serializable> idList);
//根据 entity 条件,查询全部记录
List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
//查询(根据 columnMap 条件)
List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
//根据 Wrapper 条件,查询全部记录
List
BaseMapper提供了上面的方法简化单表的操作,我们可以对单表进行简单的增删改查,但是很多时候我们需要在Service层进行逻辑处理,一些简单的Service逻辑需要我们自己编写,MyBatis-Plus为我们提供了内置Service接口用于简化Service层的开发。
//插入一条记录(选择字段,策略插入)
boolean save(T entity);
//插入(批量)
boolean saveBatch(Collection entityList);
//插入(批量)
boolean saveBatch(Collection entityList, int batchSize);
//TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
//根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper updateWrapper);
//批量修改插入
boolean saveOrUpdateBatch(Collection entityList);
//批量修改插入
boolean saveOrUpdateBatch(Collection entityList, int batchSize);
// 根据 entity 条件,删除记录
boolean remove(Wrapper queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection extends Serializable> idList);
//根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper updateWrapper);
//根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper updateWrapper);
//根据 ID 选择修改
boolean updateById(T entity);
//根据ID 批量更新
boolean updateBatchById(Collection entityList);
//根据ID 批量更新
boolean updateBatchById(Collection entityList, int batchSize);
//根据 ID 查询
T getById(Serializable id);
//根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper queryWrapper);
//根据 Wrapper,查询一条记录
T getOne(Wrapper queryWrapper, boolean throwEx);
//根据 Wrapper,查询一条记录
Map getMap(Wrapper queryWrapper);
//根据 Wrapper,查询一条记录
V getObj(Wrapper queryWrapper, Function super Object, V> mapper);
//查询所有
List list();
//查询列表
List list(Wrapper queryWrapper);
//查询(根据ID 批量查询)
Collection listByIds(Collection extends Serializable> idList);
//查询(根据 columnMap 条件)
Collection listByMap(Map columnMap);
//查询所有列表
List
这里的Wrapper相当于SQL语句中的where 后面的内容,就是所谓的条件语句,MyBatis-Plus提供了QueryWrapper以及UpdateWrapper等用于查询和修改数据。如下为Wrapper的实现类图:
如上类图中QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类AbstractWrapper用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。如下为一个简单的测试案例。使用AbstractWrapper的eq方法,相当于SQL中的where id = 30
public void testSelectOne() {
// 查询一条,当有多条时 抛出异常,不存在时发回空
QueryWrapper queryWrapper = new QueryWrapper();
//这里相当于 where id = 30 使用的是AbstractWrapper中的eq方法
queryWrapper.eq(true, "id", 30);
System.out.println(sysUserMapper.selectOne(queryWrapper));
}
QueryWrapper继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取,同时它添加了查询字段的方法select用于设置要查询的字段。
public void testSelectOne() {
// 查询一条,当有多条时 抛出异常,不存在时发回空
QueryWrapper queryWrapper = new QueryWrapper();
//只查询id和username字段
queryWrapper.select("id","username");
queryWrapper.eq(true, "id", 30);
System.out.println(sysUserMapper.selectOne(queryWrapper));
}
UpdateWrapper也继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaUpdateWrapper,可以通过 new UpdateWrapper().lambda() 方法获取,同时增加了set方法和setSql方法,用于更新数据
public void testUpdate() {
UpdateWrapper updateWrapper = new UpdateWrapper();
updateWrapper.between(true, "id", 30, 32);
SysUser entity = new SysUser();
updateWrapper.set("nickname", "ewangke12")
sysUserMapper.update(entity, updateWrapper);
}
MyBatis-Plus提供了分页插件,使用它提供的插件能很方便的做成分页的功能,它提供了IPage接口用于定义分页模型,Page类用于分页模型的实现。分页插件的实现为PaginationInterceptor,这里不介绍它的原理,只是介绍它的使用,它的原理后续学习MyBatis插件原理时再讲解,MyBatis-Plus=分页非常方便,只需要传入IPage实例即可,如下为一个示例:
public void testSelectPage() {
IPage page = new Page();
page.setSize(5);
IPage iPape = sysUserMapper.selectPage(page, new QueryWrapper().eq(true, "nickname", "wangke1"));
System.out.println(iPape.getRecords());
}