什么是动态sql
mybatis 核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
为什么使用动态sql
利用动态 SQL可以很方便地根据不同条件拼接 SQL 语句。
怎么使用动态sql
我们使用不同的标签 具体操作在数据库中每个表对应模块的对应xml文件,与EL、JSTL有几分相似之处
具体操作如下:
- where标签:我们可以发现 有了where标签就不用在sql语句中写where了
<!-- 用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
select id,user_name userName,password,real_name realName,age from user_info
<!--where标签-->
<where>
user_name like #{userName}
</where>
<!--拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName}-->
</select>
- if标签:这个if标签常用于where中 来拼接where子句
如果细心点会发现,下面两个if标签中的待拼接语句都有and,不用担心,我们的where标签在sql语句拼接时,会自动地去掉第一个and(或or)
<!-- 还是用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
select id,user_name userName,password,real_name realName,age from user_info
<where>
<!--在where标签中写if标签,如果这里不等于null,则拼接上标签内语句-->
<if test="userName!=null">
and user_name like #{userName}
</if>
<!--同上-->
<if test="age!=null">
and age like #{age}
</if>
</where>
<!--如果两个参数都不为null,则拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName} and age like #{age}-->
</select>
- choose (when, otherwise):类似于Java中的switch语句
<!-- 还是用一个查询方法举例,在select标签中输入sql语句 -->
<select id="get" resultType="live.sunhao.vo.UserInfo">
select id,user_name userName,password,real_name realName,age from user_info
<where>
<!--where标签中的choose标签,条件判断类似与switch语句,如果userName!=null则将第一个when标签中的语句与主语句进行拼接,并且不再判断第二个when标签-->
<choose>
<when test="userName!=null">
and user_name like #{userName}
</when>
<when test="age!=null">
and age like #{age}
</when>
</choose>
</where>
<!--如果两个参数都不为null,则拼接效果:select id,user_name userName,password,real_name realName,age from user_info where user_name like #{userName}-->
</select>
- set标签:用于update语句中,set标签与where标签类似,有了set标签就不用在语句中写关键字set了
并且细心的你可以发现,每个if标签中的语句最后都有一个逗号,set标签在拼接其中语句时会去掉最后一个逗号
<update id="update">
update user_info
<set>
<if test="userName!=null">
user_name=#{userName},
</if>
<if test="realName!=null">
real_name=#{realName},
</if>
</set>
where id=#{id}
<!--如果两个参数都不为null,则拼接结果为:update user_info set user_name=#{userName},real_name=#{realName} where id=#{id}-->
</update>
- foreach标签:foreach元素用于对一个集合进行遍历,构建 IN 条件语句时常用该元素;foreach 元素允许指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量,也允许指定开头与结尾的字符串以及在迭代结果之间放置分隔符。
<!--我们用一个delete语句来演示一下foreach标签的功能,假设我们这里delete 方法传入的参数是要删除数据id的List集合-->
<delete id="delete">
delete from user_info where id in
<!--collection指定被遍历集合,item为遍历的结果项,open为拼接语句的开头,close为结尾,separator决定每项之间用什么间隔-->
<foreach item="id" collection="list" open="(" close=")" separator=",">
<!--我们假设这里的id遍历出来分别为1、2、3-->
#{id}
</foreach>
<!--则最后拼接成的sql语句为:delete from user_info where id in (1,2,3)-->
</delete>