国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

湖南做網(wǎng)站 真好磐石網(wǎng)絡(luò)東莞公司網(wǎng)上推廣

湖南做網(wǎng)站 真好磐石網(wǎng)絡(luò),東莞公司網(wǎng)上推廣,網(wǎng)站規(guī)劃網(wǎng)站建設(shè)報(bào)價(jià)表,win7dw做asp購物網(wǎng)站在上一篇的:Mybatis 操作數(shù)據(jù)庫的基本 CRUD 以及查詢操作詳析_糊糊涂涂的博客-CSDN博客中介紹了Mybatis使用固定SQL語句操作數(shù)據(jù),本篇介紹 Mybatis 一個(gè)強(qiáng)大的特性:動態(tài)SQL。 動態(tài) SQL 解決什么問題? 那當(dāng)我們要執(zhí)行的業(yè)務(wù)邏輯有…


在上一篇的:Mybatis 操作數(shù)據(jù)庫的基本 CRUD 以及查詢操作詳析_@糊糊涂涂的博客-CSDN博客中介紹了Mybatis使用固定SQL語句操作數(shù)據(jù),本篇介紹 Mybatis 一個(gè)強(qiáng)大的特性:動態(tài)SQL。

動態(tài) SQL 解決什么問題?

????????那當(dāng)我們要執(zhí)行的業(yè)務(wù)邏輯有很多,比如給成績表中插入一行數(shù)據(jù),對應(yīng)學(xué)生的 “性別” 字段是非必須參數(shù)時(shí),使用動態(tài)SQL就不用寫兩種插入語句(傳與不傳性別);

? ? ? ? 另外,當(dāng)執(zhí)行查詢邏輯時(shí),條件中的參數(shù)個(gè)數(shù)也是不確定的。

? ? ? ? 以上類似傳入?yún)?shù)不確定的情況,都可以使用動態(tài)SQL來解決。


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

?????????<if>標(biāo)簽可以用來判斷參數(shù)是否符合預(yù)期值,從而決定 SQL 語句的拼接;

? ? ? ? 下面假設(shè)要給 student 表插入一行數(shù)據(jù),學(xué)生的 sex 字段對應(yīng)的實(shí)體類中 sex 屬性值為null,借助<if>標(biāo)簽判斷是否要在插入時(shí)插入 sex :

Maper 接口:?

@Mapper
public interface StudentMapper {// 新增學(xué)生信息int addStu(Student student);
}

?插入語句:

