MyBatis-Plus 通用查询工具类

mybatis-plus简称MP是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网 。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

下面是在MP为基础封装了一个查询类,实现了如果需要增加查询条件只需在前端修改即可。

查询工具

  • SearchModel
public class SearchModel<T> {

    private Integer pageIndex;
    private Integer pageSize;
    private List<Field> fields;
    private String orderField;
    private boolean isAsc;

    public IPage<T> getPage() {
        IPage<T> page = new Page<>(pageIndex, pageSize);
        if (!StringUtil.isEmptyOrNull(orderField)) {
            OrderItem orderItem = new OrderItem();
            orderItem.setAsc(isAsc);
            orderItem.setColumn(orderField);
            page.orders().add(orderItem);
        }
        return page;

    }

    public QueryWrapper<T> getQueryModel() {
        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        for (Iterator iter = this.fields.iterator(); iter.hasNext(); ) {
            Field field = (Field) iter.next();
            switch (field.getQueryMethod()) {
                case eq:
                    queryWrapper.eq(true, field.getName(), field.getValue());
                    break;
                case like:
                    queryWrapper.like(true, field.getName(), field.getValue());
            }
        }

        if (!StringUtil.isEmptyOrNull(orderField)) {
            queryWrapper.orderBy(true, isAsc, orderField);
        }
        return queryWrapper;
    }
}
  • Field
public class Field {
    public Field(String name, Object value) {
        this.name = name;
        this.value = value;
        this.queryMethod = QueryMethod.eq;
    }

    public Field(String name, Object value, QueryMethod queryMethod) {
        this.name = name;
        this.value = value;
        this.queryMethod = queryMethod;
    }

    private String name;
    private Object value;
    private QueryMethod queryMethod;
}
  • QueryMethod
public enum QueryMethod {
    eq, like
}

调用示例

 {
 "fields": [
             {
             "value": "v",
             "name": "project_code",
             "queryMethod": "eq"
             },
             {
             "name": "type",
             "queryMethod": "like",
            "value": "b"
             },
             {
             "name": "id",
             "queryMethod": "like",
             "value": "a"
             }
 ],
 "pageIndex": 1,
 "pageSize": 8,
 "orderField": "type",
 "isAsc": "false"
 }

在api中传入上面的json对象即可完成一个查询服务,查询条件通过前端传入的字段控制

BaseService

  • IBaseService

public interface IBaseService<T> {

    T save(T entity) throws Exception;

    boolean saveBatch(Collection<T> entityList);


    // TableId 注解存在更新记录,否插入一条记录
    boolean saveOrUpdate(T entity);

    // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
    boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

    // 批量修改插入
    boolean saveOrUpdateBatch(Collection<T> entityList);

    // 根据 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);

    List<T> list();

    // 查询列表
    List<T> list(SearchModel<T> searchModel);

    // 查询(根据ID 批量查询)
    Collection<T> listByIds(Collection<? extends Serializable> idList);

    // 查询(根据 columnMap 条件)
    Collection<T> listByMap(Map<String, Object> columnMap);

    // 翻页查询
    IPage<T> page(SearchModel<T> searchModel);

    T selectById(Serializable id);

    T selectOne(Wrapper<T> queryWrapper);
}

  • BaseServiceImpl
public class BaseServiceImpl<M extends BaseMapper<T>, T> implements IBaseService<T> {

   @Autowired
   private M baseMapper;


   @Override
   public T save(T entity) throws Exception {
       baseMapper.insert(entity);
       return entity;
   }

   @Transactional(rollbackFor = RuntimeException.class)
   @Override
   public boolean saveBatch(Collection<T> entityList) {
       Integer size = entityList.size();
       for (T entity : entityList) {
           baseMapper.insert(entity);
           size++;
       }
       return size == entityList.size();
   }

   @Override
   public boolean saveOrUpdate(T entity) {
       int rs = baseMapper.updateById(entity);
       if (rs > 0) return true;
       return baseMapper.insert(entity) > 0;
   }

   @Override
   public boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {


       return false;
   }

   @Transactional(rollbackFor = RuntimeException.class)
   @Override
   public boolean saveOrUpdateBatch(Collection<T> entityList) {

       for (T entity : entityList) {
           saveOrUpdate(entity);
       }
       return true;
   }

