最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis動態(tài)SQL特性詳解

 更新時間:2022年11月16日 10:18:36   作者:CN丶1  
動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關(guān)于Mybatis動態(tài)SQL特性的相關(guān)資料,文字通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

概述

動態(tài)SQL:SQL語句會隨著用戶輸入或外部條件的變化而變化 。

例如:我們在做多條件查詢的時候,編寫SQL語句的查詢操作,我們并不知道用戶實際操作時會選擇多少條件進(jìn)行查詢,假如有三個條件(日期,大小,名字)供用戶選擇后查詢,如果用戶只選擇了一個條件(大?。┻M(jìn)行查詢,那么我們應(yīng)該動態(tài)的進(jìn)行SQL語句的編寫。

再例如:當(dāng)做信息修改時,可修改信息有 用戶名,密碼,性別,愛好。用戶如果全部修改,這當(dāng)然沒什么好說的。但是如果用戶只修改某些信息,并沒有全部修改。如果我們還用修改全部的那一套SQL語句,那么沒有修改到的信息在SQL語句中對應(yīng)值就會為null。這明顯有問題,所以我們需要使用到動態(tài)SQL。

再再例如:我們做批量刪除,我們在編寫SQL語句時,并不知道用戶實際操作時選擇多少條數(shù)據(jù),所以我們使用SQL語句就可以解決這樣的問題。

動態(tài)多條件查詢

環(huán)境準(zhǔn)備:mybatis環(huán)境正常,完善數(shù)據(jù)表和pojo類。

我們在做動態(tài)多條件時,SQL語句中需要判斷用戶輸入了哪些條件,沒有輸入哪些條件,但是我們不能使用Java的判斷語法,MyBatis對動態(tài)SQL有很強大的支撐,給我們提供了一系列的標(biāo)簽供我們使用。

例如 <if> 、<choose>、<set>、<where>、<foreach>等,如何使用呢?看案例。

現(xiàn)有一張數(shù)據(jù)表,表中有三個字段:用戶名,密碼,賬戶余額。

案例需求:用戶通過用戶名,密碼這兩條件進(jìn)行模糊查詢,也可以只用單個條件進(jìn)行查詢,在此演示只通過用戶名中包含"A"為條件進(jìn)行查詢用戶信息。

數(shù)據(jù)層接口方法

List<User> selectByCondition(User user);

SQL映射文件-SQL語句

<select id="selectByCondition" resultType="User">
    select *
    from user_table
    <!--需要使用where標(biāo)簽,否則兩個條件為空時,會存在sql語法錯誤 -->
    <where>
        <if test="user != null and user != ''">
            user like #{user}
        </if>
        <if test="password != null and password != null">
            and password like #{password}
        </if>
    </where>
</select>

測試方法

    /**
     * 動態(tài)條件查詢:
     * 用戶輸入的可能不是全部參數(shù),而是部分參數(shù)
     * 動態(tài)SQL
     */
    @Test
    public void ConditionSelectTest() throws IOException {
        //模擬前端傳入?yún)?shù)
        String userName = "A";
        //String password = "4";
        //處理參數(shù)-配置為模糊查詢形式
        userName = "%"+ userName + "%";
        //password = "%"+ password + "%";
        //封裝成對象的形式傳入
        User user = new User();
        user.setUser(userName);
        //user.setPassword(password);
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = build.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //調(diào)用方法
        List<User> users = mapper.selectByCondition(user);
        users.forEach(System.out::println);
    }

原始數(shù)據(jù):

執(zhí)行方法:查詢user中存在"A"的記錄信息。

User{user= 'AA ', password= '123456', balance=5500}

User{user='AB', password='123456', balance=3000}

User{user='AD', password=' 132456', balance=2000}

Process finished with exit code 0

動態(tài)修改

案例需求:通過用戶名進(jìn)行修改密碼或賬戶余額??梢灾皇切薷囊粋€,也可以修改全部。

說明:

當(dāng)前案例,只是對于數(shù)據(jù)層的測試,不做業(yè)務(wù)層和表現(xiàn)層的功能實現(xiàn),所以我們都是通過模擬前端傳入數(shù)據(jù)來進(jìn)行測試。

數(shù)據(jù)層接口方法

//動態(tài)修改void alterRecordByName(User user);

SQL映射文件-SQL語句

<update id="alterRecordByName">
    update user_table
    <!--set標(biāo)簽 代表的就是set-->
    <set>
        <!--if標(biāo)簽 判斷用戶是否輸入,不輸入就不進(jìn)行修改-->
        <if test="password != null and password != ''">
            password = #{password},
        </if>
        <if test="balance != null ">
            balance = #{balance}
        </if>
    </set>
    where user = #{user};
</update>

if標(biāo)簽中的test屬性,用于填寫條件判斷。

測試方法

 /**
     * 修改部分-動態(tài)SQL
     */
    @Test
    public void testAlterCondition() throws IOException {
        //模擬前端傳入?yún)?shù)
        String userName = "BB";
        //密碼和賬戶余額修改任意,當(dāng)前只修改賬戶余額
        //String password = "123456";
        int balance = 5000;
        //封裝成對象的形式傳入,只將賬戶余額進(jìn)行對象封裝,密碼不變
        User user = new User();
        user.setUser(userName);
//        user.setPassword(password);
        user.setBalance(balance);
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
        //獲取SqlSession對象的時候,openSession空參時:autoCommit = false
        SqlSession sqlSession = build.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.alterRecordByName(user);
        System.out.println("修改成功...");
        //需要手動提交,或者設(shè)置:openSession(true)
        sqlSession.commit();
    }

原始數(shù)據(jù):

執(zhí)行方法后數(shù)據(jù):成功。

動態(tài)批量刪除

案例需求:根據(jù)傳進(jìn)來的賬戶余額鎖定用戶,都進(jìn)行刪除。

數(shù)據(jù)層接口方法

//參數(shù)為數(shù)組,可接收多個值
void deleteByBalances(@Param("balance") int[] balance);

SQL映射文件-SQL語句

<!--批量刪除-->
<delete id="deleteByBalances">
    delete from user_table
    where balance in
    <foreach collection="balance" separator="," item="balance" open="(" close=")" >
        #{balance}
    </foreach>;
</delete>

foreach標(biāo)簽屬性說明:

//collection:代表遍歷對象

//item:代表每一次獲取的對象

//separator:分隔符,數(shù)組中元素就是,為分隔符

//open,close:代表開始和結(jié)束位置需要填寫的括號()

測試方法

刪除賬戶余額為2000,3000的。

 /**
 * 批量刪除
 */
@Test
public void testDeletes() throws IOException {
    //模擬前端傳入?yún)?shù)
    int[] balances = new int[]{2000,3000};
    String resource = "mybatis-config.xml";
    InputStream is = Resources.getResourceAsStream(resource);
    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
    //獲取SqlSession對象的時候,openSession空參時:autoCommit = false(默認(rèn))
    SqlSession sqlSession = build.openSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    mapper.deleteByBalances(balances);
    System.out.println("刪除成功---->");
    //需要手動提交,或者設(shè)置:openSession(true)
    sqlSession.commit();
}

原始數(shù)據(jù):

執(zhí)行方法后數(shù)據(jù):

到此這篇關(guān)于MyBatis動態(tài)SQL特性詳解的文章就介紹到這了,更多相關(guān)MyBatis動態(tài)SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的前++和后++的區(qū)別示例代碼詳解

    java中的前++和后++的區(qū)別示例代碼詳解

    這篇文章主要介紹了java中的前++和后++的區(qū)別示例代碼詳解,其實大家只要記住一句話就可以了,前++是先自加再使用而后++是先使用再自加,本文通過代碼給大家詳細(xì)解說,感興趣的朋友跟隨小編一起看看吧
    2020-06-06
  • 微服務(wù)之Feign的介紹與使用小結(jié)

    微服務(wù)之Feign的介紹與使用小結(jié)

    Feign 是一個聲明式的偽RPC的REST客戶端,它用了基于接口的注解方式,很方便的客戶端配置,Spring Cloud 給 Feign 添加了支持Spring MVC注解,并整合Ribbon及Eureka進(jìn)行支持負(fù)載均衡,這篇文章主要介紹了微服務(wù)之Feign的介紹與使用,需要的朋友可以參考下
    2022-07-07
  • Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法

    Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法

    OpenOffice是一個開源的辦公套件,它包含了文檔處理、電子表格、演示文稿以及繪圖等多種功能,類似于Microsoft Office,本文將給大家介紹Java使用OpenOffice將office文件轉(zhuǎn)換為PDF的示例方法,需要的朋友可以參考下
    2024-09-09
  • 一篇文章大家徹底學(xué)會Java之格式化輸出

    一篇文章大家徹底學(xué)會Java之格式化輸出

    Java提供了多種格式化輸出的方式,包括String.format()、System.out.printf()和Formatter類,這些方法支持?jǐn)?shù)字、日期、字符串等多種格式化操作,這篇文章主要介紹了Java格式化輸出的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • 多線程(多窗口賣票實例講解)

    多線程(多窗口賣票實例講解)

    下面小編就為大家?guī)硪黄嗑€程(多窗口賣票實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Spring Security中successHandler和failureHandler使用方式

    Spring Security中successHandler和failureHandler使用方式

    這篇文章主要介紹了Spring Security中successHandler和failureHandler使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JAVA中compareTo方法的使用小結(jié)

    JAVA中compareTo方法的使用小結(jié)

    compareTo方法的目的是用來比較兩個對象的大小的,本文主要介紹了JAVA中compareTo方法的使用小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • spring bean.xml文件p標(biāo)簽使用報錯的解決

    spring bean.xml文件p標(biāo)簽使用報錯的解決

    這篇文章主要介紹了spring bean.xml文件p標(biāo)簽使用報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java定義泛型方法實例分析

    Java定義泛型方法實例分析

    這篇文章主要介紹了Java定義泛型方法,結(jié)合實例形式分析了java定義泛型的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • JAVA代理,靜態(tài),動態(tài)詳解

    JAVA代理,靜態(tài),動態(tài)詳解

    這篇文章主要介紹了Java靜態(tài)代理和動態(tài)代理總結(jié),非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評論

茂名市| 大名县| 高碑店市| 广丰县| 安平县| 华容县| 乐清市| 兴义市| 顺平县| 浦北县| 夏津县| 兴义市| 遂宁市| 广饶县| 玉田县| 得荣县| 孟州市| 镇坪县| 鹤庆县| 临朐县| 普定县| 凌海市| 梁河县| 循化| 论坛| 衡东县| 海原县| 竹溪县| 得荣县| 琼中| 苗栗市| 永城市| 上思县| 威信县| 临西县| 黄浦区| 泰州市| 抚顺市| 苏尼特左旗| 海盐县| 隆尧县|