MyBatis动态SQL(一)

MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

1.if标签

映射文件配置:

  	<select id="query" resultMap="baseMap" parameterType="user">
		select * from t_user
		<!-- 这里的1=1方便测试 -->
		 where 1=1
		 <!-- 条件if标签通过判断name参数是否为空决定是否使用这个SQL语句 -->
		<if test="name!=null" >
			and name=#{name}
		</if>
	</select>

测试代码name=null的情况下:

@Test
	public void test() {
		List<User> list = mapper.query(new User());
		for (User user : list) {
			System.err.println("在name=null的情况下"+user);
		}
	}

测试结果:
在这里插入图片描述
测试代码name!=null的情况下:

@Test
	public void test() {
		User testUser = new User();
		testUser.setName("zhangsan");
		List<User> list = mapper.query(testUser);
		for (User user : list) {
			System.err.println("在name=null的情况下"+user);
		}
	}

在这里插入图片描述

2. choose,when,otherwise

choose选择语句,差不多等同于java语句中的switch语句。通过创建多个标签元素来选择符合要求的元素。when表示在满足某种情况下调用该内容,otherwise表示在所有情况都不满足的情况下调用的内容。
配置标签代码使用方式:

<select id="query" resultMap="baseMap" parameterType="user">
		select * from t_user
		 where 1=1
		 <!-- 如果满足其中的条件就调用其中的SQL语句 -->
		<choose>
			<when test="no!=null">
				and no=#{no}
			</when>
			<when test="name!=null">
				and name=#{name}
			</when>
			<otherwise>
				<if test="age!=null" >
					and age=#{age}
				</if>
			</otherwise>
		</choose>
	</select>

3.where

上述配置代码中为了方便测试我都在where后面添加1=1来方便测试,但是有时候我们对where是否使用也需要动态决定。这个时候就可以使用where标签来解决这个问题。

<select id="queryById" resultType="user" parameterType="int">
		select * 
		from t_user 
		<where>
			<if test="no!=null" >
					 no=#{no}
				</if>
		</where>
	</select>

这里满足条件就会自动添加where并调用其中的SQL代码。

4.set

set标签主要用于SQL更新UPDATE代码中,用法如下代码:

<update id="update" parameterType="user">
		update t_user 
		<!-- 通过set来动态设置更新的参数 -->
		<set>
			<if test="name!=null">name=#{name}</if>
			<if test="age!=null">age=#{age}</if>
		</set>
		where no = #{no} 
	</update>

5.trim

trim标签是一个格式化标签,可以用来代替set或者where标签的功能。具体用法如下代码:

<update id="update" parameterType="user">
		update t_user 
		<!-- <set>
			<if test="name!=null">name=#{name}</if>
			<if test="age!=null">age=#{age}</if>
		</set> -->
		<!-- prefix表示调用SQL语句时在最前面添加的前缀
			prefixOverrides表示调用SQL语句时去掉的第一个指定内容
			suffix表示调用SQL语句时在最后面添加的后缀
			suffixOverride表示调用SQL语句时去掉的最后一个指定内容
		 -->
		<trim prefix="set" prefixOverrides="and | or">
			<if test="name!=null"> and name=#{name}</if>
			<if test="age!=null"> or age=#{age}</if>
		</trim>
		where no = #{no} 
	</update>

通过这个trim获得了跟set一样的效果,不过更具有灵活性。

原文地址:https://www.cnblogs.com/xj619/p/11182318.html