mybatis传参总结
注:文章引用部分 mybatis传递参数总结文章内容
一、单个参数
1、基本数据类型
(1)直接使用
List<ChargeRuleDO> tests(long id);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id}
</select>
#{}中的参数名与方法中的参数名不一定一致,仅起到占位符作用
(2)使用注解 (最为直接不易出错)
List<ChargeRuleDO> tests(@Param("aid") long bid);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{aid}
</select>
#{}中的参数名与方法中的@Param()里的参数名一致
2、复杂数据类型(这里主要是指Java实体类)
(1)直接使用
List<ChargeRuleDO> tests(TestQO testQO);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id} and t.rule_type=#{ruleType}
</select>
#{}中的参数名与方法中的参数的属性名一致
(2)使用注解
List<ChargeRuleDO> tests(@Param("atestQO") TestQO btestQO);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{atestQO.id} and t.rule_type=#{atestQO.ruleType}
</select>
#{}中的参数名与方法中的@Param()里的参数对应的属性名一致,而且必须写成"#{atestQO.id}“的格式,不能简写成”#{id}".
二、多个参数
1、基本数据类型
(1)直接使用
List<ChargeRuleDO> tests(long id,String ruleType);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{0} and t.rule_type=#{1}
</select>
这里改用#{index},其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。直接写参数名字或者其他进行占位会报Parameter 'XXX' not found. Available parameters are [1, 0, param1, param2]
这样的错误
(2)使用注解
List<ChargeRuleDO> tests(@Param("id") long id,@Param("ruleType") String ruleType);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{id} and t.rule_type=#{ruleType}
</select>
#{}中的参数名与方法中的@Param()里的参数名一致
2、复杂数据类型
(1)直接使用
尝试了两种取参数的方法都不行
(2)使用注解
List<ChargeRuleDO> tests(@Param("testQO")TestQO testQO,@Param("testQO2")TestQO2 testQO2);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{testQO.id} and t.rule_type=#{testQO.ruleType} and t.user_id=#{testQO2.uesrId}
</select>
#{}中的参数名与方法中的@Param()里的参数对应的属性名一致,而且必须写成"#{testQO.id}“的格式,不能简写成”#{id}".
3、基本数据类型与复杂数据类型混合使用
因为在多参数的情况下,复杂数据类型不能直接使用,所以这里主要尝试基本数据类型直接使用并且复杂数据类型使用注解这一种情况
List<ChargeRuleDO> tests(long id,String ruleType,@Param("testQO2")TestQO2 testQO2);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id = #{0} and t.rule_type=#{1} and t.user_id=#{testQO2.uesrId}
</select>
4、List参数
List<ChargeRuleDO> tests(List<long> list);
<select id="tests" resultType="com.xxx.bean.ChargeRuleDO">
select * from t_charge_rule t where t.id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
四、if test=" "传值
在mybatis if test语句中,是使用#{}还是${} 或是其他?结论是两者都不可以在test中使用
小提一下:
#{}表示一个占位符,向占位符输入参数,mybatis自动进行java类型和jdbc类型的转换。
程序员不需要考虑参数的类型,比如:传入字符串,mybatis最终拼接好的sql就是参数两边加单引号。
#{}接收pojo数据,可以使用OGNL解析出pojo的属性值
表示sql的拼接,通过{}
表示sql的拼接,通过表示sql的拼接,通过{}接收参数,将参数的内容不加任何修饰拼接在sql中。
${}也可以接收pojo数据,可以使用OGNL解析出pojo的属性值
缺点:不能防止sql注入。
1、 String类型单个参数传递,使用_parameter
public List<Long> listAuthTeachersByTeacherName(String teacherName);
<select id="listAuthTeachersByTeacherName" parameterType="string" resultType="long">
select uid from auth_teacher where status = 20
<if test="_parameter != null and _parameter != ''">
and real_name like concat('%',#{_parameter},'%')
</if>
order by apply_last_date asc
</select>
注意:这里的参数获取只能使用"_parameter",而不能使用teacherName,否则总是抛出There is no getter for property named ‘teacherName’ in 'class java.lang.String’的异常信息。
2、多值使用注解
public List<Course> querybyNameandTime(@Param("start")String start,@Param("end") String end, @Param("coursename") String coursename, @Param("fuzzquery") String fuzzquery);
<select id="querybyNameandTime" resultMap="ListCourseMapper">
select * from course
<where>
<if test="start != null and start !=''">
and date(course_starttime) between #{start} and #{end}
</if>
<choose>
<when test="coursename != null and coursename !='' and fuzzquery != null">
and course_name like '%' #{coursename} '%'
</when>
<when test="coursename!= null and coursename !='' and fuzzquery == null ">
and course_name = #{coursename}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>
3、pojo可以直接使用属性
<select id="ListByChose" resultMap="StudentMapper">
SELECT * FROM student
<where>
<choose>
<when test=" name != null and name !=''">
and sname like '%' #{name} '%'
</when>
<when test=" age != null and age !='' and age > 0">
and age > #{age}
</when>
<when test=" score != null and score !='' and score > 0">
and score > #{score}
</when>
<otherwise>
1==2
</otherwise>
</choose>
</where>
</select>
4、数组和list
数组
<select id="ListByForeachArray" resultMap="StudentMapper" >
SELECT * FROM student
<where>
<if test="array.length > 0">
and id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
list
<select id="ListByForeachList" resultMap="StudentMapper" >
SELECT * FROM student
<where>
<if test="list.size > 0">
and id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
mybatis传参总结的更多相关文章
- 问题小记(MyBatis传参出现的小问题)
问题一:在MyBatis中注解@Param和ParameterType不能一起用,会报错Parameter 'XXX' not found. Available parameters are [1, ...
- Mybatis传参方式
Mybatis传多个参数(三种解决方案) 据我目前接触到的传多个参数的方案有三种. 第一种方案 DAO层的函数方法 ? 1 Public User selectUser(String name,St ...
- mybatis传参的几种方式
1,@Param @参考文章 @Select("select s_id id,s_name name,class_id classid from student where s_name= ...
- Java Mybatis 传参方式
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- mybatis 传参是 list<string> 的注意事项
<!--付款 批量 修改账单状态--><update id="editbillpayALL" parameterType="java.util.List ...
- mybatis传参问题总结
一. 传入单个参数 当传入的是单个参数时,方法中的参数名和sql语句中参数名一致即可 List<User> getUser(int id); <select id="get ...
- php sql 类似 mybatis 传参
PHP sql 处理上,没有类似于 java mybatis 的工具,导致进行一些sql 处理时,会有诸多不便, 楼主抽时间写了一个 php 类似 mybatis 的sql 工具,省去了拼装sql 的 ...
- Mybatis传参- 被逗号分割的字符串
String ids = "1,2,3,4,5,6",如ids作为参数传递,查询list返回.mybatis用foreach处理并返回. SELECT * FROM yp_popu ...
- mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。
<if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...
随机推荐
- 使用 FFmpeg 处理高质量 GIF 图片
使用 FFmpeg 处理高质量 GIF 图片 - 为程序员服务 http://ju.outofmemory.cn/entry/169845
- Ubuntu新版中javascript-common.conf害死人啊
自动把javascript目录映射到系统的/usr/share 下面了,删掉对应的软链接再重启就好了
- tflearn 保存模型重新训练
from:https://stackoverflow.com/questions/41616292/how-to-load-and-retrain-tflean-model This is to cr ...
- Chapter 4 Syntax Analysis
Chapter 4 Syntax Analysis This chapter is devoted to parsing methods that are typically used in comp ...
- 洛谷P1719 最大加权矩形
题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没 ...
- centos 安装sysbench
安装sysbench 下载并且解压 shell> wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbe ...
- [JOI2014] 小笼包
题面 : https://www.ioi-jp.org/joi/2013/2014-yo/2014-yo-t6/2014-yo-t6.html 题解 dp + 康托展开 一看这题不知道怎么处理 只能枚 ...
- 二分搜索poj106
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 49944 Accepted: 10493 De ...
- python程序展现图片
突然想写一个python程序能够显示图片的 ,展示文字的已经实现了 现在就搞一搞这个吧 相信也是很简单 首先是放一张图片在e盘下面 等会程序打包的时候将会用到 就决定是你啦 皮卡丘: 然后就写代码吧:
- 全面学习ORACLE Scheduler特性(8)Application抛出的Events
4.2 Application抛出的Events 首先要说明,这里所说的Application是个代词,即可以表示ORACLE数据库之外的应用程序,也可以是ORACLE数据库中的PROCEDURE等对 ...