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

Mybatis-Plus:實現自定義SQL

這篇具有很好參考價值的文章主要介紹了Mybatis-Plus:實現自定義SQL。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1.簡介

2.自定義SQL具體實現

2.1.注解SQL

2.2.Wrapper傳參+注解SQL

2.3.Wrapper傳參+xml文件SQL

2.4.正常傳參+XML文件SQL

3.總結


1.簡介

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

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

Mybatis-Plus實現自定義的方式有以下幾種:

1)注解SQL

2)Wrapper傳參+注解SQL

????????局限性:不適用于多表關聯查詢,查詢字段過多代碼比較凌亂

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

4)對象傳參+XML文件SQL

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

2.自定義SQL具體實現

2.1.注解SQL

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

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

//多數據源情況下,@DS注解用于指定數據源
@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());
    }

補充:?

1)使用@Param注解

當以下面的方式進行寫SQL語句時:

    @Select("select column from table where userid = #{userid} ")
    public int selectColumn(int userid);

當你使用了使用@Param注解來聲明參數時,如果使用 #{} 或 ${} 的方式都可以。

    @Select("select column from table where userid = ${userid} ")
    public int selectColumn(@Param("userid") int userid);


當你不使用@Param注解來聲明參數時,必須使用使用 #{}方式。如果使用 ${} 的方式,會報錯。

    @Select("select column from table where userid = ${userid} ")
    public int selectColumn(@Param("userid") int userid);
 

2)不使用@Param注解

不使用@Param注解時,參數只能有一個,并且是Javabean。在SQL語句里可以引用JavaBean的屬性,而且只能引用JavaBean的屬性。

    // 這里id是user的屬性

    @Select("SELECT * from Table where id = ${id}")
    Enchashment selectUserById(User user);

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

注解SQL的優(yōu)點是代碼簡潔,可讀性好,同時也可以結合Wrapper等方式進行復雜的SQL構建。

2.2.Wrapper傳參+注解SQL

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

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

2)多表聯合查詢:在多表聯合查詢時,使用Wrapper可以方便地拼接SQL語句,實現多表聯合查詢。

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

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

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

使用SQL結合Wrapper進行復雜的SQL構建時,通常需要完成以下幾個步驟:

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

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

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

b)設置查詢條件

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

wrapper.eq("column1", value1)
       .ne("column2", value2)
       .like("column3", value3);

//示例
wrapper.eq("car_state", "1")
                .like("car_id", "渝A");

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

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

wrapper.orderByAsc("car_id")

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

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

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í)行結果:

mybatisplus自定義sql,Mybatis MyBatis-Plus,mybatis,sql,數據庫補充:

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

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實現了動態(tài)的查詢操作。如果傳入的name參數不為空,那么就會添加一個等于查詢條件;如果傳入的age參數不為空,那么就會添加一個大于查詢條件。

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

注意:

????????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查詢條件。?

當然,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)傳遞參數

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傳遞查詢參數

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

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

2.使用QueryWrapper

  • select | select(String... sqlSelect)

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

