学习交流欢迎+V:boge_java 欢迎你的到来哦
mybatis教程4(动态SQL)

动态SQL语句

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

if语句

动态 SQL 通常要做的事情是根据条件包含 where 子句的一部分。比如:

<select id="queryUser" resultMap="baseMap"
 	 resultType="com.sxt.bean.User" parameterType="user"> 
	select id ,name ,age  from t_user 
	where 1 =1 
	<if test="username!=null">
	     and name = #{username}
	</if>  
</select> 
// 接口
public List<User> queryUser(User user);

测试
在这里插入图片描述在这里插入图片描述

choose, when, otherwise

有时我们不想应用到所有的条件语句,而只想从中择其一项。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

where语句

在使用if语句做动态条件处理的时候如果所有条件都不满足,那么得到的SQL语句如下:

select * from t_user where 

在这种情况下,我们一般会加一个1=1来匹配语法规则

	<select id="queryUser" resultMap="baseMap"
	 	 resultType="com.sxt.bean.User" parameterType="user"> 
		select id ,name ,age  from t_user 
		where 1 =1  
		<if test="username!=null">
		     and name = #{username}
		</if>  
	</select> 

此时可以使用标签来处理这种情况

	<select id="queryUser" resultMap="baseMap"
	 	 resultType="com.sxt.bean.User" parameterType="user"> 
		select id ,name ,age  from t_user 
		<where>
			<if test="username!=null">
			     and name = #{username}
			</if>  
		</where>
	</select> 

在这里插入图片描述在这里插入图片描述在这里插入图片描述

set语句

set主要也是用来解决更新问题的。

<update id="updateBookById">
	update t_book
	<set>
			<if test="author!=null"> author=#{author},</if>
			<if test="name!=null"> b_name=#{name},</if>
			<if test="price!=null"> price=#{price},</if>
	</set>
	where id=#{id};
</update>

trim

trim标记是一个格式化的标记,可以完成set或者是where标记的功能

属性 说明
prefix 前缀
prefixOverrides 去掉第一个指定内容
suffix 后缀
suffixoverride 去掉最后一个指定内容

替代<where>的用法

	<select id="queryUser" resultMap="baseMap" resultType="com.sxt.bean.User"
		parameterType="user">
		select id ,name ,age from t_user
		<!-- <where>
			<if test="username!=null">
				and name = #{username}
			</if>
		</where> -->
		<trim prefix="where" prefixOverrides="AND |OR ">
			<if test="username!=null">
				 and name = #{username}
			</if>
			<if test="age != 0">
				and age = #{age}
			</if>
		</trim>
	</select>

替代<set>的用法

<update id="updateUser" parameterType="User">
	update t_user
	<trim prefix="set" suffixOverrides=",">
		<if test="username!=null">
			name = #{username},
		</if>
		<if test="age != 0">
			age = #{age}
		</if>
	</trim>
	where id=#{id}
</update>

或者

<update id="updateUser" parameterType="User">
	update t_user
	set 
	<trim  suffixOverrides=",">
		<if test="username!=null">
			name = #{username},
		</if>
		<if test="age != 0">
			age = #{age}
		</if>
	</trim>
	where id=#{id}
</update>

在这里插入图片描述

foreach语句

foreach用来遍历,遍历的对象可以是数组,也可以是集合。

属性 说明
collection collection属性的值有三个分别是list、array、map三种
open 前缀
close 后缀
separator 分隔符,表示迭代时每个元素之间以什么分隔
item 表示在迭代过程中每一个元素的别名
index 用一个变量名表示当前循环的索引位置
接口中方法
public interface UserMapper {
	// 如果不指定@Param 默认是array
	public List<User> queryUserByIds(@Param("ids")List<Integer> ids);

	public int insertUser(@Param("users")List<User> users);
}
<select id="queryUserByIds" resultType="user">
	select * from t_user where id in 
	<foreach collection="ids" open="(" close=")" separator="," item="id" >
		#{id}
	</foreach>
</select>

<insert id="insertUser">
	insert into t_user(name,age)values
	<foreach collection="users" item="user" separator=",">
		(#{user.name},#{user.age})
	</foreach>
</insert>

在这里插入图片描述在这里插入图片描述

bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。

<select id="getUserById" resultMap="baseMap" resultType="com.sxt.bean.User">
	<!-- 声明了一个参数aaa 在后面就可以使用了 -->
	<bind name="aaa" value="12"/>
	select
	id ,name ,age from t_user where id=${aaa}
</select>

在这里插入图片描述

sql块

sql片段一般用来定义sql中的列
在这里插入图片描述

posted on 2019-01-23 12:00  波波烤鸭  阅读(545)  评论(0编辑  收藏  举报
学习交流欢迎+V:boge_java 欢迎你的到来哦