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可以用于函数的使用

mysql 中 PIVOT 如何用 mysql plus使用querywrapper_List


踩坑如下:

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等包装类型,这样才会正常进行查找