概述
**MyBatis动态sql详解(foreach语句详解)**
理论基础:
一、介绍:
foreach主要是用于一个循环,大部分用到的是循环的生成sql,下面说一下动态foreach的属性:
foreach元素的属性主要有item,index,collection,open,separator,close。
1、collection表示如何来得到这个集合,如果传入的直接为一个List,那么collection值就为list,如果直接传入的为一个array不可变数组,那么collection值就为array,如果传入的为一个dto,比如dto里面的array变量名为idLists,那么collection的值就为idLists。
2、item表示集合中每一个元素进行迭代时的别名,比如item为value,那么,每次获取的都使用#{value}即可
3、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,一般很少使用这个
4、open表示该语句以什么开始
5、separator表示在每次进行迭代之间以什么符号作为分隔符
6、close表示以什么结束
二、原理:
动态SQL,最后都会根据条件拼成SQL,foreach也不例外,原理为:
首先根据collection来得到集合,然后写入open字符,然后开始遍历:
每次遍历,都会执行里面的条件得到生成的sql,然后加入separator,遍历完成之后,加入close字符。
三、实战:
1.1、直接传入一个List可变数组:
比如我想找users表中id在一个数组中的,可以这样:
<select id="dymamicForeachListGetUser" resultType="com.happyheng.entity.User">
select * from users where id in
<foreach collection="list" index = "index" item = "item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
public static void testDynamicForeach() {
SqlSession session = MyBatisUtil.getSqlSession(true);
List<Integer> idList = new ArrayList<>();
idList.add(7);
idList.add(8);
idList.add(10);
idList.add(11);
List<User> users = session.selectList("dymamicForeachListGetUser",idList);
for (User user : users) {
System.out.println(user);
}
session.close();
}
2、直接传入一个array不可变数组:
<select id="dymamicForeachArrayGetUser" resultType="com.happyheng.entity.User">
select * from users where id in
<foreach collection="array" index = "index" item = "idArray" open="(" separator="," close=")">
#{idArray}
</foreach>
</select>
java代码中的使用:
public static void testDynamicForeach() {
SqlSession session = MyBatisUtil.getSqlSession(true);
int[] ids = new int[]{7,8,10,11};
List<User> users = session.selectList("dymamicForeachArrayGetUser", ids);
for (User user : users) {
System.out.println(user);
}
session.close();
}
3、传入一个dto,里面有一个参数为List可变数组
<select id="findCommunityInfo" parameterType="com.happyheng.ParkQuery" resultMap="resultMap">
SELECT
xxx
FROM
fairyland_account_info account ,fairyland_community_info comm
where account.id = comm.fairyland_account_info_id
<if test="userInfoId != null">
AND account.user_info_id = #{userInfoId}
</if>
<if test="userIdList!=null">
AND account.user_info_id IN
<foreach collection="userIdList" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</if>
</select>
其中,传入的dto为ParkQuery,里面有一个List 的userIdList参数(注意要有setter和getter) 所以下面的collection为userIdList,其对应的接口为:
public List findCommunityInfo(ParkQuery parkQuery);
4、传入一个dto,里面有一个参数为List可变数组,其中list中每个也是一个dto:
<update id="updateStatus" parameterType="com.happyheng.query.FriendUpdateQuery">
UPDATE friend_introduce_info SET be_used = #{beUsed,jdbcType=TINYINT} WHERE
<foreach collection="listQuery" item="query" separator="or">
(user_info_id = #{query.uid} AND introduced_user_info_id =#{query.introduceUid})
</foreach>
</update>
其中item=query即为list中的每个dto即为query,那么 #{query.uid}即为获取dto中的uid。
最后
以上就是懦弱钢笔为你收集整理的MyBatis动态sql详解(foreach语句详解【IN】)的全部内容,希望文章能够帮你解决MyBatis动态sql详解(foreach语句详解【IN】)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复