MybatisPlus知识点汇总

标签: Springboot 分类: 杂文 创建时间:2020-08-10 09:18:01 更新时间:2025-01-17 10:39:22

我不打算写入门了,其实入门很简单,网上一大堆的文章,从配置到编写代码,无所不包。这里我只是介绍我最近在开发的时候遇到的一些问题。

1.Invalid bound statement (not found): com.bibichuan.databases.service.WxUserService.getBaseMapper

使用MyBatisPlus进行处理的时候,实现了IService接口,实现了ServiceImpl类,在调用service接口的时候,还是报错了: Invalid bound statement (not found): com.bibichuan.databases.service.WxUserService.getBaseMapper

我尝试了添加主键,也还是会出现问题。

[解决方法]
1.就是再启动类main上添加:@MapperScan(“com.bibichuan.databases.mapper”),而且其中的:com.bibichuan.databases.mapper 要换成你自己的mapper所在文件夹,不能省略,不能写成 @MapperScan,否则也会报错。

参考文章:
1.MyBatis-Plus 通用IService使用介绍
2.出现 Invalid bound statement (not found) 异常 (这是官方给出的几个可能的原因)
3.SpringBoot使用@Mapper和@MapperScan注解无效的解决方法 (这个也没有解决问题)
4.springboot整合mybatisplus异常Invalid bound statement (not found) 1、jar冲突;2、配置文件及对应类的路径是否正确
5.mybatis plus报Invalid bound statement (not found):解决 1.检查是不是引入 jar 冲突;2.检查 Mapper.java 的扫描路径;3.检查命名空间是否正常? 检查包扫描路径typeAliasesPackage是否正常?如果扫描不到,MP 无法进行预注入;4.检查是否指定了主键?如未指定,则会导致 selectById 相关 ID 无法操作,请用注解 @TableId 注解表 ID 主键。当然 @TableId 注解可以没有!但是你的主键必须叫 id;5.SqlSessionFactory不要使用原生的,请使用MybatisSqlSessionFactory;

2.nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property ‘id’

of ‘class com.bibichuan.databases.entity.WxUserConfig’ with value ‘1349300934785359874’ Cause: java.lang.IllegalArgumentException: argument type mismatch

id号的类型不对,将Interge 改为int,还有一种情况,就是可能是id没有自增,设置id号自增就可以了:在实体类的主键id上增加一个注解 @TableId(type = IdType.AUTO)

3.当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘WxUserConfig’ 中的标识列插入显式值。

在使用mybatis plus进行插入的时候,默认的id号其实是0,所以插入的时候,就会报错。解决办法就是配置:id-type: auto

1
2
3
4
5
6
7
8
mybatis-plus:
configuration:
mapUnderscoreToCamelCase: false
global-config:
db-config:
tableUnderline: false
capitalMode: true
id-type: auto

很奇怪,修改了这个的值之后,在服务器上就是无法运行,但是本地确实可以运行。主要其实还是因为我使用了git merge ,修改的dev版本,并没有合并到master版本上面。

4.分页无效

添加一个Bean就可以了,有些文章还说需要手动在SqlSessionFactory中进行注入,但是我没有使用Druid数据库连接池,也没有进行手动的SqlSessionFactory配置编写,所以只需要添加一个PaginationInterceptor的Bean就可以了。

1
2
3
4
5
6
7
8
9
10
11
@Configuration
public class MyBatisPlusConfig {
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}