<mapper namespace="com.example.demo.mapper.StudentMapper"><insert id="addStu">insert into student (uid, name<if test="sex != null and sex != '' ">,sex</if>,score) values (#{uid}, #{name}<if test="sex != null and sex != '' ">,#{sex}</if>,#{score})</insert>
</mapper>

?測試方法:

@SpringBootTest
class StudentMapperTest {@Autowiredprivate StudentMapper studentMapper;@Transactional@Testvoid addStu() {Student student = new Student();student.setUid(1);student.setName("張三");student.setScore(98);// 傳入的實(shí)體對象中不包含 sexint result = studentMapper.addStu(student);System.out.println("插入成功:" + result);}
}

!!!使用時(shí)要注意區(qū)分屬性和字段:

test 里要判斷的是“屬性” —— 來自實(shí)體類對象;

其他的是字段 —— 和數(shù)據(jù)庫對應(yīng);


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

? ? ? ? <trim>標(biāo)簽還會結(jié)合<if>標(biāo)簽一起使用,它有字面意思“修剪”的含義。

? ? ? ? 當(dāng)SQL語句中有很多個(gè)非必傳參數(shù)時(shí),一旦只傳其中個(gè)別參數(shù),就會導(dǎo)致殘留逗號或括號等情況,導(dǎo)致SQL語句出現(xiàn)錯(cuò)誤;<trim> 標(biāo)簽就會根據(jù)實(shí)際情況,去掉殘留不必要的內(nèi)容。

<trim>標(biāo)簽的四個(gè)參數(shù):

????????可根據(jù)場景添加

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

下面演示:插入一條學(xué)生信息,但參數(shù)只傳學(xué)生名,就會導(dǎo)致字段后面多出一個(gè)逗號,同時(shí)如果不穿參數(shù),又會多出一對括號,借助 trim 來修改:

Mapper 接口:?

@Mapper
public interface StudentMapper {// 只插入學(xué)生姓名int addStuOnlyName(Student student);
}

SQL 語句:

    <insert id="addStuOnlyName">insert into student<trim prefix="(" suffix=")" suffixOverrides=","><if test="uid != null and uid != '' ">uid,</if><if test="name != null and name != '' ">name,</if><if test="sex != null and sex != '' ">sex,</if><if test="score != null and score != '' ">score</if></trim>values<trim prefix="(" suffix=")" suffixOverrides=","><if test="uid != null and uid != '' ">#{uid},</if><if test="name != null and name != '' ">#{name},</if><if test="sex != null and sex != '' ">#{sex},</if><if test="score != null and score != '' ">#{score}</if></trim></insert>

單元測試:

@Testvoid addStuOnlyName() {Student student = new Student();student.setName("李四");int result = studentMapper.addStuOnlyName(student);System.out.println("插入成功:" + result);}

?


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

? ? ? ? 直接借助示例演示:根據(jù)學(xué)生 uid 或 學(xué)生名 來查詢一條學(xué)生信息,這里的兩個(gè)查詢條件都是非必傳的。

? ? ? ? ① 如果查詢時(shí)只給了其中一個(gè)條件,那么 where 后面連接時(shí)的 "and" 就會被多出來;

? ? ? ? ② 如果兩個(gè)條件都不穿,那么 "where" 就會被多出來;

針對第一種情況:可以使用<trim> 標(biāo)簽去后綴的方式去掉 and,and 放在參數(shù)的后面;

針對第二種情況:解決辦法很多種:

  1. where 后添加 1=1,and 放在每個(gè)條件參數(shù)前面,使用<trim>去前綴去掉and;
    ? ? ? ? (但這種寫法很冗余,不是好辦法)

  2. where 作為<trim>標(biāo)簽的前綴,只有<trim>里有代碼,才會自動加上前綴 where,再按照去后綴的方式去掉 and;

  3. 使用 <where> 標(biāo)簽,專門解決這種場景:
    ? ? <where> 里面有內(nèi)容,就會自動生成 where,沒有就不生成。
    ??????????????? ?同時(shí):如果有多出來的 and ,它也會
    按照去前綴的方式去掉

    ????????

?


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

? ? ? ? <set> 標(biāo)簽用于修改場景,<set>標(biāo)簽也是包著所有參數(shù),如果沒有內(nèi)容,就不加 set,但沒有set語句對于 mysql 是錯(cuò)誤的,所以至少要傳一個(gè)參數(shù)

? ? ? ? <set> 會自動去掉多余的逗號

    <update id="updateStu">update student<set><if test="uid != null and uid > 0">uid = #{uid},</if><if test="name != null and name != '' ">name = #{name},</if><if test="sex != null and sex != '' ">sex = #{sex},</if><if test="score != null and score > 0">score = #{score}</if></set>where uid = #{uid}</update>

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

? ? ? ? <foreach> 標(biāo)簽用于遍歷傳入的集合,它有五個(gè)可選項(xiàng):

  1. collection:綁定方法參數(shù)中的集合,如 List,Set,Map或數(shù)組對象
  2. item:遍歷時(shí)的每?個(gè)對象
  3. open:語句塊開頭的字符串
  4. close:語句塊結(jié)束的字符串
  5. separator:每次遍歷的對象之間間隔的字符串
    // 根據(jù) uid 批量刪除int deleteByUids(List<Integer> uidList);
    <delete id="deleteByUids">delete from studentwhere uid in<foreach collection="uidList" item="uid" open="(" close=")" separator=",">#{uid}</foreach></delete>

?

http://aloenet.com.cn/news/31493.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)銷售發(fā)展前景百度指數(shù)關(guān)鍵詞搜索趨勢
  • 英文seo公司seo文章
  • 網(wǎng)站域名使用期怎么去推廣自己的店鋪
  • 做ar的網(wǎng)站搜資源的搜索引擎
  • 婦聯(lián)網(wǎng)站建設(shè)方案搜索歷史記錄
  • 熟人做網(wǎng)站怎么收錢湖南seo服務(wù)電話
  • 東昌網(wǎng)站建設(shè)網(wǎng)站建設(shè)策劃書案例
  • 做網(wǎng)站用的云控制臺活動推廣軟文范例
  • 重慶有什么好玩的旅游景點(diǎn)寧波seo外包優(yōu)化
  • 濟(jì)南制作網(wǎng)站的公司哪家好汕頭網(wǎng)站建設(shè)優(yōu)化
  • 網(wǎng)站被墻301怎么做付費(fèi)推廣平臺有哪些
  • 科威網(wǎng)絡(luò)做網(wǎng)站怎么樣html網(wǎng)頁制作app
  • 網(wǎng)站建設(shè)合同是否繳納印花稅中國網(wǎng)站排名查詢
  • 金寨縣建設(shè)規(guī)劃局網(wǎng)站信息流廣告有哪些投放平臺
  • 做夾具需要知道的幾個(gè)網(wǎng)站企業(yè)網(wǎng)站seo方案
  • 中億豐建設(shè)集團(tuán)股份有限公司網(wǎng)站百度競價(jià)是什么工作
  • 學(xué)做餅干網(wǎng)站發(fā)稿網(wǎng)
  • 行業(yè)門戶網(wǎng)站模板中國剛剛發(fā)生8件大事
  • 如何開發(fā)app小程序win優(yōu)化大師
  • 北京市文化局政務(wù)網(wǎng)站建設(shè)項(xiàng)目獨(dú)立站seo怎么做
  • 深圳網(wǎng)站制作鄭州怎么優(yōu)化網(wǎng)站排名靠前
  • 南通seo公司網(wǎng)站免費(fèi)推廣產(chǎn)品平臺有哪些
  • 上海奉賢 網(wǎng)站建設(shè)百度指數(shù)查詢移動版
  • 廉江網(wǎng)站建設(shè)公眾號推廣合作平臺
  • html網(wǎng)頁設(shè)計(jì)基礎(chǔ)seo優(yōu)化主要做什么
  • 網(wǎng)站開發(fā)者模式企業(yè)官網(wǎng)建站
  • 學(xué)網(wǎng)站建設(shè)需要什么軟件百度外包公司有哪些
  • 企業(yè)網(wǎng)站建設(shè)參考資料競價(jià)推廣賬戶競價(jià)托管
  • 珠海服務(wù)好的網(wǎng)站建設(shè)武漢seo
  • 江陰做網(wǎng)站百度秒收錄軟件工具