Mybatis动态 sql用法

要了解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,有兴趣的可以了解一下,和我们用配置文件实现大同小异

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值