动态SQL

动态SQL

< if>

类似于JAVA中的if语句,用法示例如下:

<if test="uname != null and uname != ''">uname = #{uname},</if>

< choose>,< when>,< otherwise>

类似于JAVA中的switch语句,用法示例如下:

<choose>
			<when test="usex!=null and usex!=''">
				#{usex}
			</when>
			<otherwise>
				'男'
			</otherwise>
		</choose>

< trim>,< where>,< set>

< trim>元素的主要功能是可以在自己包含的内容加上某些前缀,也可以在其后加上某些后缀,与之对应的是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性为prefixOverrides和suffixOverrides。正因为有这样的功能,所以可以很简单的使用其代替< where>元素。
代码示例如下:

select * from user
<trim prefix = "where" prefixOverrides = "and | or">
	<if test = "uname != null and uname != ''">
    	and uname like concat('%',#{uname},'%')
    </if>
    <if test = "usex != null and usex !=''">
    	and usex = #{usex}
    </if>
</trim>

< where>

where元素是会在写入where元素的地方输出一个where,另外一个好处是不需要考虑where元素里面的条件输出是什么样子的MyBatis将会只能处理。如果所有条件不满足,那么MyBatis就会查出所有记录,如果输出后是以and开头,MyBatis会把第一个and忽略,当然如果是以or开头的,MyBatis也会把它忽略;此外,在where中不需要靠考虑空格问题MyBatis将会自动加上。
代码示例如下:

select * from user
		<where>
			<foreach collection="list" item="lastname" separator="or">
				uname like concat(#{lastname},'%')
			</foreach>
		</where>

< set>

在动态update可以使用set来动态更新列。
代码示例如下:

<update id="updateUser" parameterType="po.MyUser">
		update user
		<set>
			<if test="uname != null and uname != ''">uname = #{uname},</if>
			<if test="usex !=null and usex !=''">usex = #{usex}</if>
		</set>
		where uid = #{uid}
	</update>

< foreach>

foreach元素主要用在构建in条件中,它可以在SQL语句中迭代一个集合。foreach元素的属性主要有item、index、collection、open、separator、close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束。在使用foreach元素时,最关键、最容易出错的时collection属性,该属性时必选的,但在不同的情况下该属性的值是不一样的,主要有以下3种清空:

  • 如果传入的是单参数且参数类型是一个List,collection属性值为list。
  • 如果传入的单参数且参数类型是一个array数组,collection的属性值为array。
  • 如果传入的参数是多个,需要把他们封装成一个Map,当然单参数也可以封装成Map。Map的key是参数名,collection属性值是传入的LIst或array对象在自己封装的Map种的key

代码示例如下:

<foreach collection="list" item="lastname" separator="or">
				uname like concat(#{lastname},'%')
</foreach>

< bind>

在进行模糊查询时,如果使用${}拼接字符串,则无法仿制SQL诸如问题;如果使用字符串拼接函数或连接符号,但不同的数据库的拼接函数或连接符号不同,SQL文件就需要根据不同的数据库提供不同的实现,显然比较麻烦,且不利于代码移植,因此bind便是解决这一问题。
代码示例如下:

<select id="selectUser3" parameterType="list" resultType="po.MyUser">
		select * from user
		<where>
			<foreach collection="list" item="lastname" separator="or">
				<bind name="last_name" value="last_name+'%'"/>
				uname like #{last_name}
			</foreach>
		</where>
	</select>

参考教材《JavaEE框架整合开发入门到实战》侵删。
本人现役大三小白一枚,如有不足之处还望指正。

posted @ 2020-04-01 12:03  Aaron`Joe  阅读(62)  评论(0)    收藏  举报