MyBatis 传⼊参数为List 对象
SSM 框架是JavaWeb 必学的框架,虽说基本的增删改查很简单,但是当⾯临⼀些特殊情况时,有时还是会显得⼿⾜⽆措,此篇⽤来记录⼀些特殊场景下Mybatis 框架的应⽤.
传⼊参数为List 对象
1. 场景复现
⾸先有如下⼀张表:ssm框架简单吗
MySQL [test]> select * from t_entry_resource;
+----+-------------+------+----------+--------+--------+---------------------+
| id | resource_id | type | title | banner | icon | add_date |
+----+-------------+------+----------+--------+--------+---------------------+
| 11 | 6 | 14 | 分类 | 1.jpg | 2.jpg | 2017-11-17 11:22:30 |
| 12 | 3 | 1 | 测试12 | 3.jpg | 4.jpg | 2017-11-17 11:22:30 |
| 13 | 653 | 1 | 测试34 | 5.jpg | 6.jpg | 2017-11-20 02:32:26 |
| 14 | 1 | 1 | 测试5 | 7.jpg | 8.jpg | 2017-11-20 02:32:51 |
| 15 | 3942 | 3 | 测试6 | 9.jpg | 10.jpg | 2017-11-20 02:34:27 |
+----+-------------+------+----------+--------+--------+---------------------+
5 rows in set (0.01 sec)
如果要根据resource_id和type来批量查询记录,该如何编写Mybatis语句?
2. 解决⽅案
直接贴出来解决⽅案如下所⽰:
Dao 层接⼝:
List<EntryResource> findByRidAndType(List<EntryResource> entryResources);
XML 语句:
<select id="findByRidAndType" resultMap="entryResource" parameterType="list">
SELECT
*
FROM
t_entry_resource a
WHERE
<foreach collection="list" index="index" item="entryResources" open="(" close=")" separator="or">
( `type`=#{pe} and resource_id=#{sourceId} )
</foreach>
</select>
该语句利⽤了mybatis的foreach动态拼接SQL。3. foreach 属性
4. foreach 的⼏种⽤法
(1) select count(*) from users id in (x1,x2,x3,...)
<select id="countByUserList" resultType="int" parameterType="list">
select count(*) from users
<where>
id in
属性
描述item 循环体中的具体对象。⽀持属性的点路径访问,如item.age,item.info.details 。具体说明:在list 和数组中是其中的对象,在map 中是
value 。该参数为必选。
collection 要做foreach 的对象,作为⼊参时,List<?>对象默认⽤list 代替作为键,数组对象有array 代替作为键,Map 对象⽤map 代替作为键。当然在作为⼊参时可以使⽤@Param("keyName")来设置键,设
置keyName 后,list,array,map 将会失效。 除了⼊参这种情况外,还有⼀种作为参数对象的某个字段的时候。举个例⼦:如果User 有属性List ids 。⼊参是User 对象,那么这个collection = "ids"如果User 有属性Ids ids;其中Ids 是个对象,Ids 有个属性List id;⼊参是User 对象,那么collection = "ids.id"上⾯只是举例,具体collection 等于什么,就看你想对那个元素做循环。该参数为必选。
separator 元素之间的分隔符,例如在in()的时候,separator=","会⾃动在元素中间⽤“,“隔开,避免⼿动输⼊逗号导致sql 错误,如in(1,2,)这样。该参数可选。
open foreach 代码的开始符号,⼀般是(和close=")"合⽤。常⽤在in(),values()时。该参数可选。
close foreach 代码的关闭符号,⼀般是)和open="("合⽤。常⽤在in(),values()时。该参数可选。
index
在list 和数组中,index 是元素的序号,在map 中,index 是元素的key ,该参数可选。
<foreach item="item" collection="list" separator="," open="(" close=")" index="">
#{item.id, jdbcType=NUMERIC}
</foreach>
</where>
</select>
(2) select count(*) from key_cols where col_a = ? AND col_b = ?
<select id="sel_key_cols" resultType="int">
select count(*) from key_cols where
<foreach item="item" index="key" collection="map" open="" separator="AND" close=""> ${key} = #{item}
</foreach>
</select>
(3) select * from t_news n where n.tags like ? or n.tags like ?
<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper"> select * from t_news n where
<foreach collection="listTag" index="index" item="tag" open="" separator="or" close=""> n.tags like '%'||#{tag}||'%'
</foreach>
<select>
5. 参考⽂献
镜像地址
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论