mybatis-plus簡稱MP是一個 Mybatis 的加強工具,在 Mybatis 的基礎上只作加強不作改變,爲簡化開發、提升效率而生。前端
這是官方給的定義,關於mybatis-plus的更多介紹及特性,能夠參考mybatis-plus官網 。那麼它是怎麼加強的呢?其實就是它已經封裝好了一些crud方法,咱們不須要再寫xml了,直接調用這些方法就行,就相似於JPA。java
下面是在MP
爲基礎封裝了一個查詢類,實現了若是須要增長查詢條件只需在前端修改便可。git
查詢工具
- 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對象便可完成一個查詢服務,查詢條件經過前端傳入的字段控制github
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層的方法整理了一下,又減小了一些代碼量json
代碼地址api
使用示例mybatis