6.统计查询
@GetMapping(value = "/selectCountByEntity") public int selectCount(String name){ Teacher teacher=new Teacher(); teacher.setId(1); teacher.setTeacherName(name); EntityWrapper<Teacher> entityWrapper=new EntityWrapper<>(teacher); return teacherMapper.selectCount(entityWrapper); } 复制代码
生成的sql语句:
SELECT COUNT(1) FROM teacher WHERE id=1 AND teacher_name='qwe'; 复制代码
7.分页查询
在实际开发中,分页查询功能一直是非常普遍需要运用到的一点,在mybatis-plus里面,他提供了一个叫做Page的类供我们使用,相应的代码如下所示:
@GetMapping(value = "/selectAllInPage") public List<Teacher> selectAllInPage(int pageNumber,int pageSize){ Page<Teacher> page =new Page<>(pageNumber,pageSize); EntityWrapper<Teacher> entityWrapper = new EntityWrapper<>(); entityWrapper.ge("id", 1); return teacherMapper.selectPage(page,entityWrapper); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (id >= 1) LIMIT 0,1; 复制代码
mybatis-plus使用的分页技术是传统的 limit 物理分页方式。
8. in 查询
查询的时候,如果需要使用in查询的话,可以使用selectBatchIds这个api功能:
@GetMapping(value = "/selectInIdArr") public List<Teacher> selectInIdArr(){ List<Integer> idList=new ArrayList<>(); idList.add(1); idList.add(10); idList.add(11); return teacherMapper.selectBatchIds(idList); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE id IN ( 1 , 10 , 11 ); 复制代码
9.复杂条件查询
针对于比较复杂的多条件查询,mybatis-plus内部提供的EntityWrapper支持有许多丰富的查询api功能供我们使用。
为了方便理解,下边通过实际的代码案例来进行解释
allEq查询(相当于条件全部都要求满足的情况)
@GetMapping(value = "/selectAllByWrapper1") public List<Teacher> selectAllByWrapper1(){ Map<String,Object> map=new HashMap<>(); map.put("teacher_name","name"); map.put("teacher_pwd","pwd"); EntityWrapper entity=new EntityWrapper(); entity.allEq(map); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_pwd = 'pwd' AND teacher_name = 'name'); 复制代码
ne查询
@GetMapping(value = "/selectAllByWrapper3") public List<Teacher> selectAllByWrapper3(){ EntityWrapper entity=new EntityWrapper(); entity.ne("teacher_name","name"); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_name <> 'name'); 复制代码
eq查询
@GetMapping(value = "/selectAllByWrapper2") public List<Teacher> selectAllByWrapper2(){ EntityWrapper entity=new EntityWrapper(); entity.eq("teacher_name","name"); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (teacher_name = 'name'); 复制代码
复杂的多条件查询:
@GetMapping(value = "/selectAllByWrapper4") public List<Teacher> selectAllByWrapper4(){ EntityWrapper entity=new EntityWrapper(); entity.gt("id","0"); entity.le("id",11); entity.ne("teacher_name","null_name"); entity.like("teacher_name","tt"); entity.notLike("teacher_pwd","sadas"); entity.orderBy("id"); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id, teacher_name AS teacherName, teacher_pwd AS teacherPwd FROM teacher WHERE ( id > '0' AND id <= 11 AND teacher_name <> 'null_name' AND teacher_name LIKE '%tt%' AND teacher_pwd NOT LIKE '%sadas%' ) ORDER BY id; 复制代码
组合的and和or条件查询:
@GetMapping(value = "/selectAllByWrapper5") public List<Teacher> selectAllByWrapper5(){ EntityWrapper entity=new EntityWrapper(); entity.where("id>1").orNew("id=0") .and("teacher_name='name'") .isNull(false,"teacher_pwd"); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher WHERE (id>1) OR (id=0 AND teacher_name='name' AND teacher_pwd IS NULL); 复制代码
having和groupby查询:
@GetMapping(value = "/selectAllByWrapper6") public List<Teacher> selectAllByWrapper6(){ EntityWrapper entity=new EntityWrapper(); entity.groupBy("teacher_name"); entity.having("id>1"); return teacherMapper.selectList(entity); } 复制代码
生成的sql语句:
SELECT id,teacher_name AS teacherName,teacher_pwd AS teacherPwd FROM teacher GROUP BY teacher_name HAVING (id>1); 复制代码
除了常规的基于Mapper的直接操作数据库操作功能以外,Mybatis-plus内部还提供了一个叫做IService的接口,内部含有很多丰富的CRUD操作功能可以供开发人员调用:
/** * Copyright (c) 2011-2016, hubin (jobob@qq.com). * <p> * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.baomidou.mybatisplus.service; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; /** * <p> * 顶级 Service * </p> * * @author hubin * @Date 2016-04-20 */ public interface IService<T> { /** * <p> * 插入一条记录(选择字段,策略插入) * </p> * * @param entity 实体对象 * @return boolean */ boolean insert(T entity); /** * <p> * 插入一条记录(全部字段) * </p> * * @param entity 实体对象 * @return boolean */ boolean insertAllColumn(T entity); /** * <p> * 插入(批量),该方法不适合 Oracle * </p> * * @param entityList 实体对象列表 * @return boolean */ boolean insertBatch(List<T> entityList); /** * <p> * 插入(批量) * </p> * * @param entityList 实体对象列表 * @param batchSize 插入批次数量 * @return boolean */ boolean insertBatch(List<T> entityList, int batchSize); /** * <p> * 批量修改插入 * </p> * * @param entityList 实体对象列表 * @return boolean */ boolean insertOrUpdateBatch(List<T> entityList); /** * <p> * 批量修改插入 * </p> * * @param entityList 实体对象列表 * @param batchSize * @return boolean */ boolean insertOrUpdateBatch(List<T> entityList, int batchSize); /** * <p> * 批量修改或插入全部字段 * </p> * * @param entityList 实体对象列表 * @return boolean */ boolean insertOrUpdateAllColumnBatch(List<T> entityList); /** * 批量修改或插入全部字段 * * @param entityList 实体对象列表 * @param batchSize * @return boolean */ boolean insertOrUpdateAllColumnBatch(List<T> entityList, int batchSize); /** * <p> * 根据 ID 删除 * </p> * * @param id 主键ID * @return boolean */ boolean deleteById(Serializable id); /** * <p> * 根据 columnMap 条件,删除记录 * </p> * * @param columnMap 表字段 map 对象 * @return boolean */ boolean deleteByMap(Map<String, Object> columnMap); /** * <p> * 根据 entity 条件,删除记录 * </p> * * @param wrapper 实体包装类 {@link Wrapper} * @return boolean */ boolean delete(Wrapper<T> wrapper); /** * <p> * 删除(根据ID 批量删除) * </p> * * @param idList 主键ID列表 * @return boolean */ boolean deleteBatchIds(Collection<? extends Serializable> idList); /** * <p> * 根据 ID 选择修改 * </p> * * @param entity 实体对象 * @return boolean */ boolean updateById(T entity); /** * <p> * 根据 ID 修改全部字段 * </p> * * @param entity 实体对象 * @return boolean */ boolean updateAllColumnById(T entity); /** * <p> * 根据 whereEntity 条件,更新记录 * </p> * * @param entity 实体对象 * @param wrapper 实体包装类 {@link Wrapper} * @return boolean */ boolean update(T entity, Wrapper<T> wrapper); /** * <p> * 根据 whereEntity 条件,自定义set值更新记录 * </p> * * @param setStr set值字符串 * @param wrapper 实体包装类 {@link Wrapper} * @return boolean */ boolean updateForSet(String setStr, Wrapper<T> wrapper); /** * <p> * 根据ID 批量更新 * </p> * * @param entityList 实体对象列表 * @return boolean */ boolean updateBatchById(List<T> entityList); /** * <p> * 根据ID 批量更新 * </p> * * @param entityList 实体对象列表 * @param batchSize 更新批次数量 * @return boolean */ boolean updateBatchById(List<T> entityList, int batchSize); /** * <p> * 根据ID 批量更新全部字段 * </p> * * @param entityList 实体对象列表 * @return boolean */ boolean updateAllColumnBatchById(List<T> entityList); /** * <p> * 根据ID 批量更新全部字段 * </p> * * @param entityList 实体对象列表 * @param batchSize 更新批次数量 * @return boolean */ boolean updateAllColumnBatchById(List<T> entityList, int batchSize); /** * <p> * TableId 注解存在更新记录,否插入一条记录 * </p> * * @param entity 实体对象 * @return boolean */ boolean insertOrUpdate(T entity); /** * 插入或修改一条记录的全部字段 * * @param entity 实体对象 * @return boolean */ boolean insertOrUpdateAllColumn(T entity); /** * <p> * 根据 ID 查询 * </p> * * @param id 主键ID * @return T */ T selectById(Serializable id); /** * <p> * 查询(根据ID 批量查询) * </p> * * @param idList 主键ID列表 * @return List<T> */ List<T> selectBatchIds(Collection<? extends Serializable> idList); /** * <p> * 查询(根据 columnMap 条件) * </p> * * @param columnMap 表字段 map 对象 * @return List<T> */ List<T> selectByMap(Map<String, Object> columnMap); /** * <p> * 根据 Wrapper,查询一条记录 * </p> * * @param wrapper 实体对象 * @return T */ T selectOne(Wrapper<T> wrapper); /** * <p> * 根据 Wrapper,查询一条记录 * </p> * * @param wrapper {@link Wrapper} * @return Map<String,Object> */ Map<String, Object> selectMap(Wrapper<T> wrapper); /** * <p> * 根据 Wrapper,查询一条记录 * </p> * * @param wrapper {@link Wrapper} * @return Object */ Object selectObj(Wrapper<T> wrapper); /** * <p> * 根据 Wrapper 条件,查询总记录数 * </p> * * @param wrapper 实体对象 * @return int */ int selectCount(Wrapper<T> wrapper); /** * <p> * 查询列表 * </p> * * @param wrapper 实体包装类 {@link Wrapper} * @return */ List<T> selectList(Wrapper<T> wrapper); /** * <p> * 翻页查询 * </p> * * @param page 翻页对象 * @return */ Page<T> selectPage(Page<T> page); /** * <p> * 查询列表 * </p> * * @param wrapper {@link Wrapper} * @return */ List<Map<String, Object>> selectMaps(Wrapper<T> wrapper); /** * <p> * 根据 Wrapper 条件,查询全部记录 * </p> * * @param wrapper 实体对象封装操作类(可以为 null) * @return List<Object> */ List<Object> selectObjs(Wrapper<T> wrapper); /** * <p> * 翻页查询 * </p> * * @param page 翻页对象 * @param wrapper {@link Wrapper} * @return */ @SuppressWarnings("rawtypes") Page<Map<String, Object>> selectMapsPage(Page page, Wrapper<T> wrapper); /** * <p> * 翻页查询 * </p> * * @param page 翻页对象 * @param wrapper 实体包装类 {@link Wrapper} * @return */ Page<T> selectPage(Page<T> page, Wrapper<T> wrapper); } 复制代码
在使用的过程中,mybatis-plus还能兼容原有mybatis的xml和注解模式的sql拼写功能。
mybatis-plus这种集mybatis与hibernate的优点一起的框架。提供了hibernate的单表CRUD操作的方便同时,又保留了mybatis的特性。不得不说mybatis-plus的出现搭配上原有的mybatis框架极大的促进了开发效率的提升,同时基友搭配,效率翻倍。因此也有人把它们比做成魂斗罗里面的两兄弟,基友搭配,效率翻倍。
本案例的代码链接:gitee.com/IdeaHome_ad…