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

Mybatis-Plus實(shí)現(xiàn)自定義SQL具體方法

 更新時間:2023年08月07日 08:59:17   作者:月半花開  
Mybatis-Plus是Mybatis的一個增強(qiáng)工具,它可以優(yōu)化我們的開發(fā)效率,這篇文章主要介紹了Mybatis-Plus實(shí)現(xiàn)自定義SQL,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.簡介

Mybatis-Plus(以下簡稱MBP)的初衷是為了簡化開發(fā),而不建議開發(fā)者自己寫SQL語句的;但是有時客戶需求比較復(fù)雜,僅使用MBP提供的Service,Mapper與Wrapper進(jìn)行組合,難以實(shí)現(xiàn)可以需求; 這時我們就要用到自定義的SQL了。

Java 開發(fā)使用 mybatis-plus 來執(zhí)行 sql 操作,往往比 mybatis 能夠省時省力,因?yàn)?mybatis-plus 封裝了很多常用的接口。但對于一些更為復(fù)雜的查詢來說,mybatis-plus 也相形見絀,還得需要我們自定義 sql 語句。本文就來介紹一下在使用 mybatis-plus/mybatis 的情況下,如何自定義 sql 語句、動態(tài) sql 等。

Mybatis-Plus實(shí)現(xiàn)自定義的方式有以下幾種:

1)注解SQL

2)Wrapper傳參+注解SQL

局限性:不適用于多表關(guān)聯(lián)查詢,查詢字段過多代碼比較凌亂

3)Wrapper傳參+XML文件SQL:推薦

4)對象傳參+XML文件SQL

最傳統(tǒng)的寫法,流程過于繁瑣,簡單的單表查詢時,配置麻煩

2.自定義SQL具體實(shí)現(xiàn)

2.1.注解SQL

Mybatis-plus提供了注解SQL功能,可以通過注解方式實(shí)現(xiàn)SQL的編寫,注解SQL的前提是在Mybatis的配置文件中開啟注解功能。

我們可以在Mapper的繼承類中,使用完整的自定義SQL;

//多數(shù)據(jù)源情況下,@DS注解用于指定數(shù)據(jù)源
@DS("zw-mysqldb")
public interface CarMapper extends BaseMapper<Car> {
    @Select("select * from car where car_seq = #{carSeq}")
    Car queryCar(String carSeq);
}
   @RequestMapping("/ok")
    public void testCustomSQL2() {
        Car car = carMapper.queryCar("11");
        System.out.println(car.toString());
    }

補(bǔ)充: 

1)使用@Param注解
當(dāng)以下面的方式進(jìn)行寫SQL語句時:
    @Select("select column from table where userid = #{userid} ")
    public int selectColumn(int userid);
當(dāng)你使用了使用@Param注解來聲明參數(shù)時,如果使用 #{} 或 ${} 的方式都可以。
    @Select("select column from table where userid = ${userid} ")
    public int selectColumn(@Param("userid") int userid);
當(dāng)你不使用@Param注解來聲明參數(shù)時,必須使用使用 #{}方式。如果使用 ${} 的方式,會報(bào)錯。
    @Select("select column from table where userid = ${userid} ")
    public int selectColumn(@Param("userid") int userid);
2)不使用@Param注解
不使用@Param注解時,參數(shù)只能有一個,并且是Javabean。在SQL語句里可以引用JavaBean的屬性,而且只能引用JavaBean的屬性。
    // 這里id是user的屬性
    @Select("SELECT * from Table where id = ${id}")
    Enchashment selectUserById(User user);

上面的代碼中使用了注解SQL的方式,通過@Select注解指定了SQL語句。在方法中使用@Param注解指定參數(shù)名稱,可以方便的進(jìn)行參數(shù)傳遞,參數(shù)名稱與sql參數(shù)名稱一致可省略。

注解SQL的優(yōu)點(diǎn)是代碼簡潔,可讀性好,同時也可以結(jié)合Wrapper等方式進(jìn)行復(fù)雜的SQL構(gòu)建。

2.2.Wrapper傳參+注解SQL

使用Wrapper方式的一些使用場景:

1)動態(tài)查詢:使用Wrapper可以根據(jù)不同的查詢條件,動態(tài)地拼接SQL語句,實(shí)現(xiàn)精確查詢。

2)多表聯(lián)合查詢:在多表聯(lián)合查詢時,使用Wrapper可以方便地拼接SQL語句,實(shí)現(xiàn)多表聯(lián)合查詢。

3)分頁查詢:在分頁查詢時,使用Wrapper可以方便地拼接SQL語句,實(shí)現(xiàn)分頁功能。