上面兩種方式任意選擇一種,參數都是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傳參結合的優(yōu)點在于提高了代碼的可維護性、可讀性和安全性,適用于代碼量大,需要多人協作開發(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時候,最基礎的方式?

3.總結

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

注解的優(yōu)點

????????簡潔易懂:相比于XML配置,注解的使用更加簡潔直觀,使代碼更具可讀性和可維護性。

????????易于調試:注解配置可以直接在Java類中編寫,減少了在XML中查找和修改SQL的時間。

????????更好的性能:在執(zhí)行大量的增刪改操作時,注解配置的性能更高,因為沒有XML解析的開銷。

注解的缺點

????????不利于維護:將SQL和Java代碼耦合在一起,使得代碼難以維護和重構,特別是在涉及到較復雜SQL的情況下。

????????SQL可讀性差:相比于在XML中編寫SQL,注解中的SQL語句通常會更加冗長和難以讀懂。

XML的優(yōu)點

????????易于維護:將SQL分離出Java代碼,代碼的維護性更高,特別是在需要修改SQL時。

????????SQL可讀性好:在XML中編寫SQL,可以使得SQL的格式更加清晰,可讀性更強。

????????易于管理:XML配置文件可以全局管理,使得項目的結構更加清晰明了。

XML的缺點

????????繁瑣:XML配置相對于注解,配置較為繁瑣,需要更多的代碼量。

????????性能問題:在執(zhí)行大量操作時,XML的解析和讀取會占用一定的時間,降低了系統(tǒng)的性能

總之,注解和XML的選擇應根據項目的實際情況和需求進行決定。對于簡單的查詢和操作,注解可能更加適合;而對于復雜的查詢和操作,XML則更加適合。

常用方法參考官方文檔文章來源地址http://www.zghlxwxcb.cn/news/detail-541123.html

到了這里,關于Mybatis-Plus:實現自定義SQL的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Mybatis-plus 配置自定義sql(.xml文件)查詢語句的步驟

    Mybatis-plus 配置自定義sql(.xml文件)查詢語句的步驟

    這是使用Mybatis-plus 的自動生成實體類代碼生成.xml文件, 所以他會在java目錄下,不在resources目錄下 如果在java目錄下的xml文件,需要分別配置application.yml和pom.xml文件 type-aliases-package:java目錄下邊的第一級包名 mapper-locations: classpath:映射器的地址: 類路徑:也就是.xml所在的包名

    2024年02月16日
    瀏覽(27)
  • Spring Boot入門(14):使用Mybatis-Plus執(zhí)行自定義SQL | 超級詳細,建議收藏

    ? ? ? ? 在上幾期,我們既講了如何整合Mybatis-Plus進行數據庫的增刪改查,也講解了如何使用MP的 Wrapper 構造器,但若是遇到復雜業(yè)務邏輯,如多表聯查、動態(tài)拼接條件等,這些操作往往會讓代碼變得冗長且難以維護。但是,有了Mybatis-Plus這個優(yōu)秀的框架,我們可以輕松實現

    2024年02月12日
    瀏覽(19)
  • mybatis-plus實現mysql自定義IKeyGenerator

    1. IKeyGenerator主鍵生成 2. 新建表模擬序列 3.代碼實現 MysqlKeyGenerator類 實體類上添加@KeySequence,這里value是主鍵值,不是序列名

    2024年02月13日
    瀏覽(11)
  • Mybatis-Plus的SQL注入器實現批量插入/修改,效率比較

    Mybatis-Plus的SQL注入器實現批量插入/修改,效率比較

    mysql支持一條sql語句插入多條數據。但是Mybatis-Plus中默認提供的saveBatch、updateBatchById方法并不能算是真正的批量語句,而是遍歷實體集合執(zhí)行INSERT_ONE、UPDATE_BY_ID語句。 mybatis-plus雖然做了分批請求、一次提交的處理。但如果jdbc不啟用配置rewriteBatchedStatements,那么批量提交的s

    2024年02月11日
    瀏覽(25)
  • Mybatis-Plus 打印sql日志

    先說一下springboot 和mybatis-plus版本 再給一份logback.xml文件配置 配置打印日志的兩種方式 控制臺打印,很簡單,在application.yml配置 日志文件打印,在application.yml配置 還需要再logback.xml中將mapper 包的logger日志級別設置為debug,看上方 有用的話,幫忙點贊,謝謝,如果因為版本問

    2024年02月15日
    瀏覽(26)
  • Mybatis-plus 分頁 自定義count方法

    使用了mybatisplus 語句中有order by 語法 mybatisplus會使用 select count(*) from (子語句) TOTAL 算出total 但是會報錯 查詢條件QueryWrapper中還有order by排序條件,則生成的select count(*) from(sql) 就會報錯 除非另外還指定了 TOP、OFFSET 或 FOR XML,否則,ORDER BY 子句在視圖、內聯函數、派生表、子查

    2024年04月23日
    瀏覽(16)
  • MyBatis-Plus自定義分頁模型

    MyBatis-Plus自帶的分頁模型Page有些參數,我覺得不是很必要,因此自定義自己的分頁模型。該類繼承了 IPage 類,實現了簡單分頁模型如果你要實現自己的分頁模型可以繼承 Page 類或者實現 IPage 類。因為Java是單繼承多實現的,所以我們使用實現IPage接口的方式實現我們自己的分

    2024年02月12日
    瀏覽(16)
  • 聊聊mybatis-plus的sql加載順序

    本文主要研究一下如果mybatis mapper定義了多個同名方法會不會有問題 com/baomidou/mybatisplus/core/MybatisConfiguration.java com/baomidou/mybatisplus/extension/spring/MybatisSqlSessionFactoryBean.java MybatisSqlSessionFactoryBean的buildSqlSessionFactory方法會根據mapperLocations的配置取加載xml配置,即加載xml的mapper信息

    2024年02月10日
    瀏覽(20)
  • 自定義Mybatis-plus插件(限制最大查詢數量)

    需求背景 ?一次查詢如果結果返回太多(1萬或更多),往往會導致系統(tǒng)性能下降,有時更會內存不足,影響系統(tǒng)穩(wěn)定性,故需要做限制。 解決思路 1.經分析最后決定,應限制一次查詢返回的最大結果數量不應該超出1萬,對于一次返回結果大于限制的時候應該拋出異常,而不

    2023年04月19日
    瀏覽(20)
  • Mybatis-Plus 自定義mapper批量新增修改函數

    version MybatisPlusConfig CustomizedSqlInjector InsertBatchMethod UpdateBatchMethod RootMapper 使用方式 mapper接口實現自定義的RootMapper,即可調用批量新增修改函數

    2024年02月12日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包