国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題

這篇具有很好參考價(jià)值的文章主要介紹了借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot


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

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

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

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

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


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

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

? ? ? ? 下面假設(shè)要給 student 表插入一行數(shù)據(jù),學(xué)生的 sex 字段對(duì)應(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>

?測(cè)試方法:

@SpringBootTest
class StudentMapperTest {
    @Autowired
    private StudentMapper studentMapper;

    @Transactional
    @Test
    void addStu() {
        Student student = new Student();
        student.setUid(1);
        student.setName("張三");
        student.setScore(98);
        // 傳入的實(shí)體對(duì)象中不包含 sex
        int result = studentMapper.addStu(student);
        System.out.println("插入成功:" + result);
    }
}

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

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

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

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


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

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

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

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

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

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

下面演示:插入一條學(xué)生信息,但參數(shù)只傳學(xué)生名,就會(huì)導(dǎo)致字段后面多出一個(gè)逗號(hào),同時(shí)如果不穿參數(shù),又會(huì)多出一對(duì)括號(hào),借助 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>

單元測(cè)試:

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

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

?文章來源地址http://www.zghlxwxcb.cn/news/detail-606725.html


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

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

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

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

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

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

針對(duì)第二種情況:解決辦法很多種:

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

    借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

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

    借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

  3. 使用 <where> 標(biāo)簽,專門解決這種場(chǎng)景:
    ? ? <where> 里面有內(nèi)容,就會(huì)自動(dòng)生成 where,沒有就不生成。
    ??????????????? ?同時(shí):如果有多出來的 and ,它也會(huì)
    按照去前綴的方式去掉
    借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot
    ????????

?


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

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

? ? ? ? <set> 會(huì)自動(dòng)去掉多余的逗號(hào)

    <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ù)組對(duì)象
  2. item:遍歷時(shí)的每?個(gè)對(duì)象
  3. open:語句塊開頭的字符串
  4. close:語句塊結(jié)束的字符串
  5. separator:每次遍歷的對(duì)象之間間隔的字符串
    // 根據(jù) uid 批量刪除
    int deleteByUids(List<Integer> uidList);
    <delete id="deleteByUids">
        delete from student
        where uid in
        <foreach collection="uidList" item="uid" open="(" close=")" separator=",">
            #{uid}
        </foreach>
    </delete>

借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題,Java知識(shí)分享,mybatis,sql,數(shù)據(jù)庫,spring boot

?

