MybatisPlus知识点汇总
我不打算写入门了,其实入门很简单,网上一大堆的文章,从配置到编写代码,无所不包。这里我只是介绍我最近在开发的时候遇到的一些问题。
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)
1.插入报错org.apache.ibatis.reflection.ReflectionException: Could not set property ‘id‘ of ‘class
2.Mybatis-plus 插入数据时,主键id报错,Cause: java.lang.IllegalArgumentException: argument type mismatch
3.当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘WxUserConfig’ 中的标识列插入显式值。
在使用mybatis plus进行插入的时候,默认的id号其实是0,所以插入的时候,就会报错。解决办法就是配置:id-type: auto
1 | mybatis-plus: |
很奇怪,修改了这个的值之后,在服务器上就是无法运行,但是本地确实可以运行。主要其实还是因为我使用了git merge ,修改的dev版本,并没有合并到master版本上面。
1.mybatisplus 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘xx’ 中的标识列插入显式值
2.当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值 (这里有对数据库IDENTITY_INSERT设置的说明)
4.分页无效
添加一个Bean就可以了,有些文章还说需要手动在SqlSessionFactory中进行注入,但是我没有使用Druid数据库连接池,也没有进行手动的SqlSessionFactory配置编写,所以只需要添加一个PaginationInterceptor的Bean就可以了。
1 |
|
新版
1 | /** |
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 | Page<WxUserReg> wxUserRegPage=new Page<>(page,size); |
【解决方法】
有两种解决方法:
(1) 第一种:将paginationInnerInterceptor.setDbType(DbType.SQL_SERVER) 改为:paginationInnerInterceptor.setDbType(DbType.SQL_SERVER2005)即可!!!
1 | /** |
(2) 第二种:就是在进行查询点时候,不要直接使用page方法,需要增加一个查询条件,例如:
1 | public Page<WxUserReg> getWxUserRegByPage(Integer page,Integer size){ |
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,这让我自己都非常的困惑了。
1.MyBatis-Plus 分页查询以及自定义sql分页
9.操作符不存在: integer = character varying
在使用 mybatis plus 调用 listByIds 方法,操作 postgresql 数据库的时候,出现了这个问题。这个问题多数在Mybatis中也会遇到,就是需要修改 xml 文件,但是我用的是 Mybatis Plus 的啊。
1 | // 根据id进行查询 |
【解决方法】
解决方法就是将String类型的数组改为了Integer 类型的数组。
1 | String[] ids = list.split(","); |
querySysCementListByUserId 还有这个方法里面,也还是要修改。
1 | <select id="querySysCementListByUserId" parameterType="String" 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 干什么用呢?
【解决方案】
这个问题主要就是我更新了一个空的对象进去,所以出现了问题。
1.org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, “xxxx“) with root cause
2.MybatisPlus报OgnlException: source is null for getProperty(null, “hosname“)
3.【Mybatis-Plus】使用updateById()、update()将字段更新为null
11.查询成功,返回结果为空
【解决方案】
1 | // 错误 |
1.MyBatisPlus查询成功,但是返回结果为空 最终经过搜索,找到问题根源,实体里边的属性名不能有下划线!!!!
2.关于Mybatis-Plus的使用问题–明明可以查到数据,但是返回空!!
12.selectOne为空
我遇到了一个奇怪的问题,那就是用 mybatis plus 的时候,明明数据库有值,但是返回的结果却是空的。
1 | public Integer checkPayloadExist(String payloadSn) { |
【尝试方案】
我尝试在查询的时候,使用多个键
1 | public Integer checkPayloadExist(String payloadSn) { |
【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 | quartz: |
【1】.在Linux上,myBatis “SELECT“失败,表名为大写 如何强制myBatis使用指定的小写名称”tablename“进行查询,而不是进行大写转换?
【2】.MySQL大小写敏感的解决方案 ①关于lower_case_table_names参数对表名称或数据库名称大小写敏感的控制。② Unix下默认为0,也就是大小写敏感的;Windows下默认为1,不敏感;macOS默认为2,存储区分大小写,但是在查询时会转换为小写。③ 对于在大小写不敏感的系统(Windows和macOS)不能将该字段设置为0。