4)條件查詢:使用Wrapper可以根據(jù)不同的條件,動態(tài)地拼接SQL語句,實(shí)現(xiàn)條件查詢。

5)排序查詢:使用Wrapper可以方便地拼接SQL語句,實(shí)現(xiàn)排序功能

使用SQL結(jié)合Wrapper進(jìn)行復(fù)雜的SQL構(gòu)建時,通常需要完成以下幾個步驟:

a)創(chuàng)建Wrapper對象

通過創(chuàng)建Wrapper對象,可以方便地進(jìn)行SQL構(gòu)建和條件設(shè)置。下面是創(chuàng)建Wrapper對象的示例代碼:

QueryWrapper<Entity> wrapper = new QueryWrapper<>(); 

b)設(shè)置查詢條件

可以使用Wrapper對象的方法設(shè)置查詢條件,例如eq、ne等方法可以設(shè)置等于、不等于等條件。下面是設(shè)置查詢條件的示例代碼:

wrapper.eq("column1", value1)
       .ne("column2", value2)
       .like("column3", value3);
//示例
wrapper.eq("car_state", "1")
                .like("car_id", "渝A");

c)設(shè)置排序條件(非必須)

可以使用Wrapper對象的orderBy方法設(shè)置排序條件,例如orderByAsc、orderByDesc等方法可以設(shè)置升序、降序等條件。下面是設(shè)置排序條件的示例代碼:

wrapper.orderByAsc("car_id")

d)設(shè)置分頁條件(非必須)

可以使用Wrapper對象的方法設(shè)置分頁條件,例如page方法可以設(shè)置頁碼和每頁大小等條件。下面是設(shè)置分頁條件的示例代碼:

Page<Car> resultPage = new Page<>(1, 10);
carMapper.selectByPrimaryKey(resultPage,wrapper)

e)mapper接口

@Select("select * from car ${ew.customSqlSegment}")
Page<Car> selectByPrimaryKey(Page<Car> page, @Param(Constants.WRAPPER) QueryWrapper<Car> queryWrapper);

f)執(zhí)行SQL操作

接口的方法執(zhí)行SQL操作,例如selectList、selectPage等方法可以執(zhí)行SQL查詢操作,也可以自定義查詢。下面是執(zhí)行SQL操作的示例完整代碼:

//分頁查詢方式1
QueryWrapper<Car> wrapper = new QueryWrapper<>();
Page<Car> resultPage = new Page<>(1, 10);
wrapper.eq("car_state", "1")
       .like("car_id", "渝A")
       .orderByAsc("car_id");//排序
carMapper.selectByPrimaryKey(resultPage,wrapper);
//分頁查詢方式2
IPage<Car> page = new Page<>(1, 10); // 分頁查詢
LambdaQueryWrapper<Car> qw = new LambdaQueryWrapper<Car>()
     .like(Car::getCarId, "渝A") // 車牌號 =
     .eq(Car::getCarState, 1); // 狀態(tài)
//selectPage是BaseMapper自帶方法
IPage<Car> userPage = carMapper.selectPage(page, qw);

注意:

1)QueryWrapper中使用自定義uservo類,不能使用LambdaQueryWrapper 

2)上邊涉及到 IPage 和 Page 都可以用用于分頁,這里就涉及到MybatisPlus的幾種方式問題

xml文件

g)執(zhí)行結(jié)果:

補(bǔ)充:

在實(shí)際應(yīng)用中,我們還可以使用LambdaQueryWrapper和QueryWrapper實(shí)現(xiàn)更多復(fù)雜的查詢操作,以滿足不同的業(yè)務(wù)需求。例如,我們可以使用LambdaQueryWrapper和QueryWrapper進(jìn)行動態(tài)查詢,通過判斷前端傳入的參數(shù),來組合SQL語句,實(shí)現(xiàn)靈活的查詢操作 

public List<UserEntity> getUserList(String name, Integer age) {
    LambdaQueryWrapper<UserEntity> qw = new LambdaQueryWrapper<UserEntity>()
            .eq(StringUtils.isNotEmpty(name), UserEntity::getName, name) // 姓名 = name
            .gt(age != null, UserEntity::getAge, age); // 年齡 > age
    return userMapper.selectList(qw);
}

以上代碼中,我們通過LambdaQueryWrapper實(shí)現(xiàn)了動態(tài)的查詢操作。如果傳入的name參數(shù)不為空,那么就會添加一個等于查詢條件;如果傳入的age參數(shù)不為空,那么就會添加一個大于查詢條件。

這樣的查詢操作,可以根據(jù)前端傳入的參數(shù),靈活地組合SQL語句,實(shí)現(xiàn)更多的業(yè)務(wù)需求。

