Mybatis之动态SQL

原创 2018年04月15日 12:18:56

MyBatis通过使用<if>,<choose>,<where>,<foreach>,<trim>元素提供了对构造动态SQL语句的高级别支持。

<?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="com.lit.chapter_2.mapper.CourseMapper">
  <resultMap id="CourseResult" type="Course">
    <id column="cou_id" property="couId" />
    <result column="tea_id" property="teaId" />
    <result column="cou_name" property="couName" />
    <result column="start_dt" property="startDt" />
    <result column="end_dt" property="endDt" />
  </resultMap>
  
  <!--   if元素被用来有条件地嵌入SQL片段,
  	如果测试条件被赋值为true,则相应地SQL片段将会被添加到SQL语句中。 -->
  <select id="getCourseByDymic" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	where tea_id=#{id}
  	<if test="courseName!=null">and cou_name like #{courseName}</if>
  	<if test="startDt!=null">and start_dt >= #{startDt}</if>
  	<if test="endDt!=null"> and end_date <![CDATA[<= ]]> #{endDate}</if>
  </select>
  
  <!-- MyBatis计算choose测试条件的值,
  	且使用第一个值为TRUE的子句。如果没有条件为true,则使用otherwise内的子句 -->
  <select id="searchCourseByChoose" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<choose>
  		<when test="searchBy == 'teaId'">where tea_id = #{id}</when>
  		<when test="searchBy == 'courseName'">where cou_name like #{courseName}</when>
  		<otherwise>where start_dt >= #{startDt}</otherwise>
  	</choose>
  </select>
  
  <!-- where元素只有在其内部标签有返回内容时才会在动态语句上插入WHERE条件语句。
  		并且,如果WHERE子句以AND或者OR打头,则打头的AND或OR将会被移除。
		如果tutor_id参数值为null,并且courseName参数值不为null,
		则where标签会将AND name like#{courseName} 中的AND移除掉 -->
  <select id="searchCourseByWhere" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<where>
  		<if test="id!=null">tea_id = #{id}</if>
  		<if test="courseName!=null">and cou_name like #{courseName}</if>
	  	<if test="startDt!=null">and start_dt >= #{startDt}</if>
	  	<if test="endDt!=null"> and end_dt <![CDATA[<= ]]> #{endDt}</if>
  	</where>
  </select>
  
  <!-- trim元素和where元素类似,但是trim提供了在添加前缀/后缀 或者移除前缀/后缀方面提供更大的灵活性。
  	如果任意一个if条件为true,trim元素会插入WHERE,并且移除紧跟WHERE后面的AND或OR。-->
  <select id="searchCourseByTrim" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<trim prefix="where" prefixOverrides="and|or">
  		<if test="id!=null">tea_id = #{id}</if>
  		<if test="courseName!=null">and cou_name like #{courseName}</if>
  	</trim>
  </select>
  
  <!-- foreach 可以迭代遍历一个数组或者列表,构造AND/OR条件或一个IN子句 -->
  <select id="searchCourseByForeach" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<if test="teaIds!=null">
	  	<trim prefix="where tea_id in(" suffixOverrides="," suffix=")">
	  		<foreach item="teaId" collection="teaIds">
	  		#{teaId},
	  		</foreach>
	  	</trim>
  	</if>
  </select>
  
  <!-- 使用foreach生成 IN子句 -->
  <select id="searchCourseByForeach1" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<if test="teaIds!=null">
  		<where>
  			tea_id in
  			<foreach item="teaId" collection="teaIds" open="(" separator="," close=")">
	  		#{teaId}
	  		</foreach>
  		</where>
  	</if>
  </select>
  
  <select id="searchCourseByForeach2" parameterType="hashmap" resultMap="CourseResult">
  	select * 
  	from course
  	<if test="teaIds!=null">
  		<where>
  			<foreach item="teaId" collection="teaIds">
	  		or tea_id = #{teaId}
	  		</foreach>
  		</where>
  	</if>
  </select>
  
  <!-- set元素和where元素类似,如果其内部条件判断有任何内容返回时,他会插入SET SQL片段 -->
  <update id="updateCourse" parameterType="Course">
  	update course
  	<set>
  		<if test="teaId!=null">tea_id = #{teaId},</if>
  		<if test="couName!=null">cou_name = #{couName},</if>
	  	<if test="startDt!=null">start_dt = #{startDt},</if>
	  	<if test="endDt!=null">end_dt = #{endDt},</if>
  	</set>
  	where cou_id=#{couId}
  </update>
</mapper>

mybatis之动态sql总结

1.Mybatis的动态sql介绍 如果读者你之前玩过Jdbc相关的框架,你可能就会明白sql拼接的无奈,然后拼接成变量,作为参数传入再查询等等。动态sql的出现就是为了解决这个拼接的问题。动态sql...
  • ya_1249463314
  • ya_1249463314
  • 2016-12-18 11:32:49
  • 2810

MyBatis快速入门(三) 动态SQL

动态SQLMyBatis还有一个方便的功能就是动态SQL,可以根据条件智能生成SQL语句。这里的例子全部来自MyBatis文档。if标签下面这个例子使用了MyBatis的if元素,在标题不为空的情况下...
  • u011054333
  • u011054333
  • 2017-02-20 22:54:24
  • 924

Mybatis的动态SQL实现

一、动态SQL简介 MyBatis的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要...
  • xiaokang123456kao
  • xiaokang123456kao
  • 2017-03-27 17:08:29
  • 3874

Mybatis深入了解(五)----动态SQL

什么是动态SQL 实例 Mapperxml 测试代码 sql片段 定义sql片段 引用sql片段 foreach 应用场景 在输入参数类型中添加List ids传入多个id 修改Mapperxml ...
  • u010853701
  • u010853701
  • 2016-07-16 16:29:43
  • 1460

MyBatis——动态SQL讲解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有: if where set choose(when...
  • bear_wr
  • bear_wr
  • 2016-09-01 11:25:09
  • 11343

mybatis动态Sql(if-where)和sql片段

动态SQL可以极大地便利我们的综合查询: select * from user and username like '%${userCustom.use...
  • Dove_Knowledge
  • Dove_Knowledge
  • 2017-09-05 13:15:11
  • 415

mybatis-动态sql语句-if用法

上一篇,初步了解了一下mybatis----mybatis-简介,我们已经了解mybatis进行调用的过程,这一次主要来说如何进行动态sql语句的拼写,这次主要讲解if的应用。 查询: 咱们接着上...
  • u013038643
  • u013038643
  • 2017-08-27 15:50:08
  • 1420

myBatis中的动态sql

在美团一面被问到这个问题,所以就来好好总结一下。 首先要知道动态sql是什么?在传统的JDBC方法中,在组合复杂的SQL语句的时候,我们需要去拼接,稍有不注意,例如少了一个空格,就会导致错误,很不方...
  • qq_27656675
  • qq_27656675
  • 2017-03-28 10:07:09
  • 298

mybatis注解动态sql

package vo.mapper;import java.util.List;import org.apache.ibatis.annotations.Delete; import org.apac...
  • Melod_bc
  • Melod_bc
  • 2016-07-11 12:20:32
  • 1463

Mybatis下动态sql中##和$$区别

一、介绍       mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: ...
  • u010662668
  • u010662668
  • 2017-03-20 14:46:57
  • 2272
收藏助手
不良信息举报
您举报文章:Mybatis之动态SQL
举报原因:
原因补充:

(最多只允许输入30个字)