前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springbot项目中MyBatis结合JPA排错

springbot项目中MyBatis结合JPA排错

作者头像
技术从心
发布2019-08-06 10:58:09
4630
发布2019-08-06 10:58:09
举报
文章被收录于专栏:技术从心技术从心

最近在写一个项目的时候被一个错误给我搞的很郁闷。

看了下报错信息和行数我们可以定位到代码

这里面的错误,我心想这个查询语句不会有错吧!写过这些多基础的东西,这个都会错那估计呀自刎以谢天下了。于是我就把项目更新重启了一下,结果还是报一样的错,没办法,没法相信自己了,跟着代码一步步的进去。

左看右看确实是没有问题啊!于是我再更新重启了一下还是报这个错,靠,这是什么鬼啊!着写的没有错啊...

没办法我只能把错误复制出来去百度一下了。精挑细选找到了下面的这篇博客,感觉比较靠谱就拿来 试了一下

将代码改了一下

然后运行结果居然正确没报错了,我瞬间怀疑人生了,感觉自己的mybatis是白学的了。

于是疯狂的百度查找原因

可以看到原因是说了但是还是不清楚为什么要这样做,看了一下网上的分析大概是这样的:

在mybatis中mapper文件中像这样写,你只需要传入一条String格式的sql语句

他就可以直接执行了,所以可以在动态配置的时候使用到

该参数的含义:当只有一个参数,可以使用_parameter,它就代表了这个参数,如果使用@Param的话,会使用指定的参数值代替

代码语言:javascript
复制
package com.lzj.mybatis.dao;
import java.util.List;
import com.lzj.mybaits.bean.Person;
public interface PersonDao {
    public List<Person> getPersons(Person person);
}
代码语言:javascript
复制
<mapper namespace="com.lzj.mybatis.dao.PersonDao">  
    <select id="getPersons" resultType="com.lzj.mybaits.bean.Person">
        select * from PERSON
        <!--此时_parameter内置参数中的值为接口中传入的person对象中的id、name、age的整体值,也就是说,不管接口中传入的多少数据,都整体的放在了_parameter内置参数中-->
        <if test="_parameter != null">
            where name=#{name}
        </if>
    </select>
</mapper>

综合上面两个示例, _parameter:代表DAO接口传入的整个参数

1、如果DAO接口就传入了单个参数:_parameter就是这个参数;

2、如果DAO接口就传入了多个参数:参数会被封装为一个map,_parameter就是代表这个map

注意:

在mapper文件中定义sql语句时,有些sql语句需要返回值,例如 等标签语句,返回值的类型一般定义在resultType或resultMap中,如果返回类型为自定义的对象类型,像本例中的Person类,那么这个类中一定不要定义有参的构造器,需要定义get和set方法。因为mybatis在处理完sql后,把返回的数据是通过set方法放到Person对应的对象中的,而不是通过有参构造器。如果定义了有参构造器,则会包如下错误:

代码语言:javascript
复制
## Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.lzj.mybaits.bean.Person with invalid types () or values (). Cause: java.lang.NoSuchMethodException: com.lzj.mybaits.bean.Person.<init>()
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
    at com.sun.proxy.$Proxy0.getPersons(Unknown Source)
    at com.lzj.mybatis.example.MybaitsTest.testGetPersons(MybaitsTest.java:43)
    at com.lzj.mybatis.example.MybaitsTest.main(MybaitsTest.java:19)

具体为啥这样还有待研究源码查看mybatis到底是做了什么操作。

关于JPA中的分页模糊查询可以这样写,这次主要还是mybatis的坑,不读读源码永远也只是停留在会用的基础上。

每天

进步一点点

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档