Mybatis学习笔记(二)

一、动态SQL

1、什么是动态SQL?
动态 SQL 是 MyBatis 的强大特性之一。动态SQL基于OGNL表达式,可以在SQL语句中方便的实现某些逻辑,使我们对SQL语句进行动态的组装拼接,解决使用JDBC手动拼接SQL的麻烦。

2、动态SQL的元素
Mybatis框架动态SQL中的元素,如下表所示:

SQL元素 说明
判断语句,用于但条件分支判断
(, 相当于Java中的switch…case…default语句,用于多条件分支判断
简化SQL语句中where的条件判断
可以灵活的去除多余的关键字
解决动态更新语句
循环语句,常用于in语句等列举条件中
从OGNL表达式中创建一个变量,并将其绑定到上下文中,常用于模糊查询的SQL中

3、使用动态SQL完成多条件查询

3.1、使用元素和元素实现多条件查询
元素常用于where后面的多条件判断语句中。在实际需求中,我们可能需要根据多个条件来精确查找某个数据。例如要查询用户的信息,可以通过姓名和职业来查找,也可以仅仅通过姓名来查找,此时职业就不是非必须条件。对于这种需求,可以使用元素来实现。

<select id="selectUser" resultType="user">
		select * from user where
		<if test="username != null and username != '' ">
				username=#{username}
		if>
		<if test="role!= null and role!= '' ">
				and role=#{role}
		if>
select>

if元素中的test属性表示,拼接if元素中的SQL语句需要满足的条件。试想一下,对于上述代码,如果不传入username只根据role来查询时,SQL语句将变成“select * fom user where and role=#{role}”。如果不传入username和role来查询所有用户,SQL语句将变成“select * from user where”。显然这两个SQL语句都存在语法错误。需要解决这些问题,就需要智能到的处理where和and这两个关键词。

元素主要是用来简化SQL语句中where条件判断,并且智能的处理元素and和or。不必担心多余的关键词导致语法错误。使用元素将上述代码进行改造:

<select id="selectUser" resultType="user">
		select * from user 
		<where>
			<if test="username != null and username != '' ">
				username=#{username}
			if>
			<if test="role!= null and role!= '' ">
				and role=#{role}
			if>
		where>
select>

where元素标签会自动识别其标签内是否有返回值,若有就插入一个where。此外,若该标签返回的内容是以and或or开头的,则自动剔除。

3.2、使用+完成多条件查询
可以使用标签代替标签的使用。trim元素也会自动检测标签内的返回值,若有返回值,则会在已包含的内容前加上或覆盖指定的前缀,或在其后加上或覆盖某些后缀。

属性 说明
prefix 加前缀
suffix 加后缀
prefixOverrides 去掉前缀
suffixOverrides 去掉后缀
使用示例:
<select id="selectUser" resultType="user">
		select * from user 
		<trim prefix="where" prefixOverrides="and | or">
			<if test="username != null and username != '' ">
				username=#{username}
			if>
			<if test="role!= null and role!= '' ">
				and role=#{role}
			if>
		trim>
select>

3.3、
在实际应用中,有时只需要从多个选项中选择一个用于执行。使用元素显然是不合理的,对于这种情况,可以使用实现。

<select id="selectUser" resultType="user">
		select * from user where 1=1
		<choose>
			<when test="username != null ">
				and username=#{username}
			when>
			<when test="role!= null">
				and role=#{role}
			when>
			<otherwise>
				and phone=#{phone}
			<otherwise>
		

你可能感兴趣的:(SSM,Mybatis)