一、where标签
where标签sql中的where有什么不同?看一个例子。
<select id="selectByUser" parameterType="model.UserInfo"
resultMap="userMap">
select
id,username,password
from userinfo
where 1 = 1
<if test="id!=0 and !"".equals(username.trim())">and username=#{username}</if>
<if test="id!=0 and !"".equals(username.trim())">and id=#{id}</if>
</select>
上面查询条件是直接拼接在where 1=1之后的,然而,如果我们这里不写1=1这样的语句。那么就会是如下代码。
<select id="selectByUser" parameterType="model.UserInfo"
resultMap="userMap">
select
id,username,password
from userinfo
where
<if test="id!=0 and !"".equals(username.trim())">username=#{username}</if>
<if test="id!=0 and !"".equals(username.trim())">and id=#{id}</if>
</select>
那么就存在一个第一个没有and,第二个需要添加and的问题。如果条件一不满足,那么条件二就变成了条件一,就应该去掉前面的and。因此where标签就是用来解决这种问题的。where标签的作用就是去掉最开始的and。
<select id="selectByUser" parameterType="model.UserInfo"
resultMap="userMap">
select
id,username,password
from userinfo
<where>
<if test="id!=0 and !"".equals(username.trim())">and username=#{username}</if>
<if test="id!=0 and !"".equals(username.trim())">and id=#{id}</if>
</where>
</select>
二、set标签
set标签的场景也就是在update语句中使用。例如简单写下如下场景。
<update id="updateBookListById" parameterType="java.lang.Integer">
update booklist set bookname = "葵花宝典" ,bookwriter = "x太监" where idbook = #{_parameter}
</update>
发现这里面有set标签,按道理这两个应该也从外界传进来。那么,我们从外界传进来怎么写?首先,毋庸置疑,传递进来是一个对象。包含idbook,bookname,bookwriter,那么我就传递我之前写的这个BookBean对象。
<update id="updateBookListById" parameterType="model.BookBean">
update booklist set bookname = #{bookname} ,bookwriter = #{bookwriter} where idbook = #{idbook}
</update>
那么此处就成了这样子。和where的场景,同样的问题就发生了。当我仅仅只有其中一个有值也要更新的时候如何写?后面有第二个条件则需要加逗号,如果本身就是最后一个,则不需要最后的逗号链接符号。例如我只改书名,不改作者。那么上面的代码就不合适了。就应该改成下面这样的。
<update id="updateBookListById" parameterType="model.BookBean">
update booklist
<set>
<if test="bookname!=null and !"".equals(bookname.trim())">
bookname = #{bookname},
</if>
<if test="bookwriter!=null and !"".equals(bookwriter.trim())">
bookwriter = #{bookwriter},
</if>
</set>
where idbook = #{idbook}
</update>
三、sql标签
sql标签其实是mybatis独有的,和sql中没有可比性。可以认为是常量定义。
例如,我每次查询出来的结果都需要把每个字段,这些写出来。
<select id="selectBooklistById" parameterType="java.lang.Integer">
select idbook,bookname,bookwriter from booklist where idbook = #{_parameter}
</select>
然而下次查询的时候我们需要通过bookname查询我又需要重新写一遍。这还不是最重要的,如果有一天,表结构发生了改变。那么这个修改就很可怕了。每一条都需要去修改。
因此我新增一个常量sql定义如下:
<select id="selectBooklistById" parameterType="java.lang.Integer" resultMap="bookbean">
select <include refid="booklistcolums"></include> from booklist where idbook = #{_parameter}
</select>
<sql id="booklistcolums">idbook,bookname,bookwriter</sql>
四、trim标签
trim标签可以说,涵盖了where,set标签的功能。但同时,能做的更多。
替换where标签:prefixOverrides替换and之前。
<select id="selectBookBean" parameterType="model.BookBean"
resultMap="bookbean">
select a.idbook,a.bookname,a.bookwriter,b.idbookdetail,b.bookcontent,b.idreal
from booklist a left join bookdetail b on a.idbook = b.idbookdetail
<trim prefix="where" prefixOverrides="and">
<if test="bookname!=null and !"".equals(bookname.trim())">
and a.bookname = #{bookname}
</if>
<if test="idbook!=0">
and a.idbook =#{idbook}
</if>
</trim>
order by a.idbook
</select>
替换set标签:suffixOverrides替换逗号之后。
<update id="updateBookListById" parameterType="model.BookBean">
update booklist
<trim prefix="set" suffixOverrides=",">
<if test="bookname!=null and !"".equals(bookname.trim())">
bookname = #{bookname},
</if>
<if test="bookwriter!=null and !"".equals(bookwriter.trim())">
bookwriter = #{bookwriter},
</if>
</trim>
where idbook = #{idbook}
</update>
除了替换标签还可以追加suffix=""。追加的具体略。
五、类似if else语句的mybatis语句。
先看看数据库表中有什么:
写一个mybatis的ifelse查询语句。
<select id="selectBookBean" parameterType="model.BookBean"
resultMap="bookbean">
select a.idbook,a.bookname,a.bookwriter
from booklist a
<where>
<choose>
<when test="bookname!=null and !"".equals(bookname.trim())">
a.bookname = #{bookname}
</when>
<when test="idbook!=0">
a.idbook =#{idbook}
</when>
<otherwise>
a.idbook =1
</otherwise>
</choose>
</where>
order by a.idbook
</select>
意思是如果入参书名bookname不为空,则执行bookname。如果入参bookname为空则尝试idbook,以此类推,等等。
查询条件为:
book.setBookname("鹿鼎记");book.setIdbook(2);查到了第一条数据鹿鼎记。
[BookBean [idbook=1, bookname=鹿鼎记, bookwriter=金庸, bookdetails=[]]]
查询条件为:
book.setIdbook(2);
[BookBean [idbook=2, bookname=天龙八部, bookwriter=金庸, bookdetails=[]]]
查询条件为空的时候。会执行默认ohterwise的。
[BookBean [idbook=1, bookname=鹿鼎记, bookwriter=金庸, bookdetails=[]]]