新版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 /**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER));
return interceptor;
}
// 避免缓存出现问题,我觉得有没有都可以
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}


@Primary
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
// 省略部分代码 ......
// 分页插件
Interceptor[] plugins = {mybatisPlusInterceptor()};
sqlSessionFactory.setPlugins(plugins);

return sqlSessionFactory.getObject();
}
参考文章:
1.MybatisPlus分页插件无效解决方案 (SqlSessionFactory中配置插件PaginationInterceptor)
2.mybatis-plus分页无效的问题 (SqlSessionFactory手动配置插件)
3.mybatis-plus分页无效, total=0问题(springmvc) (解决方案也是在数据源配置中显式添加分页插件)
4.SpringBoot整合MybatisPlus并实现分页查询 (这有些繁琐了)
5.【MP插件】- mybatis-plus分页无效、total、pages为0的问题 (添加分页器插件,去掉pom中pagehelper的相关依赖)
6.mybatis-plus分页无效, total=0问题(springmvc) 使用老的方法进行添加:sqlSessionFactory.setPlugins(new Interceptor[]{new PaginationInterceptor()}); 不过这样的使用方法已经过时了。
7.MybatisPlus分页插件无效解决方案 这是新版,也可以解决部分问题
8.分页插件 官方对分页插件的说明
9.Mybatis-plus新版本分页失效,PaginationInterceptor过时问题 这里有一个configuration -> configuration.setUseDeprecatedExecutor(false); 我看不懂,觉得没有用

5.The statement must be executed before any results can be obtained

我在执行批量更新的时候,第一个问题就是要设置id号为自动更新,第二个就是出现了上面问题。其实造成这个问题的原因是mybatis-plus默认使用Jdbc3KeyGenerator进行添加,但是sqlserver不支持批量返回id,所以会抛出如下异常。

后来我抛弃了批量更新的方法

参考文章:
1.使用SqlServer数据库mybatis-plus的批量新增方法报错 说了问题原因,但是实际上还是重写了 mybatis-plus 的批量插入语句实现的批量更新。
2.Mybatis plus 调用saveBatch错误(Sql server 数据库) 这里没人解决
3.MyBatis-Plus使用SQLserver数据库批量新增报错及解决 1.数据表主键,使用idworker;2.自定义批量新增语句,设置useGeneratedKeys为true,返回数据库自动生成的记录主键id

6.类型参数com.proheng.supenergy.mapper.VRealTimeMapper不在类型变量M的范围内

这个问题的主要原因就是VRealTimeMapper没有扩展BaseMapper接口,扩展下就可以了。

7。“@P0”附近有语法错误

直接在sercice层调用page方法获取分页信息,分页的时候,出现了这个问题。

1
2
Page<WxUserReg> wxUserRegPage=new Page<>(page,size);
Page<WxUserReg> pageList=wxUserRegService.(wxUserRegPage);

【解决方法】
有两种解决方法:
(1) 第一种:将paginationInnerInterceptor.setDbType(DbType.SQL_SERVER) 改为:paginationInnerInterceptor.setDbType(DbType.SQL_SERVER2005)即可!!!

1
2
3
4
5
6
7
8
9
10
/**
* MyBatisPlus拦截器(用于分页)
*/
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加MySQL的分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER2005));
return interceptor;
}

(2) 第二种:就是在进行查询点时候,不要直接使用page方法,需要增加一个查询条件,例如:

1
2
3
4
5
6
public Page<WxUserReg> getWxUserRegByPage(Integer page,Integer size){
QueryWrapper<WxUserReg> queryWrapper=new QueryWrapper<>();
queryWrapper.orderByAsc("RecordTime");
Page<WxUserReg> wxUserRegPage=new Page<>(page,size);
return this.page(wxUserRegPage,queryWrapper);
}
参考文章:
1.sqlserver2012使用page分页方法报错 解决了,看了下sqlserver的分页语句没发现OFFSET ? ROWS FETCH NEXT ? 要配合orderby使用。在QueryWrapper里加上了orderby
2.springboot+MybatisPlus+SqlServer2008分页 ‘@P0‘ 附近有语法错误 将paginationInnerInterceptor.setDbType(DbType.SQL_SERVER) 改为:paginationInnerInterceptor.setDbType(DbType.SQL_SERVER2005)即可!!!
3.mybatis 动态SQL ‘@P0’ 附近有语法错误

8.分页是从0开始的还是从1开始的

很久没有写java代码了,用到了分页,突然想到了分页到底是从零开始的还是从一开始的呢?因为我在早起的代码中,有的是默认是0,有的是默认为1,这让我自己都非常的困惑了。

9.操作符不存在: integer = character varying

在使用 mybatis plus 调用 listByIds 方法,操作 postgresql 数据库的时候,出现了这个问题。这个问题多数在Mybatis中也会遇到,就是需要修改 xml 文件,但是我用的是 Mybatis Plus 的啊。

1
2
3
4
// 根据id进行查询
String[] ids = list.split(",");
Collection<String> idList = Arrays.asList(ids);
Collection<Rfdwd> rfdwdsList=rfdwdService.listByIds(idList);

【解决方法】
解决方法就是将String类型的数组改为了Integer 类型的数组。

1
2
3
4
5
6
7
String[] ids = list.split(",");
Collection<Integer> idList=new ArrayList<>();
Arrays.stream(ids).forEach(id->{
Integer tempid=Integer.valueOf(id);
idList.add(tempid);
});
Collection<Rfdwd> rfdwdsList=rfdwdService.listByIds(idList);

