mybatis之动态SQL

存在原因

我们在数据库中查询的时候,写的是固定SQL,也就是每次查询都得写一条SQL,但是在程序中,很明显如果一个表中的字段过多,那么可以根据任意字段的组合进行查询更新等操作,这个代码量是特别巨大的,这个时候就出现了动态SQL解决这一问题,就是对于条件我们进行拼接,有条件则进行条件查询,如果没有该条件则不进行条件查询。

	<select id="queryAuthor" resultType="Author" >
		select * from Author where 1=1
		<if test="sex!=null">AND sex=#{sex}</if>
		<if test="aname!=null">AND aname=#{aname}</if>
	</select>

在这段代码中可以看出,我们可以按照性别查询,也可以根据名字查询,注意处理where语句,因为是SQL拼接,所以注意字段的完整及有效。这种情况可以使用标签进行解决,

	<select id="queryTrim" resultType="Author">
		select * from Author
		<trim prefix="where" prefixOverrides="AND|OR">
		<if test="sex!=null">AND sex=#{sex}</if>
		<if test="aname!=null">AND aname=#{aname}</if>
		</trim>
	</select>

在这里就可以看见使用prefix进行解决,这里表示拼接SQL的前缀,prefixOverrides表示进行覆盖的字符串,这里的and和or都可以进行覆盖,就是如果出现and和or多余的情况,那么就可以直接进行覆盖处理。

我们在查询的时候也可以根据情况进行条件选择查询,就是使用choose标签,还有when、otherwise进行查询

	<select id="querywhen" resultType="Author">
		select * from Author where 1=1
		<choose>
			<when test="sex!=null">and sex=#{sex}</when>
			<when test="aname!=null">and aname like #{aname}</when>
			<otherwise>
				and sex="男"
			</otherwise>
		</choose>
	</select>

这个情况下,只需要满足且仅满足其中之一的条件可查,如果满足两个条件,那么按照代码的先后顺序进行选择,只要匹配一个就查询。

插入字段时的动态处理,有将所有可能插入的字段进行写入,在实际插入时,需要哪个字段就拼接即可完成插入。

	<insert id="insertCar" parameterType="Car" keyProperty="cid">
		insert into car
		<trim prefix="(" suffix=")" suffixOverrides=",">
			<if test="cname!=null">cname,</if>
			<if test="cnum!=null">cnum,</if>
			<if test="color!=null">color,</if>
			<if test="csize!=null">csize,</if>
			<if test="cperson!=null">cperson,</if>
		</trim>
		values
		<trim prefix="(" suffix=")" suffixOverrides=",">
			<if test="cname!=null">#{cname},</if>
			<if test="cnum!=null">#{cnum},</if>
			<if test="color!=null">#{color},</if>
			<if test="csize!=null">#{csize},</if>
			<if test="cperson!=null">#{cperson},</if>
		</trim>
	</insert>

更新操作,我们更新的字段往往只是其中的一部分,那么需要动态凭借条件

	<update id="updateCar" parameterType="Car">
	
	update car
		<set>
			<if test="cname!=null">cname=#{cname},</if>
			<if test="color!=null">color=#{color},</if>
			<if test="cnum!=null">cnum=#{cnum},</if>
			<if test="csize!=null">csize=#{csize},</if>
			<if test="cperson!=null">cperson=#{cperson},</if>
			cid=#{cid}
		</set>
		where cid=#{cid}
	</update>

在查询的时候我们可能会进行一些范围内的查询,比如:
SELECT * FROM car WHERE cid IN (1,3)

	<select id="selectCar" resultType="Car">
		select * from Car
		where cid in
		<foreach item="cars" collection="list" open="("  separator="," close=")">
			#{cars}
		</foreach>
		
	</select>

使用foreach标签进行遍历我们传入的集合,collection表示传入的集合的类型,在官网上表示可以是list、set、map但是我自己使用set时出错,只有list是对的,这需要源码去详细解读,如果解决了我会在后续进行补充,也欢迎看客老板们告知。
在这种条件判断的时候一定要注意,我们在代码中如果判断一个属性是否为空,那么我们在定义属性的时候就不可以将其定义为基本类型,否则在初始化的时候就已经有值了,并不存在判断是否为空这一说法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值