亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)詳解

 更新時(shí)間:2024年05月04日 09:19:16   作者:從零開(kāi)始的-CodeNinja之路  
這篇文章主要介紹了MyBatis中使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)的方法,動(dòng)態(tài)SQL是指在運(yùn)行PL/SQL塊時(shí)動(dòng)態(tài)輸入SQL語(yǔ)句,是Mybatis的強(qiáng)大特性之?,能夠完成不同條件下不同的sql拼接,需要的朋友可以參考下

前言

動(dòng)態(tài)SQL是Mybatis的強(qiáng)大特性之?,能夠完成不同條件下不同的sql拼接

在傳統(tǒng)的使用JDBC的方法中,相信大家在組合復(fù)雜的的SQL語(yǔ)句的時(shí)候,需要去拼接,稍不注意哪怕少了個(gè)空格,都會(huì)導(dǎo)致錯(cuò)誤,Mybatis的動(dòng)態(tài)SQL功能正是為了解決這種問(wèn)題,其通過(guò)if, trim, where, set, foreach、include標(biāo)簽,可組合成非常靈活的SQL語(yǔ)句,從而提高開(kāi)發(fā)人員的效率,下面就去感受Mybatis動(dòng)態(tài)SQL的魅力吧。

1. <if>標(biāo)簽

在注冊(cè)用戶的時(shí)候,可能會(huì)有這樣?個(gè)問(wèn)題,如下圖所示:

注冊(cè)分為兩種字段:必填字段和非必填字段,那如果在添加用戶的時(shí)候有不確定的字段傳入,程序應(yīng)該如何實(shí)現(xiàn)呢?

這個(gè)時(shí)候就需要使用動(dòng)態(tài)標(biāo)簽來(lái)判斷了,比如添加的時(shí)候性別gender為非必填字段,具體實(shí)現(xiàn)如下:

Integer insertUserByCondition(UserInfo userInfo);

Mapper.xml實(shí)現(xiàn):

