存在原因
我们在数据库中查询的时候,写的是固定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是对的,这需要源码去详细解读,如果解决了我会在后续进行补充,也欢迎看客老板们告知。
在这种条件判断的时候一定要注意,我们在代码中如果判断一个属性是否为空,那么我们在定义属性的时候就不可以将其定义为基本类型,否则在初始化的时候就已经有值了,并不存在判断是否为空这一说法。