【JavaWeb笔记】关于mybatis动态sql中,test属性里测试的变量

静态的sql是在mapper.xml中这样配置

<delete id="deleteStudentBySid">
    delete from student where sid = #{sid}
</delete>

然而如果想根据不同的学号执行不同的sql语句,就要整点别的,比方说学号为1的同学不愿意透露姓名,其它的愿意透露

<select id="selectStudentBySid" resultType="student">
    <!-- 对于sid(学号)为1 的同学,只选择学号(sid)和性别(sex)-->
    <if test="sid == 1">
        select sid, sex from student where sid = #{sid}
    </if>
    
    <!-- 其它的正常来 -->
    <if test="sid != 1">
        select * from student where sid = #{sid}
    </if>
</select>

另外在java中有个接口定义了selectStudentBySid这个函数

Student selectStudentBySid(int sid);

这样执行selectStudentBySid(1)时就只会得到学号和性别了。

然而这个sid是数据库里的sid还是在接口里定义的sid参数,我参考的视频没有讲,我就好奇试了一下

假如是Java接口中的参数,那么如果我在接口中多定义一个参数,这里用个int flag来试试

Student selectStudentBySid(int sid, int flag);

那么应当在test属性里使用flag这个参数

<select id="selectStudentBySid" resultType="student">
    <!-- 对于flag不为0 的同学,只选择学号(sid)和性别(sex)-->
    <if test="flag != 0">
        select sid, sex from student where sid = #{sid}
    </if>
    
    <!-- 其它的正常来 -->
    <if test="flag == 0">
        select * from student where sid = #{sid}
    </if>
</select>

像这样,利用接口中的flag变量来标志选不选择姓名

然而报错了,似乎证明test中出现的变量是属于数据库的

但是不那么令人信服,我于是直接把接口参数由“sid”改成了“id”

Java接口:

Student selectStudentBySid(int id);

相应xml中 #{}中的部分也换成id

<select id="selectStudentBySid" resultType="student">
    <!-- 对于sid(学号)为1 的同学,只选择学号(sid)和性别(sex)-->
    <if test="sid == 1">
        select sid, sex from student where sid = #{id}
    </if>
    
    <!-- 其它的正常来 -->
    <if test="sid != 1">
        select * from student where sid = #{id}
    </if>
</select>

结果运行正常,注意这里test后引号里还是sid

于是我把test后引号里的也换成了id,结果是……还是能正常运行

懵逼

于是玩了把大的,我把test后引号里直接改成了xxx,然后神奇的事情发生了……

结果中只得到了性别,代表着上面的xxx也被辨识成了学号……

然后参考了一下【详解】@Param注解的用法_晓风残月一望关河萧索的博客-CSDN博客

于是才终于弄懂,原来传递多个参数是要用@Param注解来实现的

而上面这种奇怪现象在这篇文章中也有说明,如果只传递一个参数,那么无论在xml中怎么写参数名字,都是可以顺利传递的。

还有另一篇博客也不错彻底搞懂Mybatis中Mapper配置文件获取参数的五种方式_mybatis如何读取配置文件_fckey的博客-CSDN博客

这篇可以全面地了解这个参数传递的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值