MybatisPlus
实体类注释字段
@TableName(“数据库表名”)
@TableId(“主键名”)
@TableField(“字段名”)
BaseMapper接口对象方法
普通查询
1、主键 T selectById(Serializable id)
使用场景为通过主键查询,只要该主键类型实现了Serialzable接口即可。
@Test
public void selectById() {User user = userMapper.selectById(6);System.out.println(user);
}
2、批量主键 List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList)
使用场景为通过主键的集合去批量查询,前提主键的类型实现了Serializable接口。
@Test
public void selectBatchById() {List<Long> userListId = Arrays.asList(1L, 2L, 3L);List<User> userList = userMapper.selectBatchIds(userListId);userList.forEach(System.out::println);
}
3、批量条件 List selectByMap(@Param(Constants.COLUMN_MAP) Map<String,Object> columnMap)
使用场景为传入一个Map集合,key为表字段,value为表字段值。注意:Map的key为数据表的字段名,不是实体类属性名。
@Test
public void selectByMap() {Map<String, Object> userMap = new HashMap<>();userMap.put("age", 20);List<User> userList = userMapper.selectByMap(userMap);userList.forEach(System.out::println);
}
条件构造器查询
BaseMapper以条件构造器(Wrapper)为参数的查询方法
批量条件 List selectList(@Param(Constans.WRAPPER) Wrapper queryWrapper):
实例
@Testvoid testWrapper3() {QueryWrapper<Person> wrapper=new QueryWrapper<>();wrapper.ne("age",18);List<Person> personList = personMapper.selectList(wrapper);personList.forEach(System.out::println);}
select不列出全部字段
select(String …columns)
condition作用
该条件决定是否加入最后生成的sql中,如果为true就加入,如果false就不加入,类似于动态的sql拼接。
传统方法
使用condition的方法
实体作为条件构造器构造方法的参数
QueryWrapper一个参数的构造方法,如果传入一个部不为null的对象,默认会进行进行等值比较,也就是where后拼接条件。
注:1.并且通过entity参数生成的等值和QueryWrapper的条件构造方法生成的没有任何关系。
2.可以通过在实体类上添加注解,指定该属性使用那种操作,默认使用等值。
AllEq用法
传入一个map集合对象,就会按照等值进行操作。key为字段名称,value为字段值。如果字段的值为null,那么sql就会拼接为is null这种形式。如果传入的null,想要忽略掉,也就是不进行拼接,那么就传入第二个参数为false。
其他使用条件构造器的方法
方法 | 说明 |
---|---|
selectMap | List集合的泛型不再是实体,而是map集合。其中key表示字段名,value表示字段值。 使用场景1:当实体类属性非常多时,不易查看。如果返回的是一个实体类,那么即使我们设定了返回字段,那么它的值为null,但是属性仍然存在。如果返回的是Map类型,当指定了返回字段时,那么没返回的就不会存在。 使用场景2:当返回的不是一条一条记录时,也就是返回的字段不在实体类属性中,比如一些统计,像平均值,最大值,最小值这样的。 |
selectObject | List集合的泛型不再是实体,而是Object,只返回第一个字段的值。其他的会被舍弃。 使用场景:只返回一列时可以使用它。 |
selectCount | 查询符合条件的总记录数的。 注意:使用它时,就不能指定返回的列了,因为它会在后面拼接COUNT(1)。 |
selectOne | 查询符合条件的数据,只会返回一条数据。 注意: 查询的结果必须是一条或者查不到(多于1条就会报错) |
更新、删除和插入操作
更新(可以用updateWrapper传递条件)
删除
插入
Mybatis的example类
mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建动态sql。如果表的字段比较多,产生的example类会十分庞大。理论上通过example类可以构造你想到的任何筛选条件。在mybatis-generator中加以配置,配置数据表的生成操作就可以自动生成example了。
mybatis 的mapper接⼝提供了增、删、改、查的⽅法。避免过多使⽤xml来直接写sql。
mapper接口中的函数及方法
方法名 | 功能 |
---|---|
int countByExample(UserExample example) | 按条件计数 |
int deleteByPrimaryKey(Integer id) | 按主键删除 |
int deleteByExample(UserExample example) | 按条件查询 |
String/Integer insert(User record) | 插入数据(返回值为ID) |
User selectByPrimaryKey(Integer id) | 按主键查询 |
ListselectByExample(UserExample example) | 按条件查询 |
ListselectByExampleWithBLOGs(UserExample example) | 按条件查询(包括BLOB字段)。只有当数据表中的字段类型有为二进制的才会产生。 |
int updateByPrimaryKey(User record) | 按主键更新 |
int updateByPrimaryKeySelective(User record) | 按主键更新值不为null的字段 |
int updateByExample(User record, UserExample example) | 按条件更新 |
int updateByExampleSelective(User record, UserExample example) | 按条件更新值不为null的字段 |
example实例方法
example 用于添加条件,相当于where后面的部分,理论上单表的任何复杂条件查询都可以使用example来完成。
方法 | 说明 |
---|---|
example.setOrderByClause(“字段名 ASC”); | 添加升序排列条件,DESC为降序 |
example.setDistinct(false) | 去除重复,boolean型,true为选择不重复的记录。 |
example.and(Criteria criteria) | 为example添加criteria查询条件,关系为与 |
example.or(Criteria criteria) | 为example添加criteria查询条件,关系为或 |
criteria.andXxxIsNull | 添加字段xxx为null的条件 |
criteria.andXxxIsNotNull | 添加字段xxx不为null的条件 |
criteria.andXxxEqualTo(value) | 添加xxx字段等于value条件 |
criteria.andXxxNotEqualTo(value) | 添加xxx字段不等于value条件 |
criteria.andXxxGreaterThan(value) | 添加xxx字段大于value条件 |
criteria.andXxxGreaterThanOrEqualTo(value) | 添加xxx字段大于等于value条件 |
criteria.andXxxLessThan(value) | 添加xxx字段小于value条件 |
criteria.andXxxLessThanOrEqualTo(value) | 添加xxx字段小于等于value条件 |
criteria.andXxxIn(List<?>) | 添加xxx字段值在List<?>条件 |
criteria.andXxxNotIn(List<?>) | 添加xxx字段值不在List<?>条件 |
criteria.andXxxLike(“%”+value+”%”) | 添加xxx字段值为value的模糊查询条件 |
criteria.andXxxNotLike(“%”+value+”%”) | 添加xxx字段值不为value的模糊查询条件 |
criteria.andXxxBetween(value1,value2) | 添加xxx字段值在value1和value2之间条件 |
criteria.andXxxNotBetween(value1,value2) | 添加xxx字段值不在value1和value2之间条件 |
常见用法
排序查询
@Overridepublic UpgradeNotifyInfoDTO queryLatestNotify(Integer appType) {UpgradeNotifyInfoDTO notifyDTO=new UpgradeNotifyInfoDTO();SportAppUpgradeNotifyExample example = new SportAppUpgradeNotifyExample();//法1example.setOrderByClause("`create_time` desc");SportAppUpgradeNotifyExample.Criteria criteria = example.createCriteria();criteria.andAppTypeEqualTo(appType);// 0- 禁用 1-启用criteria.andStatusEqualTo(1);//法2直接合并来写example.setOrderByClause("`create_time` desc").createCriteria().andAppTypeEqualTo(appType).andStatusEqualTo(1);List<SportAppUpgradeNotify> list = upgradeNotifyMapper.selectByExample(example);if (!CollectionUtils.isEmpty(list)){BeanUtils.copyProperties(list.get(0),notifyDTO);}return notifyDTO;}
查询limit, 只返回前50条数据
通过Pagehelper做分页查询,那么limit同样可以使用Pagehelper。如下,查询符合条件中的前50条。这里不会返回数据总数 count。
public List<ShopCityInfoRespDTO> queryShopList(String shopCityName,String shopCityId) {List<ShopCityInfoRespDTO> shopCityList = new ArrayList<>();//设置查询条件ShopInfoExample example = new ShopInfoExample();ShopInfoExample.Criteria criteria = example.createCriteria();criteria.andStatusEqualTo("0");if(!StringUtils.isEmpty(shopCityId)) {criteria.andShopIdEqualTo(shopCityId);}if(!StringUtils.isEmpty(shopCityName)) {criteria.andShopNameLike("%" + shopCityName + "%");}// 这里限制查询50条数据,但不能返回总数PageHelper.startPage(1, 50);List<ShopInfo> shopInfoList = shopInfoMapper.selectByExample(example);if(CollectionUtils.isEmpty(shopInfoList)){return shopCityList;}for (ShopInfo shopInfo : shopInfoList){ShopCityInfoRespDTO respDTO = new ShopCityInfoRespDTO();respDTO.setCompanyId(shopInfo.getCompanyId());respDTO.setShopCityId(shopInfo.getShopId());respDTO.setShopCityName(shopInfo.getShopName());respDTO.setShopCityCode(shopInfo.getShopCode());respDTO.setShopType(1);shopCityList.add(respDTO);}return shopCityList;}
参考文章
MyBatis的Example类详解 - 稷下元歌 - 博客园 (cnblogs.com)https://www.cnblogs.com/fgxwan/p/16977628.htmlMyBatis-Plus快速入门-(干货满满+超详细)_mybatis-plus 入门-CSDN博客https://blog.csdn.net/weixin_45537947/article/details/111399311