要了解mybatis动态sql用法,我们得先知道为什么要使用动态sql
其实很好理解,打个比方,我们要实现一个搜索的功能,但是这个要搜索的种类很多,并且种类里面有很多小的选项,我们要实现它的搜索,就要在接口里写很多的方法来对应用户选择的搜索条件,在这种情况下,就会需要用到我们的动态sql,它会根据不同的条件来拼接我们的sql语句,来实现用户的搜索
动态sql的实现,我们可以根据映射器配置文件和注解这两种方式来实现
映射器配置文件来实现动态sql,主要就是根据不同的标签组合来完成,常见的标签有where、if、choose、when、otherwise、foreach、trim、set、bind等元素,下面,我给大家讲讲各种元素的用法
where、if标签,看见这两个标签,我们肯定会想到条件和判断,没错,他两就是这个意思,如果我们的sql语句需要条件,就可以使用他们,具体用法如下
查询中,条件有很多,但是我们不知道用户具体根据什么条件来查询,可以这样写:
<select id="xxx" resultType="xxx" parameterType="对象">
select xxx from 表名
<where>
<if test="属性名 != null"> //该属性类型的默认值
and 字段名 = #{属性名}
</if>
<if test="属性名 != 0"> //该属性类型的默认值
and 字段名 = #{属性名}
</if>
</where>
</select>
根据传进来的对象,我们先判断它的属性是否为默认值,是的话用户就没有传,不走里面的条件
where标签有三个特点,让我们用起来很是方便
1. 没有任何条件的时候 where标签整体不出现 也不会添加where关键词
2. 如果只有一个表达式,将会把遇到的第一个 and 去掉
3. 当有条件的时候 会添加一个 Where 关键词
choose、when、otherwise元素 、和我们java中switch一样,做多条件分支判断,简直不要太像
<select id="xxx" resultType="xxx" parameterType="xxx">
select * from 表名
<where>
<choose>
<when test="属性名 != null"> and 字段名= #{属性名} </when>
<when test="属性名!= null"> and s字段名 = #{属性名} </when>
<when test="属性名!= 0"> and 字段名 = #{属性名} </when>
<when test="属性名!= 0"> and 字段名 = #{属性名} </when>
<!-- default -->
<otherwise> and 字段名 = 值 </otherwise>
</choose>
</where>
</select>
when标签和java中的switch中case一样,otherwise与default一样,如果前面条件都不满足,会执行otherwise中的条件
foreach元素,循环语句,在in语句等列举条件常用
<select id="xxx" resultType="xxx" >
select * from 表名 where 字段名
<foreach collection="array(list)" item="x" open=" in (" close=")" separator=",">
#{x}
</foreach>
</select>
根据上面代码,简单翻译一下:select * from 表名 where 字段名 in( #{x})
它有5个常用属性:
(collection 集合用list 数组用array)
( item 每个元素的存放起一个变量名)
(open 开始添加一个)
(close 结束添加一个)
( separator 每个元素的分隔符)
set标签、一般用于修改
<update id="xxx" parameterType="xxx">
update 表名
<set>
<if test="属性 != null">
字段名=#{属性},
</if>
<if test="属性 != null">
字段名=#{属性},
</if>
<if test="属性 != null">
字段名=#{属性},
</if>
<if test="属性 != null">
字段名=#{属性},
</if>
</set>
<where> 字段名 = #{属性} </where>
</update>
set标签有两个特点,它会让我们的set标签更智能化
1. 如果有天见,会自动添加一个set 关键词
2. 会将条件中的最后一个, 去掉
trim标签、也叫万能标签,一般用于新增,它能代替 where标签 set 标签
有四个常用属性:
prefix 开头添加一个
prefixOverrides 开头去掉一个
suffix 结尾添加一个
suffixOverrides 结尾去掉一个
<insert id="xxx" parameterType="xxx">
insert into 表名
<trim prefix="(" suffixOverrides="," suffix=")"> //开头加"(",结尾加")",结尾减","
<if test="属性 != null">
字段名,
</if>
<if test="属性 != 0">
字段名,
</if>
<if test="属性 != null">
字段名,
</if>
</trim>
values
<trim prefix="(" suffixOverrides="," suffix=")"> //开头加"(",结尾加")",结尾减","
<if test="属性 == null">
#{属性},
</if>
<if test="属性 != 0">
#{属性},
</if>
<if test="属性 != null">
#{属性},
</if>
</trim>
</insert>
bind标签、用来定义变量,一般我们会用他做模糊查询
<select id="xxx" resultType="xxx" parameterType="xxx">
<bind name="aa" value="'%'+_parameter+'%'"/>
select * from 表名 where 字段名 like #{aa}
</select>
与我们正常的模糊查询一样,只是在查询前重新定义了传进来的参数,给它加上了模糊查询的符号,起了个变量名,记得要给%加上单引号
映射器配置文件来实现动态sql基本就这么多内容,还是比较好理解的,就和我们字符串的拼接接一样,把他们组成新的sql语句,还有一种注解的方式来完成dongtaisql,有兴趣的可以了解一下,和我们用配置文件实现大同小异