到了這里,關(guān)于借助 Mybatis 的動(dòng)態(tài) SQL 解決傳參不確定問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【安全】mybatis中#{}和${}導(dǎo)致sql注入問題及解決辦法

    使用mybatis的時(shí)候遇到了#{}和${}可能導(dǎo)致sql注入的問題 #{} 底層通過prepareStatement對(duì)當(dāng)前傳入的sql進(jìn)行了預(yù)編譯,一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符 ?; #{} 解析之后會(huì)將String類型的數(shù)據(jù)自動(dòng)加上引號(hào),其他數(shù)據(jù)類型不會(huì) #{} 很大程度上可以防止sql注入(sql注入是發(fā)生在編譯的過程

    2024年01月19日
    瀏覽(21)
  • 【Java】mybatis中#{}和${}導(dǎo)致sql注入問題及解決辦法

    使用mybatis的時(shí)候遇到了#{}和${}可能導(dǎo)致sql注入的問題 #{} 底層通過prepareStatement對(duì)當(dāng)前傳入的sql進(jìn)行了預(yù)編譯,一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符 ?; #{} 解析之后會(huì)將String類型的數(shù)據(jù)自動(dòng)加上引號(hào),其他數(shù)據(jù)類型不會(huì) #{} 很大程度上可以防止sql注入(sql注入是發(fā)生在編譯的過程

    2024年01月17日
    瀏覽(18)
  • 【問題記錄】IDEA Mybatis *Mapper.xml 中 sql 無提示、無高亮、格式化失效問題 (已解決)

    【問題記錄】IDEA Mybatis *Mapper.xml 中 sql 無提示、無高亮、格式化失效問題 (已解決)

    【 問題 】 先說版本,win 11,idea 2023.1 如標(biāo)題,想去格式化mybatis中寫的sql,但是ctrl alt L 一頓處理,其中的sql沒有按照sql命令的格式去格式化,此外寫sql 無提示也無高亮 【 問題示例 】 未格式化前,顯然格式已經(jīng)差不多了,按理來說再格式化也就稍微調(diào)整 但格式化的結(jié)果是

    2024年02月04日
    瀏覽(45)
  • 解決mybatis,sql后端查詢成功但postman測(cè)試返回的data卻為null,空問題

    ?查詢成功,但是postman測(cè)試返回data為空 這時(shí)到后端查看mybatis查詢情況卻發(fā)現(xiàn)查詢成功返回?cái)?shù)據(jù)正常 排查問題發(fā)現(xiàn)實(shí)際上是實(shí)體類中沒有查詢返回結(jié)果中的?“SUM(pricesum)” getset方法 在sql查詢中修改:? ?重啟后端之后,此時(shí)同樣的get請(qǐng)求查詢sum返回已經(jīng)正確封裝在data中 ?到

    2024年02月09日
    瀏覽(56)
  • 【IDEA優(yōu)化】:解決MyBatis Mapper 的XML文件SQL語句無法自動(dòng)提示問題(獨(dú)家方案,親測(cè)可用)

    【IDEA優(yōu)化】:解決MyBatis Mapper 的XML文件SQL語句無法自動(dòng)提示問題(獨(dú)家方案,親測(cè)可用)

    IDEA中MyBatis編寫mapper的SQL語句的時(shí)候無法提示SQL和數(shù)據(jù)庫 無法正常方便的使用IDEA的提示功能,更準(zhǔn)確無誤的編寫代碼 親測(cè)可用,一勞永逸(IDEA版本 IntelliJ IDEA 2021.1.3?) 目的在于對(duì) Mybatis的Mapper.XML中sql語句進(jìn)行提示 網(wǎng)上的各種解決方案本質(zhì)上其實(shí)都是配置SQL方言和SQL解析范

    2024年02月16日
    瀏覽(131)
  • MyBatis 中的動(dòng)態(tài) SQL 是什么? 如何使用動(dòng)態(tài) SQL?

    在 MyBatis 中,動(dòng)態(tài) SQL 是指能夠根據(jù)條件動(dòng)態(tài)生成 SQL 語句的功能。通過使用動(dòng)態(tài) SQL,可以根據(jù)不同的條件生成不同的 SQL 語句,從而實(shí)現(xiàn)靈活的查詢和操作。 條件判斷:通過 , , , 標(biāo)簽實(shí)現(xiàn) SQL 語句中的條件邏輯,根據(jù)傳入?yún)?shù)的值來決定是否包含某一部分 SQL 語句。 循環(huán)遍

    2024年04月15日
    瀏覽(22)
  • 認(rèn)識(shí)MyBatis 之 MyBatis的動(dòng)態(tài)SQL

    本篇介紹MyBatis里如何使用動(dòng)態(tài)SQL,了解如何去簡(jiǎn)單使用動(dòng)態(tài)標(biāo)簽;如有錯(cuò)誤,請(qǐng)?jiān)谠u(píng)論區(qū)指正,讓我們一起交流,共同進(jìn)步! 本文開始 使用動(dòng)態(tài)SQL的好處:根據(jù)不同的條件拼接 SQL 語句,提高了SQL的靈活性; if標(biāo)簽:判斷時(shí)使用,滿足test中的判斷,執(zhí)行if條件 格式: if te

    2024年02月14日
    瀏覽(15)
  • 解決IntelliJ IDEA在Mybatis 編寫mapper.xml SQL語句時(shí)不自動(dòng)提示SQL語句和數(shù)據(jù)庫表的問題

    解決IntelliJ IDEA在Mybatis 編寫mapper.xml SQL語句時(shí)不自動(dòng)提示SQL語句和數(shù)據(jù)庫表的問題

    在Idea中鏈接數(shù)據(jù)庫后,發(fā)現(xiàn)在MySql 的console中有SQL語句提示和數(shù)據(jù)表的提示,但是在編寫mapper.xml中發(fā)現(xiàn)并沒有提示,很煩,覺得效率下降。 在百度搜索后,發(fā)現(xiàn)了解決方法,出現(xiàn)了SQL語句的提示. 解決辦法: 按下alt + enter,選擇Language injection settings 然后選擇SQL即可,但是這種

    2024年02月16日
    瀏覽(28)
  • MyBatis 實(shí)現(xiàn)動(dòng)態(tài) SQL

    MyBatis 實(shí)現(xiàn)動(dòng)態(tài) SQL

    ?MyBatis 中的動(dòng)態(tài) SQL 就是 SQL語句可以根據(jù)不同的情況情況來拼接不同的sql。 本文會(huì)介紹 xml 和 注解 兩種方式的動(dòng)態(tài)SQL實(shí)現(xiàn)方式。 先創(chuàng)建一個(gè)數(shù)據(jù)表,SQL代碼如下: 數(shù)據(jù)庫表和JAVA對(duì)象的對(duì)應(yīng)如下: ? 平時(shí)在注冊(cè)賬號(hào)時(shí)會(huì)有一些非必填項(xiàng),而我們就可以使用 if 標(biāo)簽來跟據(jù)條

    2024年02月19日
    瀏覽(25)
  • mybatis----動(dòng)態(tài)Sql

    mybatis----動(dòng)態(tài)Sql

    1.if標(biāo)簽 通過if標(biāo)簽構(gòu)建動(dòng)態(tài)條件,通過其test屬性的true或false來判斷該添加語句是否執(zhí)行。 mapper接口 映射文件 這里test中的屬性名與Account類中的屬性名一致。例如:上述文件的第一個(gè)if標(biāo)簽中的id嚴(yán)格與Account中屬性名id一致。 測(cè)試 結(jié)果: 執(zhí)行效果等同于select * from account whe

    2024年01月23日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包