MybatisPlus(简称MP)是一个Mybatis的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
只需要将一个Mapper继承BaseMapper即可完成单表的所有CRUD操作,形式之多样,功能之丰富,令人之叹服!
不想看测试用例的,可以直接看总结部分,对测试代码感兴趣的可以访问https://github.com/Cliff-Ford/mybatisplus-demo.git
//City实体类
@Data
@Builder
public class City {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
@TableField("CountryCode")
private String countryCode;
private String district;
private Integer population;
}
复制代码
//CityMapper
@Repository
@Mapper
public interface CityMapper extends BaseMapper<City> {
}
复制代码
//分页拦截器
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
复制代码
简介:根据id查找,返回一个实体类对象
注意:@TableId注解是否已打上
用例:
@Test
public void testSelectById() {
log.info(String.valueOf(cityMapper.selectById(1)));
}
复制代码 List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
简介:根据id数组进行查找,返回一个List对象
注意:id数组不可为null,数组长度必须大于0
用例:
@Test
public void testSelectBatchIds() {
log.info(String.valueOf(cityMapper.selectBatchIds(Arrays.asList(1, 2, 3, 4, 5))));
//log.info(String.valueOf(cityMapper.selectBatchIds(null)));
//log.info(String.valueOf(cityMapper.selectBatchIds(new ArrayList<>())));
}
复制代码 List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
简介:根据map对象查找,条件是等于,返回一个List对象
注意:map为null或者map对象内没有元素时进行全表查询
用例:
@Test
public void testSelectByMap() {
HashMap<String, Object> cityQueryMap = new HashMap<>();
cityQueryMap.put("district", "Rio Grande do Sul");
log.info(String.valueOf(cityMapper.selectByMap(cityQueryMap)));
//log.info(String.valueOf(cityMapper.selectByMap(null)));
//log.info(String.valueOf(cityMapper.selectByMap(new HashMap<>())));
}
复制代码 T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper查找,返回一个实体类对象或者null
注意:selectOne的查询结果数不是小于等于一条时会报错,如果根据id查询,通常用selectById,这里可能是联合索引/逻辑主键的一个使用
用例:
@Test
public void testSelectOne() {
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>()
.eq("id", 300)
.eq("countryCode", "BRA");
log.info(String.valueOf(cityMapper.selectOne(cityQueryWrapper)));
}
复制代码 Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper统计条数
注意:queryWrapper为null时统计全表记录数
用例:
@Test
public void testSelectCountWithoutWrapper() {
log.info(String.valueOf(cityMapper.selectCount(null)));
}
复制代码 List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper查找,返回一个List对象
注意:queryWrapper为null时全表查询
用例:
@Test
public void testSelectListWithoutWrapper() {
log.info(String.valueOf(cityMapper.selectList(null)));
}
@Test
public void testSelectListWithWrapper() {
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>().le("id", 300);
log.info(String.valueOf(cityMapper.selectList(cityQueryWrapper)));
}
复制代码 List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper查找,返回一个List对象,List内的元素是一个map对象
注意:map对象内的key是对应表的字段名
用例:
@Test
public void testSelectMaps() {
List<Map<String, Object>> maps = cityMapper.selectMaps(new QueryWrapper<City>().eq("name", "haha"));
log.info(String.valueOf(maps));
//每一个key都是表中的字段名
log.info(String.valueOf(maps.get(0).keySet()));
}
复制代码 List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper查找,返回一组id值
用例:
@Test
public void testSelectObjects() {
List<Object> cities = cityMapper.selectObjs(new QueryWrapper<City>().eq("name", "haha"));
//只返回id,有点奇怪
log.info(String.valueOf(cities));
if(cities.size() > 0){
log.info(String.valueOf(cities.get(0)));
}
}
复制代码 IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据queryWrapper分页查找,返回一个IPage对象
注意:是否配置了分页拦截器
用例:
@Test
public void testSelectPage() {
Page<City> cityPage = new Page<>(2,4);
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>().eq("name", "haha");
IPage<City> cityIPage = cityMapper.selectPage(cityPage, cityQueryWrapper);
if (cityIPage != null){
log.info(String.valueOf(cityIPage.getPages()));
log.info(String.valueOf(cityIPage.getTotal()));
log.info(String.valueOf(cityIPage.getCurrent()));
log.info(String.valueOf(cityIPage.getRecords()));
log.info(String.valueOf(cityIPage.getSize()));
}
}
复制代码 IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
简介:根据Wrapper查找,返回一个IPage对象,records内元素是一个个map对象
注意:map对象的key是对应表的字段名
用例:
@Test
public void testSelectMapsPage() {
Page<City> cityPage = new Page<>(2,4);
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>().eq("name", "haha");
IPage<Map<String, Object>> mapsPage = cityMapper.selectMapsPage(cityPage, cityQueryWrapper);
if(mapsPage != null){
log.info(String.format("当前页:%s", mapsPage.getCurrent()));
log.info(String.format("当前页条数:%d", mapsPage.getRecords().size()));
log.info(String.format("当前页记录:%s", mapsPage.getRecords()));
log.info(String.format("总页数:%s", mapsPage.getPages()));
log.info(String.format("总条数:%s", mapsPage.getTotal()));
log.info(String.format("每页最大条数:%s", mapsPage.getSize()));
}
}
复制代码 int insert(T entity);
简介:将构造的实体对象插入数据库
注意:如果数据库有自增id,注意@TableId是否正确选择了IdType,@Transactional和@Rollback结合一起使用才不会对数据库产生影响
用例:
@Test
@Transactional
@Rollback
public void testInsert() {
Integer beforeInsert = cityMapper.selectCount(null);
City city = City.builder().name("HaHa").countryCode("ARM").population(4800).build();
cityMapper.insert(city);
Integer afterInsert = cityMapper.selectCount(null);
log.info("id --> " + city.getId());
log.info("beforeInsert --> " + beforeInsert);
log.info("afterInsert --> " + afterInsert);
Assert.assertEquals(1, afterInsert-beforeInsert);
}
复制代码 简介:根据实体对象的id查找,再对查找到的记录进行修改,返回受影响的条数
用例:
@Test
@Transactional
@Rollback
public void testUpdateById1() {
City beforeUpdate = cityMapper.selectById(1);
log.info(String.valueOf(beforeUpdate));
City updateCity = City.builder().id(1).name("haha").build();
//updateCity对象中未设置值的字段保留原记录的值,而不是将原记录设置为空值,对比testUpdateById2会更好理解
int num = cityMapper.updateById(updateCity);
log.info(String.format("跟新了%d条", num));
City afterUpdate = cityMapper.selectById(1);
log.info(String.valueOf(afterUpdate));
}
@Test
@Transactional
@Rollback
public void testUpdateById2() {
City beforeUpdate = cityMapper.selectById(1);
log.info(String.valueOf(beforeUpdate));
beforeUpdate.setName("haha");
//beforeUpdate对象对目标字段的值做出了修改,对比testUpdateById1阅读
int num = cityMapper.updateById(beforeUpdate);
log.info(String.format("跟新了%d条", num));
City afterUpdate = cityMapper.selectById(1);
log.info(String.valueOf(afterUpdate));
}
复制代码 int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);简介:根据updateWrapper查找,再根据entity对象设值,返回受影响的条数
注意:updateWrapper为空时全表更新,用queryWrapper代替updateWrapper也行
用例:
@Test
@Transactional
@Rollback
public void testUpdateWithoutWrapper() {
City cityForUpdate = City.builder().name("a").build();
//严禁这种超危动作,测试用
int num = cityMapper.update(cityForUpdate, null);
log.info(String.format("更新了%d条", num));
}
@Test
@Transactional
@Rollback
public void testUpdateWithoutQueryWrapper() {
City cityForUpdate = City.builder().name("a").build();
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>().eq("name", "haha");
int num = cityMapper.update(cityForUpdate, cityQueryWrapper);
log.info(String.format("更新了%d条", num));
log.info(String.valueOf(cityMapper.selectList(new QueryWrapper<City>().eq("name","a"))));
}
@Test
@Transactional
@Rollback
public void testUpdateWithoutUpdateWrapper() {
City cityForUpdate = City.builder().name("a").build();
UpdateWrapper<City> cityUpdateWrapper = new UpdateWrapper<City>().eq("name", "haha");
int num = cityMapper.update(cityForUpdate, cityUpdateWrapper);
log.info(String.format("更新了%d条", num));
log.info(String.valueOf(cityMapper.selectList(new QueryWrapper<City>().eq("name","a"))));
}
复制代码 int deleteById(Serializable id);
简介:根据id删除,返回受影响的条数
用例:
@Test
@Transactional
@Rollback
public void testDeleteById() {
City cityBeforeDelete = cityMapper.selectById(3);
//deleteById方法返回受影响的条数
int num = cityMapper.deleteById(cityBeforeDelete.getId());
log.info(String.format("删除了%s条", num));
City cityAfterDelete = cityMapper.selectById(cityBeforeDelete.getId());
log.info(String.valueOf(cityAfterDelete));
}
复制代码 int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
简介:根据map对象删除,返回受影响的条数
注意:key=columnName,value=columnValue
用例:
@Test
@Transactional
@Rollback
public void testDeleteByMap() {
HashMap<String, Object> deleteMap = new HashMap<>();
deleteMap.put("name", "haha");
int num = cityMapper.deleteByMap(deleteMap);
log.info(String.format("删除了%d条", num));
}
复制代码 int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
简介:根据wrapper删除,返回受影响的条数
注意:wrapper为null时全表删除
用例:
@Test
@Transactional
@Rollback
public void testDeleteWithoutWrapper() {
int num = cityMapper.delete(null);
log.info(String.format("删除了%d条", num));
}
@Test
@Transactional
@Rollback
public void testDeleteWithWrapper() {
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<City>().eq("name", "haha");
int num = cityMapper.delete(cityQueryWrapper);
log.info(String.format("删除了%d条", num));
}
复制代码 int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
简介:根据id数组删除,返回受影响的条数
注意:数组不能为null,且size()大于0
用例:
@Test
@Transactional
@Rollback
public void testDeleteBatchIds() {
int num = cityMapper.deleteBatchIds(Arrays.asList(1, 2, 3, 4, 5));
log.info(String.format("删除了%d条", num));
}
复制代码 | 操作 | 入参 | 返回值 |
|---|---|---|
| selectById | 主键id | 实体类T |
| selectBatchIds | 主键id数组 | 实体类数组List<T> |
| selectByMap | Map对象 | 实体类数组List<T> |
| selectOne | queryWrapper | 实体类T |
| selectCount | queryWrapper | queryWrapper条件下的条目数 |
| selectList | queryWrapper | 实体类数组List<T> |
| selectMaps | queryWrapper | Map对象数组 |
| selectObjs | queryWrapper | id主键数组 |
| selectPage | queryWrapper | IPage<T>对象,包含了总记录条数,分页等信息 |
| insert | 实体对象T | 受影响条数 |
| updateById | 实体对象T | 受影响条数 |
| update | 实体对象T作为set部分,queryWrapper对象作为where查询部分 | 受影响条数 |
| deleteById | 主键id | 受影响条数 |
| deleteByMap | Map对象 | 受影响条数 |
| delete | queryWrapper对象作为where查询部分 | 受影响条数 |
| deleteBatchIds | 主键id数组 | 受影响条数 |