注意:

        1)mapper方法里的@Param(Constants.WRAPPER) Wrapper query對象,Constants.WRAPPER的值就是ew。
        2)首先判斷ew.emptyOfWhere是否存在where條件,有的話再拼接上去,

        3)ew.customSqlSegment該值是WHERE + sql語句,還有個ew.sqlSegment是不包括WHERE字符串

        4)${ew.customSqlSegment}是一個查詢條件占位符,代表Wapper查詢條件。 

當(dāng)然,Mybatis-Plus提供了一些自定義SQL方法,例如selectObjs、selectByMap等,可以直接使用,例如:

List<Object> objs = userMapper.selectObjs(
    new QueryWrapper<User>().select("max(age)").eq("name", "張三")
);

2.3.Wrapper傳參+xml文件SQL

Wrapper傳參是Mybatis中的一種高級操作方式,可以在查詢時動態(tài)傳遞參數(shù)

1)mapper類

Car selectBySeq @Param(Constants.WRAPPER) QueryWrapper<Car> queryWrapper);

2)xml配置文件 

<select id="selectBySeq " resultMap="BaseResultMap">
        select * from `car` ${ew.customSqlSegment}
</select>

3)通過Wapper傳遞查詢參數(shù)

使用Wrapper動態(tài)傳遞參數(shù)

1.使用Wrapper基類,自定義Where后面的SQL語句;

2.使用QueryWrapper

  • select | select(String... sqlSelect)

    例select("id", "name", "age")

上面兩種方式任意選擇一種,參數(shù)都是Wrapper

    @RequestMapping("/ok")
    public void testCustomSQL2() {
        LambdaQueryWrapper<Car> query = new LambdaQueryWrapper<>();
        query.eq(Car::getCarId, "11");
        Car car= carMapper.queryCarSeq(query);
        System.out.println(car.toString());
    }
//或者
Wrapper wrapper = new QueryWrapper<Car>().eq("car_state", 1).like("cai_id", "渝");
List<Car> userList = carMapper.queryCarSeq(wrapper);

XML文件SQL和Wrapper傳參結(jié)合的優(yōu)點(diǎn)在于提高了代碼的可維護(hù)性、可讀性和安全性,適用于代碼量大,需要多人協(xié)作開發(fā)的場景,并且能夠防止SQL注入攻擊 

2.4.正常傳參+XML文件SQL

在resources目錄下創(chuàng)建一個mapper文件夾,然后創(chuàng)建一個與Mapper接口同名的xml文件,例如UserMapper.xml,定義自定義SQL語句

 //xml文件式,myabtis原生方式   
 Car selectByAnnotationXML(String seq);

在mapper下創(chuàng)建文件UserDao.xml 

 <select id="selectByAnnotationXML" parameterType="java.lang.String" resultMap="BaseResultMap">
        select *
        from car
        where car_seq = #{seq,jdbcType=VARCHAR}
    </select>

這種方式是在接觸mybatis時候,最基礎(chǔ)的方式 

3.總結(jié)

總的來說,sql的寫法有兩種,一種是直接使用注解寫在mapper方法上,一種是寫在xml文件中;傳參的方式也有兩種,一種是通過方法傳參直接在xml文件中組裝sql,一種是通過Wapper傳遞參數(shù)條件構(gòu)造器

注解的優(yōu)點(diǎn)

  • 簡潔易懂:相比于XML配置,注解的使用更加簡潔直觀,使代碼更具可讀性和可維護(hù)性。
  • 易于調(diào)試:注解配置可以直接在Java類中編寫,減少了在XML中查找和修改SQL的時間。
  • 更好的性能:在執(zhí)行大量的增刪改操作時,注解配置的性能更高,因?yàn)闆]有XML解析的開銷。

注解的缺點(diǎn)

  • 不利于維護(hù):將SQL和Java代碼耦合在一起,使得代碼難以維護(hù)和重構(gòu),特別是在涉及到較復(fù)雜SQL的情況下。
  • SQL可讀性差:相比于在XML中編寫SQL,注解中的SQL語句通常會更加冗長和難以讀懂。

XML的優(yōu)點(diǎn)

  • 易于維護(hù):將SQL分離出Java代碼,代碼的維護(hù)性更高,特別是在需要修改SQL時。
  • SQL可讀性好:在XML中編寫SQL,可以使得SQL的格式更加清晰,可讀性更強(qiáng)。
  • 易于管理:XML配置文件可以全局管理,使得項(xiàng)目的結(jié)構(gòu)更加清晰明了。

XML的缺點(diǎn)

  • 繁瑣:XML配置相對于注解,配置較為繁瑣,需要更多的代碼量。
  • 性能問題:在執(zhí)行大量操作時,XML的解析和讀取會占用一定的時間,降低了系統(tǒng)的性能。

