动态sql
sql的内容是变化的, 可以根据条件获取到不同的sql语句.主要是where部分发生变化。
为什么使用动态sql
使用动态sql可以解决某些功能的使用 例如使用条件查询某个商品 你输入价格,地区等等进行筛选,如果使用静态sql可能会查询出来的是一个空内容 但使用动态sql可以很好的解决这种问题
动态sql语句
if语句
<select id="selectName" parameterType="com.chai.bean.User" resultType="com.chai.bean.User">
select * from t_user where 1=1
<if test="username != null and username !=''">
and username like concat('%',#{username},'%')
</if>
<if test="address != null and address !=''">
and address like concat('%',#{address},'%')
</if>
<if test="phone != null and phone !=''">
and phone like concat('%',#{phone},'%')
</if>
</select>
if语句为但条件判断,但想做到前面的内容为空后面继续运行就要在where后面加一个1=1才能衔接后面的and语句。
这样做的缺点是效率不高
where语句
全查
<select id="selectName" parameterType="com.chai.bean.User" resultType="com.chai.bean.User">
select * from t_user
<where>
<if test="username != null and username !=''">
and username like concat('%',#{username},'%')
</if>
<if test="address != null and address !=''">
and address like concat('%',#{address},'%')
</if>
<if test="phone != null and phone !=''">
and phone like concat('%',#{phone},'%')
</if>
</where>
</select>
where标签比较智能,可以忽略第一个and语句
删除
<!--foreach标签可以对一个集合变量进行迭代
collection:集合变量 item:临时变量 open: 以什么符号开始 close:以什么符号结束 separator:遍历出来的数据之间的分隔符
#{id} 放入标签中,实现了迭代元素并拼接上了字符-->
<delete id="delete" parameterType="DelV0 delV0">
delete from student where id in
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
修改
<update id="upd" parameterType="com.chai.bean.Student">
update student
<set>
<if test="name!=null and name!=''">
name=#{name},
</if>
<if test="age!=null and age!=''">
age=#{age},
</if>
<if test="gender!=null and gender!=''">
gender=#{gender},
</if>
<if test="score!=null and score!=''">
score=#{score},
</if>
</set>
where id=#{id}
</update>