querySysCementListByUserId 还有这个方法里面,也还是要修改。

1
2
3
<select id="querySysCementListByUserId" parameterType="String"  resultMap="SysAnnouncement">
<!--改为-->
<select id="querySysCementListByUserId" parameterType="Integer" resultMap="SysAnnouncement">
参考文章:
1.【Postgres SQL】报错:操作符不存在: character varying = integer(但是我的数据类型都是Integer) CAST( #{id} as int )
2.操作符不存在: integer = character varying 在Postgresql下面需要转换一下,CAST( #{id} as int )。或者是把传入的参数改成: {“ids”:[9,10]} 也可以。
3.mybatis postgresql 批量删除

10.org.apache.ibatis.ognl.OgnlException: source is null for getProperty

在我执行 updateById 的时候,出现了这个问题。很多的文章说是要修改 xml 语句,但是我根本就没有在 xml 语句中写更新的啊,都是自动生成的,难道我要重新把整个的语句写一遍吗?这样我还要使用 mybatis plus 干什么用呢?

【解决方案】
这个问题主要就是我更新了一个空的对象进去,所以出现了问题。

11.查询成功,返回结果为空

【解决方案】

1
2
3
4
5
6
7
// 错误
@TableField(value = "drc_sn")
private String drc_sn;

// 改为
@TableField(value = "drc_sn")
private String drcSn;
参考文章:
1.MyBatisPlus查询成功,但是返回结果为空 最终经过搜索,找到问题根源,实体里边的属性名不能有下划线!!!!
2.关于Mybatis-Plus的使用问题–明明可以查到数据,但是返回空!!

12.selectOne为空

我遇到了一个奇怪的问题,那就是用 mybatis plus 的时候,明明数据库有值,但是返回的结果却是空的。

1
2
3
4
5
6
public Integer checkPayloadExist(String payloadSn) {
DevicePayloadEntity devicePayload = mapper.selectOne(
new LambdaQueryWrapper<DevicePayloadEntity>()
.eq(DevicePayloadEntity::getPayloadSn, payloadSn));
return devicePayload != null ? devicePayload.getId() : -1;
}

【尝试方案】
我尝试在查询的时候,使用多个键

1
2
3
4
5
6
7
public Integer checkPayloadExist(String payloadSn) {
DevicePayloadEntity devicePayload = mapper.selectOne(
new LambdaQueryWrapper<DevicePayloadEntity>()
.select(DevicePayloadEntity::getId, DevicePayloadEntity::getPayloadSn)
.eq(DevicePayloadEntity::getPayloadSn, payloadSn));
return devicePayload != null ? devicePayload.getId() : -1;
}
参考文章:
【1】.mybatisplus selectOne查询,有数据,但返回为null 除了对象字段对不上以外,解决办法是select里再加上id,就可以使对象不为空。
【2】.MyBatis的selectOne()方法详解
【3】.QueryWrapper条件查询SelectCount为0,SelectOne为NULL,SelectList为[]

8.查询表名变成了大些

我在windows上开发,完全没有问题,但是部署到了服务器上,结果查询的时候就报错了:org.hsqldb.HsqlException: user lacks privilege or object not found: MANAGE_AGORA 。这里的 MANAGE_AGORA 是一个表名,但是我明明就写的是小写,而且数据里面也是小写,最后报错竟然是不存在这个表,我很纳闷。

【尝试方案】
(1)我尝试查询数据库的大小写的问题,结果数据库显示的是:lower_case_table_names = 1,大小写不敏感的。
(2)尝试本地直连服务器数据库,结果没有问题,但是就是打包之后,查询的表名就变成了大写了。

【解决方案】
最后的解决方案,竟然是因为我开启了内存数据库,但是实际上我没有这个表了,稀里糊涂的就解决了,除了对比配置文件之外,没有什么办法了。

1
2
quartz:
job-store-type: jdbc
参考文章:
【1】.在Linux上,myBatis “SELECT“失败,表名为大写 如何强制myBatis使用指定的小写名称”tablename“进行查询,而不是进行大写转换?
【2】.MySQL大小写敏感的解决方案 ①关于lower_case_table_names参数对表名称或数据库名称大小写敏感的控制。② Unix下默认为0,也就是大小写敏感的;Windows下默认为1,不敏感;macOS默认为2,存储区分大小写,但是在查询时会转换为小写。③ 对于在大小写不敏感的系统(Windows和macOS)不能将该字段设置为0。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。