动态SQL

动态SQL

在UserDAO的findById方法中老师使用下面的语句进行查询,

users = getSession().selectOne("findUsers", new Users(id));

我在尝试使用了下面的语句也能够得到想要的结果。

users = getSession().selectOne("findUsers", id);

请问:

我们两个的做法为啥都能的出相同的结果?

老师为什么要这样做?

在xml文件的sql语句中where id = #{id}是怎样进行适配的?

正在回答

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

4回答

同学你好。使用同学提供的代码片段拼接至源码中,经这边尝试是没有办法正常查询user的,并且错误原因也与视频相同呢~同学运行效果与预期不同,考虑是编译缓存问题,建议同学清一下缓存呢~http://img1.sycdn.imooc.com//climg/5dad1996095eb28d16970968.jpg


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

使用这里,清除IDEA缓存

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

然后重新编译一下试试:

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

祝学习愉快~

  • 懒人13 提问者 #1
    额~~,还是可以正常运行。
    2019-10-21 11:29:06
  • 懒人13 提问者 #2
    应该是我的编译器问题。
    2019-10-21 11:45:29
提问者 懒人13 2019-10-20 19:52:35
<mapper namespace="com.demo.entity.Users">
    <!-- 动态sql语句,能够实现功能一:查找所有users;功能二:通过id查找某个users   -->
    <select id="findUsers" resultType="com.demo.entity.Users">
        select * from users
        <if test="id != null">
            where id = #{id}
        </if>
    </select>
    <!-- 静态sql语句,只能实现通过id查找某个users功能 -->
    <select id="findById" resultType="com.demo.entity.Users">
        select * from users where id = #{id}
    </select>
</mapper>


提问者 懒人13 2019-10-20 19:12:16

下面是我的SQL:

<select id="findUsers" resultType="com.demo.entity.Users">
    select * from users
    <if test="id != null">
        where id = #{id}
    </if>
</select>

当我使用users = getSession().selectOne("findUsers", id);进行查找时。Debug的运行结果如下,可以看到也是能够取得正确的users(不论我Users中有没有老师写的那个id构造器)

http://img1.sycdn.imooc.com//climg/5dac40f10993c2c318160893.jpg那么问题来了这个#{id}到底是跟UsersBean中的id属性进行匹配还是单纯的就是跟selectOne("findUsers", id)方法中的id直接进行匹配

  • 同学你好。同学的mapper.xml中,namespace指定的是什么呢,是否和老师的相同呢?祝学习愉快~
    2019-10-20 19:28:05
  • 提问者 懒人13 回复 芝芝兰兰 #2
    <mapper namespace="com.demo.entity.Users"> <!-- 动态sql语句,能够实现功能一:查找所有users;功能二:通过id查找某个users --> <select id="findUsers" resultType="com.demo.entity.Users"> select * from users <if test="id != null"> where id = #{id} </if> </select> <!-- 静态sql语句,只能实现通过id查找某个users功能 --> <select id="findById" resultType="com.demo.entity.Users"> select * from users where id = #{id} </select> </mapper>
    2019-10-20 19:51:46
  • 提问者 懒人13 回复 芝芝兰兰 #3
    新回答中回复
    2019-10-20 19:52:16
好帮手慕阿莹 2019-10-20 18:08:24

1、同学你好,不知道同学的sql语句是否是动态的拼接的语句,

老师之所以users = getSession().selectOne("findAll", new Users(id));  这样写是在3分钟左右

老师这里出现的报错。

动态拼接的sql语句要求传入的参数有get方法,但是int类型的没有getter方法,所以老师在Users类中添加了一个getter方法。如果不这样做,就会报如视频3分钟左右的报错。

2、

关于:“在xml文件的sql语句中where id = #{id}是怎样进行适配的?”

http://img1.sycdn.imooc.com//climg/5dac31f009b1613408220299.jpg这个id就是我们传进去的参数id。


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

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 懒人13 #1
    在新的回答中进行回复
    2019-10-20 18:49:22
  • 芝芝兰兰 回复 提问者 懒人13 #2
    同学你好。目前没有看到同学新的回复,如果是开了新的问答,请同学贴一下链接呢~ 祝学习愉快~
    2019-10-20 19:14:17
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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