Mybatis的Mapper.xml文件中集合遍历

本文深入探讨了MyBatis框架下复杂SQL查询的编写技巧,重点讲解了如何使用动态SQL实现灵活的条件过滤和结果排序,通过具体案例解析了<if>标签和<foreach>集合迭代在实际应用中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="dnn.exam.QuestionMapper">
	<select id="getQuestionList" resultType="dnn.exam.Question">
 		SELECT * FROM (SELECT * FROM question
	<where>  1 = 1	    
		<if test="null != questionids and questionids.size() > 0">
		    AND 
			<foreach collection="questionids" index="index" item="item" open="(" separator="and" close=")">
              id != #{item}       
           </foreach>    
		</if>	
	</where> 
		 ORDER BY question.count ASC LIMIT 5) tab ORDER BY RAND()
 	</select>
</mapper>
<think>好的,我现在需要帮助用户了解MyBatismapper.xml文件中的SQL标签用法及配置示例。首先,我需要回忆MyBatis的相关知识,确保自己正确理解各个SQL标签的作用和用法。 用户的问题集中在mapper.xml的SQL标签配置,所以重点应该放在常用的标签上,比如<select>, <insert>, <update>, <delete>,还有动态SQL标签如<if>, <choose>, <foreach>,以及处理特殊字符的方法。另外,用户提供的引用内容提到了转义和CDATA的使用,这也需要涵盖进去。 首先,我应该整理每个SQL标签的基本结构和示例。例如,<select>标签用于查询,需要包含id、parameterType和resultType属性。然后给出一个简单的查询示例,比如根据id查询用户信息。 接下来是动态SQL部分,这部分是MyBatis的强大功能之一。需要解释<if>标签如何根据条件动态添加WHERE子句,比如在查询用户时,如果有传入name或email参数,就添加到条件中。同时,要提到<where>标签自动处理AND和OR的问题,避免语法错误。 然后是关于循环的<foreach>标签,常见于IN查询或批量操作。例如,根据多个用户ID查询用户列表,这里需要展示如何遍历集合,并生成对应的SQL语句。注意要说明collection、item、open、close等属性的作用。 另外,用户提到的特殊字符处理,比如比较运算符中的大于、小于号,需要解释两种方法:转义字符和CDATA块。引用中的内容已经提到这两点,所以需要结合示例说明,比如在WHERE条件中使用<![CDATA[ ]]>包裹带有比较符号的表达式,或者使用>和<这样的转义字符。 还有include标签用于复用SQL片段,这也是提高XML可维护性的好方法。需要展示如何定义<sql>片段,并通过<include>引用它,减少重复代码。 在编写示例时,要确保代码格式正确,特别是XML的标签闭合和属性使用。同时,要注意转义字符的正确写法,比如在XML中使用>代表大于号,<代表小于号。如果使用CDATA,要确保表达式被正确包裹,避免解析错误。 可能还需要提到其他动态标签,比如<choose>、<when>、<otherwise>,但根据用户的问题,可能先集中在最常用的几个标签上,避免信息过载。同时,需要强调配置中的注意事项,比如参数类型、结果映射,以及避免SQL注入的问题。 最后,生成相关问题时要围绕MyBatis的SQL配置,可能涉及性能优化、动态SQL的其他标签、结果映射配置,或者与其他框架的整合等。例如,如何防止SQL注入,或者如何使用关联查询处理一对一、一对多关系。 现在需要检查是否有遗漏的部分,比如参数传递的方式(#{}和${}的区别),但用户的问题更侧重于标签配置,所以可能在示例中简单提及#{}的使用即可。确保所有示例符合MyBatis的语法,并且正确转义了特殊字符,或者正确使用CDATA。 总结一下,回答的结构应该是先介绍常用的CRUD标签,然后动态SQL标签,接着处理特殊字符的方法,最后是SQL片段复用。每个部分都给出示例代码,并引用用户提供的参考资料中的转义和CDATA部分。最后的问题生成要围绕相关主题,帮助用户进一步探索。</think>### MyBatis mapper.xml SQL标签用法及配置示例 在MyBatis的`mapper.xml`文件中,SQL标签用于定义和执行数据库操作。以下是常用标签的用法及示例: --- #### 1. **基本CRUD标签** - **`<select>`**: 定义查询语句 ```xml <select id="getUserById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` - `id`:方法名,需与接口方法名一致 - `parameterType`:输入参数类型 - `resultType`:返回结果类型(实体类或基本类型) - **`<insert>`**: 定义插入语句 ```xml <insert id="insertUser" parameterType="User"> INSERT INTO user(name, email) VALUES(#{name}, #{email}) </insert> ``` - **`<update>`**: 定义更新语句 ```xml <update id="updateUser" parameterType="User"> UPDATE user SET name=#{name} WHERE id=#{id} </update> ``` - **`<delete>`**: 定义删除语句 ```xml <delete id="deleteUser" parameterType="int"> DELETE FROM user WHERE id=#{id} </delete> ``` --- #### 2. **动态SQL标签** - **`<if>`**: 条件判断 ```xml <select id="findUser" parameterType="map" resultType="User"> SELECT * FROM user <where> <if test="name != null"> AND name = #{name} </if> <if test="email != null"> AND email = #{email} </if> </where> </select> ``` - `<where>`标签会自动去除首个`AND`或`OR`,避免语法错误[^1]。 - **`<foreach>`**: 遍历集合(常用于IN查询) ```xml <select id="findUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" collection="ids" open="(" separator="," close=")"> #{id} </foreach> </select> ``` - `collection`:集合参数名 - `item`:遍历时的临时变量名 - `open/close`:循环开始/结束时的符号(如括号) --- #### 3. **特殊字符处理** 在SQL中使用比较运算符(如`<`, `>`)时,需通过**转义**或**`<![CDATA[]]>`**避免与XML语法冲突: - **转义写法** ```xml <select id="findByAge" resultType="User"> SELECT * FROM user WHERE age >= 18 AND age <= 60 </select> ``` - **CDATA写法**(更推荐) ```xml <select id="findByAge" resultType="User"> SELECT * FROM user WHERE age <![CDATA[ >= ]]> 18 AND age <![CDATA[ <= ]]> 60 </select> ``` - `<![CDATA[ ]]>`包裹的内容会被XML解析器忽略,执行效率更高[^2]。 --- #### 4. **SQL片段复用** - **`<sql>` + `<include>`**: 定义可复用的SQL片段 ```xml <!-- 定义公共字段 --> <sql id="userColumns">id, name, email</sql> <!-- 引用片段 --> <select id="getUser" resultType="User"> SELECT <include refid="userColumns"/> FROM user </select> ``` --- #### 注意事项 1. **参数占位符**:使用`#{field}`防止SQL注入,避免使用`${field}`(有注入风险)。 2. **结果映射**:复杂查询可使用`<resultMap>`定义字段与属性的映射关系。 3. **性能优化**:动态SQL标签能减少拼接字符串的开销[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值