一、动态sql的简述
什么是动态sql:在不同条件下拼接不同的sql
在我们以前用servlet的时候,我们就是用jdbc手动拼接的sql语句,我们在拼写的时候经常会出现sql拼写错误,比如入参写的不对,或者没有加单引号等等原因,那么动态sql语句就是帮我们去写这样的sql.
二、动态sql的使用案例
1. 元素---(讲课注意:username和sex必须一个为空)
根据 username 和 sex 来查询数据。如果username为空,那么将只根据sex来查询;反之只根据username来查询
首先先不使用动态sql
<select id="selectUserByUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
select * from user where username = #{username} and sex = #{sex}
</select>
上面的查询语句,我们可以发现,如果 #{username} 为空,那么查询结果也是空,如何解决这个问题呢?使用 if 来判断
使用动态sql
<select id="selectUserByUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
select * from user
where
<if test="username != null">
username=#{username}
</if>
<if test="sex != null">
sex=#{sex}
</if>
</select>
从上边的案例当中我们可以看出如果 sex 等于 null,那么查询语句为 select * from user where username=#{username},如果
username等于null,那么查询语句为select * from user where sex=#{sex}
但是如果username和sex都为空呢?
select * from user where username=#{username} sex=#{sex} 由于没有拼接,那么一定会报错
如何解决呢?请看下面的 where 语句
2.<where>---<if>元素
<select id="selectUserByUsernameAndSex" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User"> select * from user <where> <if test="username != null"> username=#{username} </if> <if test="sex != null"> and sex=#{sex} </if> </where> </select>
但是我们加上了 标签,如果username为空怎么办?sex当中的and会不会受影响?
从上图的案例当中我们可以看到如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
3、、元素 ------ 用来组装update语句
dao层
/** * 修改 * @param user * @return */ public int update(User user);
mapping
<update id="update" parameterType="com.qcby.entity.User">
update user
<set>
<if test="username !=null and username!=''">
username = #{username} ,
</if>
<if test="address != null and address != ''">
address = #{address}
</if>
</set>
where id = #{id}
</update>
3.测试
@Test
public void update(){
}