动态sql

if

作用:对sql进行判断拼接。
举例:

<select id="findUserById" resultType="user">
    select * from user where 
        <if test="id != null">
               id=#{id}
        </if>
</select>

但是如果后面if标签很多的话,可能就会出现问题,比如:

<select id="findUserById" resultType="user">
    select * from user where 
        <if test="id != null">
               id=#{id}
        </if>
        <if test="name != null">
               and name=#{name}
        </if>
</select>

就很有可能变成这样—— select * from user where and name=#{name},这样就出问题了,所以有了where

where

作用:当WHERE后紧随AND或则OR的时候,就去除AND或者OR。
举例:

<select id="findUserById" resultType="user">
	select * from user
		<where>
	        <if test="id != null">
	               id=#{id}
	        </if>
	        <if test="name != null">
	               and name=#{name}
	        </if>
		</where>
</select>

上面的where标签,其实用trim也可以实现,而且:where只会去除前面的andor,不会去除后面的
举例:

<select id="findUserById" resultType="user">
	select * from user
		<where>
	        <if test="id != null">
	               id=#{id} and
	        </if>
	        <if test="name != null">
	               name=#{name}
	        </if>
		</where>
</select>

像这种情况,可能会出现这样的sql语句:select * from user where id=#{id} and。trim标签可以解决这样的问题。

trim

参数:

  • prefix=“”:前缀。trim标签体中是整个字符串拼串 后的结果。prefix给拼串后的整个字符串加一个前缀。
  • prefixOverrides=“”:前缀覆盖。 去掉整个字符串前面多余的字符。
  • suffix=“”:后缀。suffix给拼串后的整个字符串加一个后缀 。
  • suffixOverrides=“”:后缀覆盖。去掉整个字符串后面多余的字符。

举例:(代替where)

<select id="findUserById" resultType="user">
	select * from user
		<trim prefix="where" suffixOverrides="and">
	        <if test="id != null">
	               id=#{id} and
	        </if>
	        <if test="name != null">
	               name=#{name}
	        </if>
		</trim>
</select>

choose

这里有三个标签,看例子
描述:分支选择。如果带了id就用id查,如果带了name就用name查;只会进入其中一个。
举例:

<select id="findUserById" resultType="user">
	select * from user where
 		<!-- 如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个 -->
 		<choose>
 			<when test="id!=null">
 				id=#{id}
 			</when>
 			<when test="name!=null">
 				name like #{name}
 			</when>
 			<when test="email!=null">
 				email = #{email}
 			</when>
 			<otherwise>
 				某某字段... = 0
 			</otherwise>
 		</choose>
</select>

set

作用:可去除where前多余的逗号。
举例:

<update id="updateEmp">
	update tbl_employee 
		<set>
			<if test="name!=null">
				last_name=#{lastName},
			</if>
			<if test="email!=null">
				email=#{email},
			</if>
			<if test="gender!=null">
				gender=#{gender}
			</if>
		</set>
	where id=#{id} 
</update>

这个用trim 可表示为:

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

foreach

遍历,批量保存

遍历:

 <!--public List<Employee> getEmpsByConditionForeach(List<Integer> ids);  -->
 <select id="getEmpsByConditionForeach" resultType="com.atguigu.mybatis.bean.Employee">
 	select * from tbl_employee
 	<!--
 		collection:指定要遍历的集合:(通过注解@Param("ids")指定)
 			list类型的参数会特殊处理封装在map中,map的key就叫list
 		item:将当前遍历出的元素赋值给指定的变量
 		separator:每个元素之间的分隔符
 		open:遍历出所有结果拼接一个开始的字符
 		close:遍历出所有结果拼接一个结束的字符
 		index:索引。遍历list的时候是index就是索引,item就是当前值
 				      遍历map的时候index表示的就是map的key,item就是map的值
 		
 		#{变量名}就能取出变量的值也就是当前遍历出的元素
 	  -->
 	<foreach collection="ids" item="item_id" separator=","
 		open="where id in(" close=")">
 		#{item_id}
 	</foreach>
 </select>

批量保存

两种方式:
方式一:

<!-- 批量保存 -->
<!--public void addEmps(@Param("emps")List<Employee> emps);  -->
<!--MySQL下批量保存:可以foreach遍历   mysql支持values(),(),()语法-->
<insert id="addEmps">
 	insert into tbl_employee(
 		<include refid="insertColumn"></include>
 	) 
	values
	<foreach collection="emps" item="emp" separator=",">
		(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
	</foreach>
</insert>

方式二:

<!-- 这种方式需要数据库连接属性allowMultiQueries=true;
这种分号分隔多个sql可以用于其他的批量操作(删除,修改) -->
<insert id="addEmps">
	<foreach collection="emps" item="emp" separator=";">
		insert into tbl_employee(last_name,email,gender,d_id)
		values(#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id})
	</foreach>
</insert>

批量删除

这个也一样,和批量保存一样

两个内置参数——_parameter_databaseId

  • _parameter:代表整个参数
    单个参数:_parameter就是这个参数
    多个参数:参数会被封装为一个map;_parameter就是代表这个map
  • _databaseId:如果配置了databaseIdProvider标签。_databaseId就是代表当前数据库的别名

举例:和下面的bind标签例子一样。。。
加个这个:


bind

场景:sql模糊查询需要用户输入一个值时,只能使用$,因为#会自动给参数做预处理——加引号(防止sql注入),有两种方法可实行,一是用户传参时自带%_等——%e_。二是使用bind标签。所以bind标签的作用是:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值。
举例:

<!--public List<Employee> getEmpsTestInnerParameter(Employee employee);  -->
<select id="getEmpsTestInnerParameter" resultType="com.atguigu.mybatis.bean.Employee">
		<!-- bind:可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值 -->
		<bind name="_lastName" value="'%'+lastName+'%'"/>
		<if test="_databaseId=='mysql'">
			select * from tbl_employee
			<if test="_parameter!=null">
				where last_name like #{lastName}
			</if>
		</if>
		<if test="_databaseId=='oracle'">
			select * from employees
			<if test="_parameter!=null">
				where last_name like #{_parameter.lastName}
			</if>
		</if>
</select>

sql

作用:抽取可重用的sql片段。方便后面引用。
如何使用:sql标签定义片段,include标签引用片段。include好像还可以自定义一些property,sql标签内部就能使用自定义的属性,这个碰到再说,还没碰到。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值