【Maven+SSM】Mybatis区别于mysql的其他标签

一、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=[]]]





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值