静态的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博客
这篇可以全面地了解这个参数传递的过程。