Mybatis-plus参考汇总
- 一、mybatis-plus源码
- 二、注解
- 三、BaseMapper
- 四、QueryWrapper构造器
- 4.1参考
- 4.2完整使用过程
- 4.3数据类型
本文主要整理了在使用过程中解决遇到的问题的参考文章
一、mybatis-plus源码
二、注解
注解 | 说明 |
1.@TableName | 表名注解,标识实体类对应的表 |
2.@TableId | 主键注解 |
3.IdType | id赋值的形式,自增或输入或算法 |
4.@TableField | 字段注解,非主键 |
5.FieldStrategy | 字段策略,非null,非空,不加入sql,忽略判断等 |
6.FieldFill | 字段填充策略,插入时填充,更新时填充,都填充 |
7.@Version | 乐观锁注解 |
8.@EnumValue | 当实体类的属性是普通枚举,且是其中一个字段,使用该注解来标注枚举类里的那个属性对应字段 |
9.@TableLogic | 表字段逻辑处理注解(逻辑删除) |
10.@SqlParser (opens new window) | |
11.@KeySequence | 序列主键策略 |
12.@InterceptorIgnore | 内置插件的一些过滤规则 |
13.@OrderBy | 自动排序,用法与SpringDtaJpa的OrderBy类似,在执行MybatisPlus的方法selectList(),Page()等非手写查询时自动带上. |
注意,如果一个对象的各个属性先有值,然后再修改,去除值,保存。再次打开,值不变。
因为,默认机制会过滤掉null值的字段,所以不会保存新的空值。此时可以通过在实体类需要插入null值的字段上加上@TableField(updateStrategy = FieldStrategy.IGNORED)解决
三、BaseMapper
特别地,apply可以用于函数的使用
踩坑如下:
SELECT COUNT(1) FROM order WHERE to_days(create_time) = ?
Parameters: to_days(NOW())(String)
此时获取不到数据,是因为传入的参数当做String类型传入的,并不是一个函数,类似添加了""拼接成字串
这是因为querywrapper使用的是eq函数,可以改为使用apply函数,修改后解决!
原:queryWrapper.eq("to_days(create_time)","to_days(NOW())");
现:queryWrapper.apply("to_days(create_time)=to_days(NOW())");
四、QueryWrapper构造器
4.2完整使用过程
//controller层
QueryWrapper<User> queryWrapper = QueryGenerator.initQueryWrapper(user, req.getParameterMap());
queryWrapper.between("age",begin,end);
如果req中传来的参数需要做一些修改,比如查询时用到了表的别名,或者传来的参数不是表中的字段,或者不希望带入该条件查询,可以做如下修改
Map<String, String[]> parameterMap=new HashMap(req.getParameterMap());
parameterMap.remove(QueryGenerator.ORDER_COLUMN);
parameterMap.remove(QueryGenerator.ORDER_TYPE);
QueryWrapper<Video> queryWrapper = QueryGenerator.initQueryWrapperCode(user, parameterMap);
'IService’层
List<User> getUserList(QueryWrapper<User> queryWrapper);
Service层
@Override
public List<User> getUserList(QueryWrapper<User> queryWrapper) {
return userMapper.getUserList(queryWrapper);
}
Mapper层
import com.baomidou.mybatisplus.core.toolkit.Constants;//导类
@Select("SELECT * from sys_user ${ew.customSqlSegment}")
List<User> getUserList(@Param(Constants.WRAPPER) Wrapper ew); //参数接收固定写法
注意,ew.customSqlSegment获取的值自带where,ew.sqlSegment值不包括WHERE字符串
ew其实就是mapper方法里的@Param(Constants.WRAPPER) Wrapper query对象,Constants.WRAPPER的值就是ew。
如果出现service层调用mapper层报错,且方法名参数都正确,请确认service的QueryWrapper导入的包是“com.baomidou.mybatisplus.core.conditions.query.QueryWrapper”,mapper层导入的包是“com.baomidou.mybatisplus.core.conditions.Wrapper”。
带分页:
//mapper
List<Vedio> queryCountList(Page<Vedio> page,
@Param(Constants.WRAPPER) Wrapper ew,
@Param("buyUser")String buyUser);
//Service
@Override
public Page<Vedio> queryCountList(Page<Vedio> page, QueryWrapper<Vedio> queryWrapper,String buyUser) {
return page.setRecords(mapper.queryCountList(page,queryWrapper,buyUser));
}
//IService
Page<Vedio> queryCountList(Page<Vedio> page, QueryWrapper<Vedio>
queryWrapper,String buyUser);
//controller
@GetMapping(value = "/countList")
public Result<IPage<Vedio>> queryCountList(Vedio vedio,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Result<Page<Vedio>> result = new Result<Page<Vedio>>();
Page<Vedio> pageList = new Page<Vedio>(pageNo,pageSize);
QueryWrapper<Vedio> queryWrapper= QueryGenerator.initQueryWrapperCode();
if(StringUtils.isNotEmpty(vedio.getCode())){
queryWrapper.like("f.code",vedio.getCode());
}
queryWrapper.orderByDesc("f.apply_time");
pageList=service.queryCountList(pageList,queryWrapper,buyUser);
List<Vedio> list=pageList.getRecords();
result.setResult(pageList);
return Result.OK(pageList);
}
4.3数据类型
在使用querywrapper进行查询时会动态的构建查询条件,对于字符类型的空值,会将其直接过滤,查询有给定值得字段,而对于常用的几个数值类型如int,double,float类型,会默认为0,查询的时候会查询该字段为0的数据。对于这种数值类型应该使用Integer,Double,Float等包装类型,这样才会正常进行查找