MyBatis之动态SQL

什么是动态sql

mybatis 核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

为什么使用动态sql

利用动态 SQL可以很方便地根据不同条件拼接 SQL 语句。

怎么使用动态sql

我们使用不同的标签 具体操作在数据库中每个表对应模块的对应xml文件,与EL、JSTL有几分相似之处

具体操作如下:

  1. where标签:我们可以发现 有了where标签就不用在sql语句中写where了
<!-- 用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
  	select id,user_name userName,password,real_name realName,age from user_info
  	<!--where标签-->
  	<where>
  		user_name like #{userName}
   	</where>
   	<!--拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName}-->
 </select>
  1. if标签:这个if标签常用于where中 来拼接where子句
    如果细心点会发现,下面两个if标签中的待拼接语句都有and,不用担心,我们的where标签在sql语句拼接时,会自动地去掉第一个and(或or)
<!-- 还是用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
  	select id,user_name userName,password,real_name realName,age from user_info
  	<where>
  		<!--在where标签中写if标签,如果这里不等于null,则拼接上标签内语句-->
		<if test="userName!=null">
    				and user_name like #{userName}
   		</if>
   		<!--同上-->
		<if test="age!=null">
    				and age like #{age}
   		</if>
  	</where>
  	<!--如果两个参数都不为null,则拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName} and age like #{age}-->
</select>
  1. choose (when, otherwise):类似于Java中的switch语句
<!-- 还是用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
  	select id,user_name userName,password,real_name realName,age from user_info
  	<where>
  		<!--where标签中的choose标签,条件判断类似与switch语句,如果userName!=null则将第一个when标签中的语句与主语句进行拼接,并且不再判断第二个when标签-->
   		<choose>
    			<when test="userName!=null">
     				and user_name like #{userName}
    			</when>
    			<when test="age!=null">
     				and age like #{age}
    			</when>
   		</choose>
  	</where>
  	<!--如果两个参数都不为null,则拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName}-->
</select>
  1. set标签:用于update语句中,set标签与where标签类似,有了set标签就不用在语句中写关键字set了
    并且细心的你可以发现,每个if标签中的语句最后都有一个逗号,set标签在拼接其中语句时会去掉最后一个逗号
<update id="update">
  	update user_info
  	<set>
   		<if test="userName!=null">
    			user_name=#{userName},
   		</if>
   		<if test="realName!=null">
    			real_name=#{realName},
   		</if>
  	</set>
  	where id=#{id}
  	<!--如果两个参数都不为null,则拼接结果为:update user_info set user_name=#{userName},real_name=#{realName} where id=#{id}-->
 </update>
  1. foreach标签:foreach元素用于对一个集合进行遍历,构建 IN 条件语句时常用该元素;foreach 元素允许指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量,也允许指定开头与结尾的字符串以及在迭代结果之间放置分隔符。
<!--我们用一个delete语句来演示一下foreach标签的功能,假设我们这里delete 方法传入的参数是要删除数据id的List集合-->
<delete id="delete">
	delete from user_info where id in 
	<!--collection指定被遍历集合,item为遍历的结果项,open为拼接语句的开头,close为结尾,separator决定每项之间用什么间隔-->
	<foreach item="id" collection="list" open="(" close=")" separator=",">
		<!--我们假设这里的id遍历出来分别为1、2、3-->
		#{id}
  	</foreach>
  	<!--则最后拼接成的sql语句为:delete from user_info where id in (1,2,3)-->
</delete>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值