MyBatis 学习-动态 SQL 篇
2016-12-22 10:53
330 查看
MyBatis 为我们提供了如下几个动态 SQL 元素:
if
choose
foreach
where/set
trim
一、IF 元素
这条查询语句中,如果没有传入 userName 参数,那么查询出所有 valid 等于 1 的记录。反之,如果传入了 userName 参数,则查询出 valid = 1 和 userName 符合查询条件的记录。另外需要确保生成 SQL 后 where 关键字后必须有查询条件存在。
二、CHOOSE 元素
有些时候,我们并不是想用到所有条件语句,而是只从其中选择一个。针对这种情况 Mybatis 提供了类似 Java 中的 switch 语句的 choose 元素。
还是用查询 SQL 为例,如果查询条件提供了 userName 就按 userName 查询,如果提供了nickName 就按 nickName 查询,如果两者都没有提供就返回所有有效的记录(或是符合其他条件的记录,为简单起见,这里就返回所有有效记录)。
[b]三、FOREACH 元素[/b]
这个元素的使用场景是在需要对一个集合进行遍历的时候使用,如批量删除、批量插入等语句。
我们知道 Mybatis 进行 SQL 映射时,传入参数只能有一个,如果想传入多个参数,只能使用 Java 的 List 或是 Array 进行封装后再传入。上面的语句就是将要删除的多条记录的 Id 值放在了 List 对象中传入。
foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串(上例中的 open 和 close 属性)以及在迭代中间放置分隔符(separator 属性)。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
我们可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当我们这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。
[b]四、WHERE/SET 元素[/b]
WHERE 这个元素可以避免在查询语句中出现只有 WHERE 关键字而没有作何查询条件的情况出现
Mybatis 会判断只有在 WHERE 元素中至少有一个条件成立时,才会在查询语句中添加 WHERE 关键字。
在上述 SQL 语句中,如果第一个条件不成立,而第二个条件成立时,是不是会在 WHERE 语句中多个 OR 关键字呢?完全不心担心这个问题,Mybatis 早已考虑到了,她会将多余的 AND 或是 OR 关键字自动剔除掉(所谓多余,紧跟在 WHERE 关键字后的第一个 AND 或是 OR )。
SET 元素和 WHERE 元素类似,只是她是使用在数据更新语句中而已。
if
choose
foreach
where/set
trim
一、IF 元素
<select id="selectProjectList" parameterType="ProjectInfo" resultType="ProjectInfo"> SELECT <include refid="columns"></include> FROM t_project_001_project_info WHERE valid = 1 <if test="userName != null"> AND user_name LIKE '%' #{userName} '%' </if> </select>
这条查询语句中,如果没有传入 userName 参数,那么查询出所有 valid 等于 1 的记录。反之,如果传入了 userName 参数,则查询出 valid = 1 和 userName 符合查询条件的记录。另外需要确保生成 SQL 后 where 关键字后必须有查询条件存在。
二、CHOOSE 元素
有些时候,我们并不是想用到所有条件语句,而是只从其中选择一个。针对这种情况 Mybatis 提供了类似 Java 中的 switch 语句的 choose 元素。
还是用查询 SQL 为例,如果查询条件提供了 userName 就按 userName 查询,如果提供了nickName 就按 nickName 查询,如果两者都没有提供就返回所有有效的记录(或是符合其他条件的记录,为简单起见,这里就返回所有有效记录)。
<select id="queryByName" parameterType="ProjectInfo" resultType="ProjectInfo"> SELECT <include refid="columns"></include> FROM t_project_001_project_info WHERE user_type_id = 1 <choose> <when test="userName != null">user_name like '%' #{userName} '%'</when> <when test="nickName != null">nick_name like '%' #{nickName} '%'</when> <otherwise>is_valid = 1</otherwise> </choose> </select>
[b]三、FOREACH 元素[/b]
这个元素的使用场景是在需要对一个集合进行遍历的时候使用,如批量删除、批量插入等语句。
<!-- 根据传入的Id值列表,删除多条记录 --> <delete id="deleteBatch" parameterType="java.util.List"> DELETE FROM t_project_001_project_info WHERE user_id IN <foreach collection="list" item="item" index="index" open="(" close=")" separator=","> #{item} </foreach> </delete>
我们知道 Mybatis 进行 SQL 映射时,传入参数只能有一个,如果想传入多个参数,只能使用 Java 的 List 或是 Array 进行封装后再传入。上面的语句就是将要删除的多条记录的 Id 值放在了 List 对象中传入。
foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串(上例中的 open 和 close 属性)以及在迭代中间放置分隔符(separator 属性)。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
我们可以将一个 List 实例或者数组作为参数对象传给 MyBatis,当我们这么做的时候,MyBatis 会自动将它包装在一个 Map 中并以名称为键。List 实例将会以“list”作为键,而数组实例的键将是“array”。
[b]四、WHERE/SET 元素[/b]
WHERE 这个元素可以避免在查询语句中出现只有 WHERE 关键字而没有作何查询条件的情况出现
<select id="queryByName" parameterType="User" resultType="User"> SELECT <include refid="columns"></include> FROM t_project_001_project_info <where> <if test="userName != null">user_name LIKE '%' #{userName} '%'</if> <if test="nickName != null"> OR nick_name LIKE '%' #{userName} '%'</if> </where> </select>
Mybatis 会判断只有在 WHERE 元素中至少有一个条件成立时,才会在查询语句中添加 WHERE 关键字。
在上述 SQL 语句中,如果第一个条件不成立,而第二个条件成立时,是不是会在 WHERE 语句中多个 OR 关键字呢?完全不心担心这个问题,Mybatis 早已考虑到了,她会将多余的 AND 或是 OR 关键字自动剔除掉(所谓多余,紧跟在 WHERE 关键字后的第一个 AND 或是 OR )。
SET 元素和 WHERE 元素类似,只是她是使用在数据更新语句中而已。
<!-- 更新用户信息,并写回到数据表中 --> <update id="udpateProject" parameterType="User"> UPDATE t_project_001_project_info <set> <if test="userName != null">user_name = #{userName},</if> <if test="englishName != null">english_name = #{englishName},</if> <if test="nickName != null">nick_name = #{nickName},</if> <if test="userTypeId != null">user_type_id = #{userTypeId},</if> <if test="isValid != null">is_valid = #{isValid}</if> </set> WHERE user_id = #{userId} </update>
相关文章推荐
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- Mybatis学习(十二)mybatis理解动态sql及sql片段
- myBatis学习笔记(6)——动态SQL & 模糊查询
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- 学习流水账:MyBatis -- helloworld,动态SQL
- MyBatis学习之三--动态SQL语句
- Mybatis学习(十一)mybatis动态sql传入pojo的包装类型
- MyBatis学习 之 三、动态SQL语句
- Github Mybatis深入学习之动态SQL
- Java学习笔记33:mybatis动态SQL语句
- Mybatis学习(8)动态sql语句
- mybatis 学习 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- MyBatis学习 之 三、动态SQL语句
- Mybatis学习笔记-动态sql
- MyBatis学习笔记(五)---mybatis 动态sql语句