mybatis foreach里面用find_in_set or
时间: 2023-07-07 22:04:37 浏览: 53
可以在 MyBatis 的 foreach 标签中使用 `find_in_set` 函数。例如:
```
<select id="getUserByFruits" resultMap="userMap">
SELECT *
FROM user
WHERE FIND_IN_SET(fruit,
<foreach collection="fruits" item="fruit" separator=",">
#{fruit}
</foreach>
)
</select>
```
以上代码中,`getUserByFruits` 是查询的 ID,`fruits` 是一个 List,`fruit` 是 List 中的元素。`FIND_IN_SET` 函数会在 `user` 表中查找 `fruit` 字段包含 List 中任意一个元素的记录。注意在 `foreach` 标签中使用 `separator` 分隔符设置 List 元素的分隔符。
相关问题
mybatis if test 多条件_这些MyBatis动态标签,你都知道吗?
是的,我知道。MyBatis提供了很多动态标签,可以方便地实现动态SQL语句的生成,其中包括:
1. if标签:用于判断条件是否成立,成立则执行标签内的SQL语句。
2. choose标签:类似于Java中的switch语句,可以根据条件执行不同的SQL语句。
3. when标签:用于定义choose标签中的条件分支。
4. otherwise标签:用于定义choose标签中的默认分支。
5. trim标签:用于去除SQL语句中的多余空格和逗号。
6. where标签:用于拼接WHERE语句。
7. set标签:用于拼接UPDATE语句中的SET字段。
8. foreach标签:用于循环遍历集合或数组,生成多条SQL语句。
对于多条件的if test,可以使用MyBatis的if标签嵌套实现。例如:
```xml
<select id="findUser" parameterType="User" resultType="User">
SELECT * FROM user
WHERE
<if test="name != null">
name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
</select>
```
以上代码中,如果传入的User对象中name不为空,则拼接WHERE语句中的name条件;如果age不为空,则拼接AND age条件;如果sex不为空,则拼接AND sex条件。
SELECT a.* FROM wsy_dream.ShopDistribute a INNER JOIN ( SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(2, ShopType) > 0 UNION SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(5, ShopType) > 0 UNION SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(4, ShopType) > 0 ) b INNER JOIN wsy_o2o.weixin_cityarea_supply c ON a.Activity_id = b.ID WHERE a.Isvalid=1 and a.Acquirer_id = 138058 and a.Shop_id = c.id and c.types = 20 ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC; 上述中 inner join 里的值如何使用mybatis xml来进行拼接
在 MyBatis XML 映射文件中,可以使用动态 SQL 标签来实现 SQL 拼接,例如在这个例子中使用 `<foreach>` 标签来拼接 SQL 语句。
可以将内部 JOIN 的语句拼接到一个变量中,然后通过 `<foreach>` 标签遍历一个集合,将集合中的元素动态拼接到 SQL 语句中。具体实现可以参考以下代码:
```
<select id="selectData" resultType="yourResultType">
SELECT a.*
FROM wsy_dream.ShopDistribute a
INNER JOIN (
<foreach collection="activityIds" item="item" separator=" UNION ">
SELECT * FROM wsy_dream.ShopActivity WHERE FIND_IN_SET(#{item}, ShopType) > 0
</foreach>
) b
INNER JOIN wsy_o2o.weixin_cityarea_supply c ON a.Activity_id = b.ID
WHERE a.Isvalid=1 and a.Acquirer_id = 138058 and a.Shop_id = c.id and c.types = 20
ORDER BY CASE a.Consumption WHEN 1 THEN 99 END DESC, a.ID DESC;
</select>
```
在这个例子中,假设 `activityIds` 是一个包含需要查询的 ShopActivity 的 ID 的列表,通过 `<foreach>` 标签将这个列表中的元素动态拼接到 SQL 语句中,从而实现内部 JOIN 的功能。注意,`separator` 属性指定了每个元素之间的分隔符,这里使用了 UNION。同时,在 MyBatis 中,使用 `#{}` 语法来占位符表示需要从参数中获取值,避免了 SQL 注入的问题。