关于传参用new Users(id)的问题

关于传参用new Users(id)的问题

为什么用findById的时候没有问题,调整到findAll的时候就需要new一个对象呢

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
杜耀洪 2019-01-28 17:15:47

因为报错的是<if test ="id">里的id,而不是where id = #{id}里的id

然后<if test="id">,会根据传入的类型,去里面找getId这个方法,而String方法里,根本就没有getId这个方法,而User里有

Licrates 2019-01-20 11:50:29

http://img1.sycdn.imooc.com//climg/5c43edfe0001ec9706580319.jpg

http://img1.sycdn.imooc.com//climg/5c43edfe0001153f06310172.jpg

http://img1.sycdn.imooc.com//climg/5c43edfe0001ea3b09780125.jpg

看了问答区的一些回答,发现没有一个把问题解释清楚的回答。我自己做了一下实验,破案了。

之所以称为动态sql,动态的是<>里面的if的判断部分<if test="nickname!=null">,这个地方mybatis会取你传进来的类型里面的nickname属性是否为空,这个地方我传进来的是一个普通的String类型,然而string没有nickname这个属性,故而报错。跟后面的where username = #{username}半毛钱关系没有,这个实际上还是静态的

楚楚提 2019-01-04 23:00:34

http://img1.sycdn.imooc.com//climg/5c2f74d30001506407310494.jpg

http://img1.sycdn.imooc.com//climg/5c2f74e30001897010470321.jpg

结果出现错误....这么说MyBatis的这个机制还挺奇怪的,还必须的传入实现了getId的User对象,其他对象还不行

chrismorgen 2018-10-15 16:48:55

因为之前是直接传一个id进行查询,到findAll的时候,改为动态sql拼接了,之所以之前没报错是因为之前的代码逻辑符合MyBatis的设计规则,如果加上下图标记的代码,MyBatis会去Integer这个类中寻找id的getter方法,所以会报错,之所以回去Integer类中去寻找getter方法,是因为id在Users类中定义为Integer类型的,所以MyBatis会去Integer类中寻找getter方法,故而报错,为了解决这个报错,可以new Users(id),通过传递一个Users对象,MyBatis会去Users对象中通过getter方法来获取id的值,所以不会报错,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5bc45129000199fb06460243.jpg

  • 提问者 李爽爽爽爽 #1
    理解了,谢谢~
    2018-10-17 09:51:19
  • 所以会报错,之所以回去Integer类中去寻找getter方法,是因为id在Users类中定义为Integer类型的 老师你说的这句话,我觉得应该是selectOne()的第二个参数时Object类型,所以 user = getSession().selectOne("findAll",id),是把id打包成了Integer类型,所以才去Integer中寻找getId方法的,和User中定义id的类型没有关系吧?
    2019-01-04 22:47:20
  • 有个补充回答,好像真是老师说的那样,真是奇怪啊
    2019-01-04 22:59:26
chrismorgen 2018-10-15 14:05:37

是这样的,如果只传一个id,或者一个参数,会造成写好多类似重复的sql语句,因为mybatis提供动态语句查询,所以当有多个查询参数时,我们就可以传递一个Users对象,然后从Users对象的属性中判断查询条件,从而来拼写动态sql,譬如下图这样,可以说,传一个Users对象是为了更好解决sql语句拼接的问题,如果还有哪里不明白,同学可以继续提问,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5bc42dc90001ccf808960280.jpg

  • 提问者 李爽爽爽爽 #1
    但是在findAll里面传id的时候,是报错了的,为什么之前用findById没有报错,但是,用findAll的时候就报错?老师讲了,但是没有具体搞清楚
    2018-10-15 15:32:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师