<insert id="insertUserByCondition">
	INSERT INTO userinfo (
	username,
	`password`,
	age,
	<if test="gender != null">
		gender,
	</if>
	phone)
	VALUES (
	#{username},
	#{age},
	<if test="gender != null">
		#{gender},
	</if>
	#{phone})
</insert>

注意test中的gender,是傳入對(duì)象中的屬性,不是數(shù)據(jù)庫(kù)字段

Q:可不可以不進(jìn)行判斷,直接把字段設(shè)置為null呢?

A:不可以,這種情況下,如果gender字段有默認(rèn)值,就會(huì)設(shè)置為默認(rèn)值

2. <trim>標(biāo)簽

之前的插入用戶功能,只是有?個(gè)gender字段可能是選填項(xiàng),如果有多個(gè)字段,?般考慮使用標(biāo)簽結(jié)合標(biāo)簽,對(duì)多個(gè)字段都采取動(dòng)態(tài)生成的方式。

標(biāo)簽中有如下屬性:

  • prefix:表示整個(gè)語(yǔ)句塊,以prefix的值作為前綴
  • suffix:表示整個(gè)語(yǔ)句塊,以suffix的值作為后綴
  • prefixOverrides:表示整個(gè)語(yǔ)句塊要去除掉的前綴
  • suffixOverrides:表示整個(gè)語(yǔ)句塊要去除掉的后綴

調(diào)整Mapper.xml的插入語(yǔ)句為:

<insert id="insertUserByCondition">
	INSERT INTO userinfo
	<trim prefix="(" suffix=")" suffixOverrides=",">
		<if test="username !=null">
			username,
		</if>
		<if test="password !=null">
			`password`,
		</if>
		<if test="age != null">
			age,
		</if>
		<if test="gender != null">
			gender,
		</if>
		<if test="phone != null">
			phone,
		</if>
	</trim>
	VALUES
	<trim prefix="(" suffix=")" suffixOverrides=",">
		<if test="username !=null">
			#{username},
		</if>
		<if test="password !=null">
			#{password},
		</if>
		<if test="age != null">
			#{age},
		</if>
		<if test="gender != null">
			#{gender},
		</if>
		<if test="phone != null">
			#{phone}
		</if>
	</trim>
</insert>

3. <where>標(biāo)簽

看下?這個(gè)場(chǎng)景,系統(tǒng)會(huì)根據(jù)我們的篩選條件,動(dòng)態(tài)組裝where條件

需求:傳入的用戶對(duì)象,根據(jù)屬性做where條件查詢,用戶對(duì)象中屬性不為null的,都為查詢條件

原有SQL:

SELECT * FROM userinfo WHERE age = 18 AND gender = 1 AND delete_flag =0

Mapper.xml實(shí)現(xiàn)

<select id="queryByCondition" resultType="com.example.demo.model.UserInfo">
	select id, username, age, gender, phone, delete_flag, create_time,update_timefrom userinfo
	<where>
	<if test="age != null">
		and age = #{age}
	</if>
	<if test="gender != null">
		and gender = #{gender}
	</if>
	<if test="deleteFlag != null">
		and delete_flag = #{deleteFlag}
	</if>
	</where>
</select>

只會(huì)在子元素有內(nèi)容的情況下才插入where子句,?且會(huì)?動(dòng)去除子句的開(kāi)頭的AND或OR

以上標(biāo)簽也可以使用 替換,但是此種情況下,當(dāng)子元素都沒(méi)有內(nèi)容時(shí),where關(guān)鍵字也會(huì)保留

4. <set>標(biāo)簽

需求:根據(jù)傳入的用戶對(duì)象屬性來(lái)更新用戶數(shù)據(jù),可以使用標(biāo)簽來(lái)指定動(dòng)態(tài)內(nèi)容.

接口定義:根據(jù)傳入的用戶id屬性,修改其他不為null的屬性

Integer updateUserByCondition(UserInfo userInfo);

Mapper.xml

<update id="updateUserByCondition">
	update userinfo
	<set>
		<if test="username != null">
			username = #{username},
		</if>
		<if test="age != null">
			age = #{age},
		</if>
		<if test="deleteFlag != null">
			delete_flag = #{deleteFlag},
		</if>
	</set>
	where id = #{id}
</update>

<set> :動(dòng)態(tài)的在SQL語(yǔ)句中插入set關(guān)鍵字,并會(huì)刪掉額外的逗號(hào).(用于update語(yǔ)句中)

以上標(biāo)簽也可以使用 替換。

5. <foreach>標(biāo)簽

對(duì)集合進(jìn)行遍歷時(shí)可以使用該標(biāo)簽。標(biāo)簽有如下屬性:

  • collection:綁定方法參數(shù)中的集合,如List,Set,Map或數(shù)組對(duì)象
  • item:遍歷時(shí)的每?個(gè)對(duì)象
  • open:語(yǔ)句塊開(kāi)頭的字符串
  • close:語(yǔ)句塊結(jié)束的字符串
  • separator:每次遍歷之間間隔的字符串

需求:根據(jù)多個(gè)userid,刪除用戶數(shù)據(jù)

接口方法:

void deleteByIds(List<Integer> ids);

ArticleMapper.xml中新增刪除sql:

<delete id="deleteByIds">
	delete from userinfo
	where id in
	<foreach collection="ids" item="id" separator="," open="(" close=")">
		#{id}
	</foreach>
</delete>

6. <include>標(biāo)簽

問(wèn)題分析:

在xml映射文件中配置的SQL,有時(shí)可能會(huì)存在很多重復(fù)的片段,此時(shí)就會(huì)存在很多冗余的代碼

我們可以對(duì)重復(fù)的代碼片段進(jìn)行抽取,將其通過(guò) 標(biāo)簽封裝到?個(gè)SQL片段,然后再通過(guò)<include> 標(biāo)簽進(jìn)行引用。

:定義可重用的SQL片段 :通過(guò)屬性refid,指定包含的SQL片段

<sql id="allColumn">
id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>

通過(guò) 標(biāo)簽在原來(lái)抽取的地方進(jìn)行引用。操作如下:

<select id="queryAllUser" resultMap="BaseMap">
	select
	<include refid="allColumn"></include>
	from userinfo
</select>
<select id="queryById" resultType="com.example.demo.model.UserInfo">
	select
	<include refid="allColumn"></include>
	from userinfo where id= #{id}
</select>

以上就是MyBatis使用標(biāo)簽動(dòng)態(tài)操作數(shù)據(jù)庫(kù)詳解的詳細(xì)內(nèi)容,更多關(guān)于MyBatis動(dòng)態(tài)數(shù)據(jù)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot如何使用AOP做訪問(wèn)請(qǐng)求日志

    springboot如何使用AOP做訪問(wèn)請(qǐng)求日志

    這篇文章主要介紹了springboot如何使用AOP做訪問(wèn)請(qǐng)求日志,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot注入配置文件的3種方法詳解

    SpringBoot注入配置文件的3種方法詳解

    這篇文章主要介紹了SpringBoot注入配置文件的3種方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java仿windows記事本功能完整版

    java仿windows記事本功能完整版

    這篇文章主要為大家詳細(xì)介紹了java仿windows記事本功能完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Java構(gòu)造函數(shù)與普通函數(shù)用法詳解

    Java構(gòu)造函數(shù)與普通函數(shù)用法詳解

    本篇文章給大家詳細(xì)講述了Java構(gòu)造函數(shù)與普通函數(shù)用法以及相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • 使用Lombok時(shí)@JsonIgnore注解失效解決方案

    使用Lombok時(shí)@JsonIgnore注解失效解決方案

    這篇文章主要為大家介紹了使用Lombok時(shí)@JsonIgnore注解失效問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Spring?Boot數(shù)據(jù)響應(yīng)問(wèn)題實(shí)例詳解

    Spring?Boot數(shù)據(jù)響應(yīng)問(wèn)題實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Boot數(shù)據(jù)響應(yīng)問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 解決mybatis plus報(bào)錯(cuò)Invalid bound statement (not found):問(wèn)題

    解決mybatis plus報(bào)錯(cuò)Invalid bound statement 

    在使用MyBatis時(shí)遇到InvalidBoundStatement異常,常因多個(gè)MapperScan配置沖突或者包掃描路徑設(shè)置錯(cuò)誤,解決方法包括保留一個(gè)MapperScan聲明、檢查jar包沖突、確保命名空間和掃描路徑正確,使用@TableId注解指定主鍵
    2024-11-11
  • Java中對(duì)象序列化與反序列化詳解

    Java中對(duì)象序列化與反序列化詳解

    這篇文章主要介紹了Java中對(duì)象序列化與反序列化,較為詳細(xì)的分析了java中對(duì)象序列化的概念、原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Java如何實(shí)現(xiàn)數(shù)字逆序

    Java如何實(shí)現(xiàn)數(shù)字逆序

    這篇文章主要介紹了Java如何實(shí)現(xiàn)數(shù)字逆序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java實(shí)現(xiàn)鼠標(biāo)模擬與鍵盤映射

    Java實(shí)現(xiàn)鼠標(biāo)模擬與鍵盤映射

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)鼠標(biāo)模擬與鍵盤映射,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評(píng)論