MyBatis-Plus特性之强大的CURD操作

MyBatis-Plus特性之一就是通过少量配置即可实现单表大部分 CRUD 操作,学过Spring Boot时,在学习JPA时,可能用到过Repository接口相关的一系列接口(CrudRepository,PagingAndSortingRepository,JpaRepository),我们的数据库访问层接口只需要继承Repository相关接口就可以实现简单的增删改查分页操作,无需自己实现。同样MyBatis-Plus提供了与上面功能类似的Mapper接口,只需要继承该接口即可以实现简单的增删改查操作。

内置Mapper

MyBatis-plus的内置Mapper即接口BaseMapper接口,应用测接口可以继承该接口,无需编写实现类就可以完成简单增删改查操作。BaseMapper接口定义了很多增删改查的操作如下介绍:

//该方法用于往数据库插入一条记录:
int insert(T entity);
//根据 entity 条件,删除记录,条件被封装为Wrapper对象
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
//删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
//根据 ID 删除
int deleteById(Serializable id);
//根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/根据 whereEntity 条件,更新记录
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
//根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
//根据 ID 查询
T selectById(Serializable id);
//根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
//查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
//根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
//查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
//根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
//根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
//根据 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);
//根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

内置Service接口

BaseMapper提供了上面的方法简化单表的操作,我们可以对单表进行简单的增删改查,但是很多时候我们需要在Service层进行逻辑处理,一些简单的Service逻辑需要我们自己编写,MyBatis-Plus为我们提供了内置Service接口用于简化Service层的开发。

//插入一条记录(选择字段,策略插入)
boolean save(T entity);
//插入(批量)
boolean saveBatch(Collection<T> entityList);
//插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
//TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
//根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
//批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
//批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
//根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
//根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper<T> updateWrapper);
//根据 ID 选择修改
boolean updateById(T entity);
//根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
//根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
//根据 ID 查询
T getById(Serializable id);
//根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
//根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
//根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
//根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
//查询所有
List<T> list();
//查询列表
List<T> list(Wrapper<T> queryWrapper);
//查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
//查询(根据 columnMap 条件)
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);
//根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
//根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
//无条件翻页查询
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);
//链式查询 普通
QueryChainWrapper<T> query();
//链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper<T> lambdaQuery(); 
//示例:
query().eq("column", value).one();
lambdaQuery().eq(Entity::getId, value).list();

条件构造器(Wrapper)

这里的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<SysUser> queryWrapper = new QueryWrapper<SysUser>();
    //这里相当于 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<SysUser> queryWrapper = new QueryWrapper<SysUser>();
    //只查询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<SysUser> updateWrapper = new UpdateWrapper<SysUser>();
    updateWrapper.between(true, "id", 30, 32);
    SysUser entity = new SysUser();
    updateWrapper.set("nickname", "ewangke12")
    sysUserMapper.update(entity, updateWrapper);
}

 分页插件(IPage)

MyBatis-Plus提供了分页插件,使用它提供的插件能很方便的做成分页的功能,它提供了IPage接口用于定义分页模型,Page类用于分页模型的实现。分页插件的实现为PaginationInterceptor,这里不介绍它的原理,只是介绍它的使用,它的原理后续学习MyBatis插件原理时再讲解,MyBatis-Plus=分页非常方便,只需要传入IPage实例即可,如下为一个示例:

public void testSelectPage() {
    IPage<SysUser> page = new Page<SysUser>();
    page.setSize(5);
    IPage<SysUser> iPape = sysUserMapper.selectPage(page, new QueryWrapper().eq(true, "nickname", "wangke1"));
    System.out.println(iPape.getRecords());
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值