   @Override
   public boolean remove(Wrapper<T> queryWrapper) {
       return baseMapper.delete(queryWrapper) > 0;
   }

   @Override
   public boolean removeById(Serializable id) {
       return baseMapper.deleteById(id) > 0;
   }

   @Override
   public boolean removeByMap(Map<String, Object> columnMap) {
       return baseMapper.deleteByMap(columnMap) > 0;
   }

   @Override
   public boolean removeByIds(Collection<? extends Serializable> idList) {
       return baseMapper.deleteBatchIds(idList) > 0;
   }

   @Override
   public List<T> list() {
       return baseMapper.selectList(new QueryWrapper<T>());
   }

   @Override
   public List<T> list(SearchModel<T> searchModel) {
       return baseMapper.selectList(searchModel.getQueryModel());
   }

   @Override
   public Collection<T> listByIds(Collection<? extends Serializable> idList) {
       return baseMapper.selectBatchIds(idList);
   }

   @Override
   public Collection<T> listByMap(Map<String, Object> columnMap) {
       return baseMapper.selectByMap(columnMap);
   }


   @Override
   public IPage<T> page(SearchModel<T> searchModel) {
       return baseMapper.selectPage(searchModel.getPage(), searchModel.getQueryModel());

   }

   @Override
   public T selectById(Serializable id) {
       return baseMapper.selectById(id);
   }

   @Override
   public T selectOne(Wrapper<T> queryWrapper) {
       return baseMapper.selectOne(queryWrapper);
   }
}

MP实现了mapper层基础的CRUD方法,这里把一些常用的service层的方法整理了一下,又减少了一些代码量

代码地址

使用示例

Mybatis-plusMyBatis增强工具包,用于简化CRUD操作。该工具包为MyBatis提供了一些高效,有用,即用的功能,使用它可以有效地节省您的开发时间。Mybatis-plus特征与MyBatis完全兼容 启动时自动配置 开箱即用的用于操作数据库的界面 强大而灵活的条件包装器 生成主键的多种策略 Lambda样式的API 全能和高度可定制的代码生成器 自动分页操作 SQL注入防御 支持活动记录 支持可插拔的自定义界面 内置许多有用的扩展Mybatis-plus功能1、单表CURD(简单 + 批量)操作,自动完成(支持 like 比较等查询)。 2、分页插件,Count查询自动或自定义SQL查询。 3、Spring根据不同环境加载不同配置支持(支持typeAliasesPackage通配符扫描)。 【自动生成Entity Mapper Service文件】Mybatis-plusMybatis增强工具包) v3.3.2更新日志分页参数提取,单元测试用例修复 达梦数据库代码生成器表过滤支持 微软数据库代码生成器表过滤支持 修复代码生成器属性字段规则错误 SelectById 支持自定义方法名 修复分页插件获取数据库型问题 Json转换器空值处理 bugfix(mybatis-plus-generator):SQL型返回错误问题 调整未知方言异常,自动识别url转换小写匹配. fix: 初始化TableInfo中遇到多个字段有@TableId注解时未能抛出异常的问题 SuperController有Class参数的set方法 增加方法StrategyConfig.setSuperServiceImplClass(java.lang.Class<?>). 代码生成器命名策略调整. 扩展分页缓存key值计算. 去除方法推测,直接访问属性字段. 修正枚举处理器型不匹配比较. 修改表前缀匹配方式 修改在Mybatis全局配置文件中设置分页插件参数不生效问题 修改在Mybatis全局配置文件中设置分页插件参数不生效问 修复PR未指定解析器的时候引发空指针 增加分页插件limit参数配置 修复指定superEntityClass重复生成父字段问题 无主键的情况无需导入IdType与TableId包 调整生成BaseResultMap格式 支持lombok模式下选择是否进行链式set生成 修复解析器for update错误 过滤PG约束列(只留下主键约束) 增加生成器禁用模板生成 fix(kotlin): 修复动态表名BUG,最大努力替换表名 修复PG约束生成重复属性字段问题 fix(kotlin): 将LambdaUtils中缓存的key改为String 代码生成器增加数据库关键字处理接口 fix github/issues/2454 支持注解可继承 新增 AES 加密数据库用户名密码 优化方法入参泛型,支持更多型 修复代码生成器开启移除is前缀生成实体缺少包导入 fixed github issues/2470Mybatis-plus截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值