總之,注解和XML的選擇應(yīng)根據(jù)項(xiàng)目的實(shí)際情況和需求進(jìn)行決定。對于簡單的查詢和操作,注解可能更加適合;而對于復(fù)雜的查詢和操作,XML則更加適合。

常用方法參考官方文檔

到此這篇關(guān)于Mybatis-Plus實(shí)現(xiàn)自定義SQL具體方法的文章就介紹到這了,更多相關(guān)Mybatis-Plus自定義SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案

    SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案

    這篇文章主要介紹了SpringBoot全局異常捕獲參數(shù)以及參數(shù)異常的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 基于 Cursor 開發(fā) Spring Boot 項(xiàng)目詳細(xì)攻略

    基于 Cursor 開發(fā) Spring Boot 項(xiàng)目詳細(xì)攻略

    Cursor是集成GPT4、Claude3.5等LLM的VSCode類AI編程工具,支持SpringBoot項(xiàng)目開發(fā)全流程,涵蓋環(huán)境配置、代碼生成、數(shù)據(jù)庫連接及部署,提供智能輔助、代碼優(yōu)化與錯誤修復(fù)功能,助力高效開發(fā),本文給大家介紹基于Cursor開發(fā)Spring Boot項(xiàng)目詳細(xì)攻略,感興趣的朋友一起看看吧
    2025-09-09
  • spring依賴注入成功但在調(diào)用接口的時候拿到的依賴卻是null問題

    spring依賴注入成功但在調(diào)用接口的時候拿到的依賴卻是null問題

    這篇文章主要介紹了spring依賴注入成功但在調(diào)用接口的時候拿到的依賴卻是null問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • intelliJ idea 2023 配置Tomcat 8圖文教程

    intelliJ idea 2023 配置Tomcat 8圖文教程

    這篇文章主要介紹了intelliJ idea 2023 配置Tomcat 8教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Java實(shí)現(xiàn)的兩種常見簡單查找算法示例【快速查找與二分查找】

    Java實(shí)現(xiàn)的兩種常見簡單查找算法示例【快速查找與二分查找】

    這篇文章主要介紹了Java實(shí)現(xiàn)的兩種常見簡單查找算法,結(jié)合具體實(shí)例形式分析了java快速查找與二分查找的原理與簡單實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • Java NIO和IO的區(qū)別

    Java NIO和IO的區(qū)別

    這篇文章主要介紹了Java NIO和IO的區(qū)別,需要的朋友可以參考下
    2014-06-06
  • 使用lombok@Data存在extends時需要注意的問題

    使用lombok@Data存在extends時需要注意的問題

    在Java編程中,正確實(shí)現(xiàn)equals方法是保證對象比較一致性的關(guān)鍵,使用instanceof檢查類型可能導(dǎo)致違反對稱性原則,即當(dāng)子類和父類都重寫equals時可能出現(xiàn)a.equals(b)不等于b.equals(a)的情況,Lombok的@EqualsAndHashCode注解可以通過callSuper=true參數(shù)
    2024-10-10
  • Java中動態(tài)規(guī)則的實(shí)現(xiàn)方式示例詳解

    Java中動態(tài)規(guī)則的實(shí)現(xiàn)方式示例詳解

    這篇文章主要介紹了Java中動態(tài)規(guī)則的實(shí)現(xiàn)方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java tostring方法重寫代碼示例

    java tostring方法重寫代碼示例

    這篇文章主要介紹了java tostring方法重寫代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • SpringBoot+Redis實(shí)現(xiàn)分布式鎖的深度剖析

    SpringBoot+Redis實(shí)現(xiàn)分布式鎖的深度剖析

    分布式鎖是在分布式系統(tǒng)中協(xié)調(diào)多個節(jié)點(diǎn)對共享資源進(jìn)行互斥訪問的機(jī)制,這篇文章主要為大家詳細(xì)介紹了如何使用SpringBoot和Redis實(shí)現(xiàn)分布式鎖,感興趣的小伙伴可以了解下
    2026-01-01

最新評論

咸丰县| 桐庐县| 偃师市| 思南县| 扎兰屯市| 鄯善县| 石家庄市| 宝清县| 贺兰县| 南陵县| 革吉县| 祥云县| 涿州市| 股票| 南岸区| 平阳县| 邳州市| 黄浦区| 南木林县| 乌兰浩特市| 皋兰县| 梁平县| 铅山县| 巴中市| 堆龙德庆县| 石泉县| 綦江县| 昌黎县| 湖南省| 江源县| 遂宁市| 芜湖市| 名山县| 景泰县| 南平市| 建德市| 博爱县| 双峰县| 吉木乃县| 梅州市| 商河县|