MyBatis的动态SQL
别问为什么要用动态sql,如果没用就不会有人开发
mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
下面我介绍一下几种sql标签
先建立一个比较的类QueryBean
public class QueryBean {
private String keyWord;//关键字,(执行按照学生名字模糊查询)
private Integer beginAge; //开始年龄
private Integer endAge;
}
get和set方法我就不写了,不然太长了,看的厌烦。
< if>标签
使用if标签时,必须要在查询语句后加上 where 1=1 ,这样避免了链接sql语句时出现语句错误
<!-- 使用动态SQL if
id:接口方法
parameterType:传入参数
resultType:结果类型
-->
<select id="findByQueryBean" parameterType="QueryBean" resultType="student">
select * from tb_stu where 1=1
<!--test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名-->
<if test="keyWord!=null">
and name like #{keyWord} //对名字模糊查询
</if>
<if test="beginAge!=null">
and age > #{beginAge}<!-->表示大于>号--> //查询条件大于该数的年龄
</if>
<if test="endAge!=null">
and age <= #{endAge}<!-->表示小于<号 >=表示小于等于--> //查询条件小于该数的年龄
</if>
</select>
< where>标签
使用动态SQL where代表 查询后面的where 1=1
<select id="findByQueryBean" parameterType="QueryBean" resultType="student">
select * from tb_stu
test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名
<where>
<if test="keyWord!=null">
and name like #{keyWord}
</if>
<if test="beginAge!=null">
and age > #{beginAge}<!-->表示大于>号-->
</if>
<if test="endAge!=null">
and age <= #{endAge}<!-->表示小于<号 >=表示小于等于-->
</if>
</where>
</select>
< trim>标签前缀和前缀覆盖
<!--使用动态SQL trim的使用,它可以代替where (trim的前缀覆盖)
prefix:前缀
prefixOverrides:前缀覆盖
-->
<select id="findByQueryBean" parameterType="QueryBean" resultType="student">
select * from tb_stu
<!--test中的变量名 和 #{}中的变量名 都属于当前参数类型中的属性名-->
<trim prefix="where" prefixOverrides="and|or">//前缀:where ,覆盖后面and name like #{keyWord}的and
<if test="keyWord!=null">
and name like #{keyWord}
</if>
<if test="beginAge!=null">
and age > #{beginAge}<!-->表示大于>号-->
</if>
<if test="endAge!=null">
and age <= #{endAge}<!-->表示小于<号 >=表示小于等于-->
</if>
</trim>
</select>
< set>标签
set:大多用于更新语句,相当于sql语句中的set
<!--更新学生-->
<update id="update" parameterType="Student">
update tb_stu
<set>
<if test="name!=null">
name = #{name},
</if>
<if test="age!=null">
age = #{age},
</if>
</set>
where id = #{id};
</update>
< trim>标签后缀和后缀覆盖
<!--更新学生 trim的后缀覆盖,因为逗号位于后面,需要被位于前面的set替换-->
<update id="update" parameterType="Student">
update tb_stu
<trim suffixOverrides="," prefix="set">//suffixOverrides:在name = #{name}后缀覆盖逗号,
<if test="name!=null">
name = #{name},
</if>
<if test="age!=null">
age = #{age},
</if>
</trim>
where id = #{id};
</update>
< foreach>标签
<!--foreach的使用-->
<select id="findById" parameterType="int" resultType="student">
select * from tb_stu where id in
<!--select * from tb_stu where id in (1,2,3)-->//原本写法:查询id等于1,2,3,的数据
<foreach collection="list" open="(" close=")" separator="," item="abc">//item:代表便利取出的每一个对象,变量名随意
#{abc}
</foreach>
</select>
SQL片段
在上面实例中都有select * from tb_stu这段代码为了代替这段代码,引出了这个标签
<sql id="sql1">
select * from tb_stu
</sql>
只需要引用这段代码就可以了。
<include refid="sql1"></include>
使用方法:以foreach为实例。
<select id="findById" parameterType="int" resultType="student">
<include refid="sql1"></include>
where id in
<!--select * from tb_stu where id in (1,2,3)-->
<foreach collection="list" open="(" close=")" separator="," item="abc">
#{abc}
</foreach>
</select>