MyBatis to use dynamic SQL

MyBatis to use dynamic SQL

Dynamic sql: SQL stitching solve a lot of work

1.sql

	可以利用<sql>将一些公共sql语句抽取为公共部分,要用的时候用<include>标签包含
	<sql id="base_user">
		id,name,password
	</sql>
	<select id="getUserById" resultMap="userMap">
		select <include refid="base_user"/> from t_user where id = #{id}
	</select>  

2.if

	判断,字符串要判断两种情况,null和''  
	需求:我们在做用户查询时,有可能带用户名,有可能不带
	<select id="findUser" resultMap="userMap">
		select 
			<include refid="base_user"/> 
		from 
			t_user
		where 1=1
		<if test="username != null and username != ''">
			and name = like concat("%",#{username},"%")
		</if>
	</select>

Query time by giving or value does not give the username to observations

3.where

	会自动加where关键字
	会自动删除掉多余的and
	<select id="findUser2" resultMap="userMap">
		select
			<include refid="base_user"/> 
		from 
			t_user
		<where>
			<if test="id != null">
				and id = #{id}
			</if>
			<if test="username != null and username != ''">
				and name like concat("%",#{username},"%")
			</if>
			<if test="password != null and password != ''">
				and password = #{password}
			</if>
		</where> 
	</select>  

4.set suppose a table has more than one field, but we only need to update the fields that need updating, reducing network bandwidth

	会自动加set关键字
	会自动删除掉多余的逗号  
	<update id="updateUser">
		update 
			t_user 
		<set>
			<if test="username != null and username != ''">
				name=#{username},
			</if>
			<if test="password != null and password != ''">
				password=#{password},
			</if>
		</set> 
		where id=#{id}
	</update>

5.trim

	可以替代where和set,利用prefix、prefixOverrides、suffix、suffixOverrides
	<!-- 
		prefix:在trim标签内sql语句加上前缀。
		suffix:在trim标签内sql语句加上后缀
		prefixOverrides:指定去除多余的前缀内容
		suffixOverrides:指定去除多余的后缀内容
	-->
	<select id="findUser3" resultMap="userMap">
		select
			<include refid="base_user"/> 
		from 
			t_user
		<trim prefix="where" prefixOverrides="and">
			<if test="id != null">
				and id = #{id}
			</if>
			<if test="username != null and username != ''">
				and name like concat("%",#{username},"%")
			</if>
			<if test="password != null and password != ''">
				and password = #{password}
			</if>
		</trim>
	</select>  
	<update id="updateUser2">
		update 
			t_user 
		<trim prefix="set" suffixOverrides="," >
			<if test="username != null and username != ''">
				name=#{username},
			</if>
			<if test="password != null and password != ''">
				password=#{password},
			</if>
		</trim>
		where id=#{id}
	</update>  

6.choose

类似于switch case default
里面用<when>,最后用<otherwise>
<select id="findUser4" resultMap="userMap">
		select
			<include refid="base_user"/> 
		from 
			t_user
		<where>
			<choose>
				<!-- 如果第一个when执行了,name后面的when不会执行,以此类推,前面的when执行了,那后面的when不会执行 -->
				<when test="username != null and username != ''">
					and name like concat("%",#{username},"%")
				</when>
				<when test="password != null and password != ''">
					and password = #{password}
				</when>
				<otherwise>
					and name is not null
				</otherwise>						
			</choose>
		</where> 
	</select>  

7.foreach

	循环遍历
	collection:集合名称
		a)数组:arry
		b)集合(list):list
		c)map:用key获取集合
		d)设置别名了就用别名
	open:循环开始执行
	close:循环结束执行
	item:当前循环的对象
	separator:每循环一次添加的内容
	<delete id="deleteUser">
		DELETE FROM t_user WHERE id IN
		<foreach collection="list" open="(" close=")" item="id" separator="," >
			#{id}
		</foreach>
	</delete>  

Guess you like

Origin blog.csdn.net/qq_36510947/article/details/82784338