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

Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫(xiě)詳細(xì)代碼示例

 更新時(shí)間:2023年05月20日 10:16:06   作者:全子兄  
這篇文章主要為大家詳細(xì)介紹了Mybatis中動(dòng)態(tài)SQL的編寫(xiě)使用,動(dòng)態(tài)SQL技術(shù)是一種根據(jù)特定條件動(dòng)態(tài)拼裝SQL語(yǔ)句的功能,它存在的意義是為了解決拼接SQL語(yǔ)句字符串時(shí)的痛點(diǎn)問(wèn)題,感興趣想要詳細(xì)了解可以參考下文

介紹 

注解作用
@SelectProvider動(dòng)態(tài)查詢(xún)SQL
@InsertProvider動(dòng)態(tài)新增SQL
@UpdateProvider動(dòng)態(tài)更新SQL
@DeleteProvider動(dòng)態(tài)刪除SQL

@Select 與 @SelectProvider 只是在定義注解的方式上有所不同, 一個(gè)是靜態(tài)SQL,一個(gè)是動(dòng)態(tài)SQL。

@SelectProvider 是 MyBatis 中的一個(gè)注解,用于指定一個(gè)類(lèi)或者類(lèi)的某個(gè)方法提供 SQL 查詢(xún)語(yǔ)句。該注解常用于動(dòng)態(tài) SQL 的場(chǎng)景,例如根據(jù)不同的參數(shù)生成不同的查詢(xún)語(yǔ)句。 使用 @SelectProvider 注解的方式可以讓 MyBatis 在運(yùn)行時(shí)根據(jù)注解指定的類(lèi)或方法來(lái)生成對(duì)應(yīng)的 SQL 查詢(xún)語(yǔ)句,從而實(shí)現(xiàn)動(dòng)態(tài) SQL 功能。注解的語(yǔ)法如下:

@SelectProvider(type = XxxProvider.class, method = "xxxMethod")

其中,type 屬性表示提供 SQL 查詢(xún)語(yǔ)句的類(lèi),method 屬性表示類(lèi)中提供查詢(xún)語(yǔ)句的方法。在查詢(xún)時(shí),MyBatis 會(huì)調(diào)用指定類(lèi)中的指定方法來(lái)生成 SQL 查詢(xún)語(yǔ)句,然后執(zhí)行該查詢(xún)語(yǔ)句并返回結(jié)果。 需要注意的是,提供 SQL 查詢(xún)語(yǔ)句的類(lèi)需要實(shí)現(xiàn) org.apache.ibatis.builder.annotation.ProviderMethodResolver 接口,該接口中定義了查找提供 SQL 查詢(xún)的方法的邏輯。同時(shí),提供查詢(xún)語(yǔ)句的方法需要返回一個(gè)字符串類(lèi)型的 SQL 查詢(xún)語(yǔ)句。 使用 @SelectProvider 注解可以讓 MyBatis 的查詢(xún)語(yǔ)句更加靈活,適用于各種復(fù)雜的查詢(xún)場(chǎng)景。

1、@SelectProvider使用

1.TestMapper.java

public interface TestMapper {
    /**
     * 根據(jù)性別獲取老師信息
     *
     * @param sex
     * @return
     */
    @SelectProvider(type = Test.class, method = "list")
    List<Teacher> list(Integer sex);
}
 

2.Test.java

public class Test {
    /**
     * 根據(jù)性別獲取老師信息
     *
     * @param sex
     * @return
     */
    public String list(Integer sex) {
        return new SQL() {
            {
                SELECT("*");
                FROM("teacher");
                if (null != sex) {
                    WHERE(" 1 = 1 sex = " + sex);
                } else {
                    WHERE(" 1 = 1 ");
                }
                ORDER_BY("create_time desc");
            }
        }.toString();
    }
}

2、模擬Mybatis Plus

可以使用 SelectProvider 寫(xiě)一個(gè)適用于所有表的查詢(xún)的方法。

1.BasicWrapper.java

import java.util.LinkedList;
import java.util.List;
public class BasicWrapper<T> {
    public String last;
    public Class<T> bean;
    public String table;
    public String[] field;
    public List<String> condition = new LinkedList<>();
    public String orderBy;
}

2.QueryWrapper.java

import java.util.Arrays;
import org.apache.ibatis.jdbc.SQL;
import cn.hutool.core.collection.CollectionUtil;
public class QueryWrapper<T> extends BasicWrapper {
    public QueryWrapper() {
    }
    public QueryWrapper(String table, String... field) {
        super.bean = null;
        super.table = table;
        super.field = (null == field || field.length == 0) ? new String[]{"*"} : field;
    }
    public String list(QueryWrapper wrapper) {
        Query query = wrapper.build();
        return new SQL() {
            {
                SELECT(query.getFields());
                FROM(query.getTable());
                WHERE(" 1 = 1 " + query.getCondition());
                ORDER_BY(query.getOrderBy());
            }
        }.toString();
    }
    public Query build() {
        Query query = new Query();
        query.setTable(super.table);
        query.setFields((null == super.field || super.field.length == 0) ? "*" : String.join(", ", Arrays.asList(super.field)));
        String condition = CollectionUtil.isEmpty(super.condition) ? " 1 = 1 " : String.join(" ", super.condition);
        String last = null == super.last ? "" : super.last;
        query.setCondition(condition + " " + last);
        return query;
    }
    public QueryWrapper orderBy(String sql) {
        super.orderBy = sql;
        return this;
    }
    public QueryWrapper orderBy(boolean condition, String sql) {
        if (condition) {
            super.orderBy = sql;
        }
        return this;
    }
    public QueryWrapper apply(String sql) {
        super.condition.add(" and (" + sql + ") ");
        return this;
    }
    public QueryWrapper apply(boolean condition, String sql) {
        if (condition) {
            super.condition.add(" and (" + sql + ") ");
        }
        return this;
    }
    public QueryWrapper eq(String filed, Object value) {
        super.condition.add(" and " + filed + " = " + value);
        return this;
    }
    public QueryWrapper eq(boolean condition, String filed, Object value) {
        if (condition) {
            if (value instanceof String) {
                super.condition.add(" and " + filed + " = '" + value + "'");
            } else {
                super.condition.add(" and " + filed + " = " + value);
            }
        }
        return this;
    }
    public QueryWrapper last(String value) {
        super.last = " " + value;
        return this;
    }
    public QueryWrapper last(boolean condition, String value) {
        if (condition) {
            super.last = " " + value;
        }
        return this;
    }
    public QueryWrapper like(String filed, Object value) {
        super.condition.add(" and " + filed + " like %" + value + "%");
        return this;
    }
    public QueryWrapper likeLeft(String filed, Object value) {
        super.condition.add(" and " + filed + " like %" + value + "%");
        return this;
    }
    public QueryWrapper likeRight(String filed, Object value) {
        super.condition.add(" and " + filed + " like %" + value + "%");
        return this;
    }
    public QueryWrapper like(boolean condition, String filed, Object value) {
        if (condition) {
            super.condition.add(" and " + filed + " like %" + value + "%");
        }
        return this;
    }
    public QueryWrapper likeLeft(boolean condition, String filed, Object value) {
        if (condition) {
            super.condition.add(" and " + filed + " like %" + value + "%");
        }
        return this;
    }
    public QueryWrapper likeRight(boolean condition, String filed, Object value) {
        if (condition) {
            super.condition.add(" and " + filed + " like %" + value + "%");
        }
        return this;
    }
}
 

3.Query.java

import lombok.Data;
@Data
public class Query {
    private String table;
    private String fields;
    private String orderBy;
    private String condition;
}
 

4.Test.java

 
import org.apache.ibatis.jdbc.SQL;
public class Test {
	public static void main(String agrs[]) {
		    QueryWrapper<Teacher> wrapper = new QueryWrapper<>("teacher");
            wrapper.eq("sex", 1);
            wrapper.eq(StringUtils.isNotBlank(name), "name", name);
            wrapper.orderBy("create_time desc");
            List<Teacher> list = processMapper.list(wrapper);
	}
}

到此這篇關(guān)于Mybatis實(shí)現(xiàn)動(dòng)態(tài)SQL編寫(xiě)詳細(xì)代碼示例的文章就介紹到這了,更多相關(guān)Mybatis動(dòng)態(tài)SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java中自定義注解的使用

    詳解Java中自定義注解的使用

    Annontation是Java5開(kāi)始引入的新特征,中文名稱(chēng)叫注解,它提供了一種安全的類(lèi)似注釋的機(jī)制,用來(lái)將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類(lèi)、方法、成員變量等)進(jìn)行關(guān)聯(lián)。本文主要介紹了自定義注解的使用,希望對(duì)大家有所幫助
    2023-03-03
  • Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng)

    Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng)

    這篇文章主要介紹了Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 一文了解SpringBoot是如何連接數(shù)據(jù)庫(kù)的

    一文了解SpringBoot是如何連接數(shù)據(jù)庫(kù)的

    Spring Boot提供了一系列的開(kāi)箱即用的功能和特性,使得開(kāi)發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Mybatis防止sql注入的實(shí)例

    Mybatis防止sql注入的實(shí)例

    本文通過(guò)實(shí)例給大家介紹了Mybatis防止sql注入的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • 完美解決Spring聲明式事務(wù)不回滾的問(wèn)題

    完美解決Spring聲明式事務(wù)不回滾的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決Spring聲明式事務(wù)不回滾的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 解決使用mybatis取值,字段賦值錯(cuò)誤的問(wèn)題

    解決使用mybatis取值,字段賦值錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了解決使用mybatis取值,字段賦值錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理

    Springboot?異步任務(wù)和定時(shí)任務(wù)的異步處理

    本文介紹了Springboot異步任務(wù)和定時(shí)任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時(shí)任務(wù)是經(jīng)常遇到的處理問(wèn)題方式,為了能夠用好這兩項(xiàng)配置,不干擾正常的業(yè)務(wù),需要對(duì)其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下
    2022-05-05
  • 搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn)

    搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn)

    Maven是一個(gè)流行的Java項(xiàng)目管理工具,它可以幫助我們管理項(xiàng)目的構(gòu)建、報(bào)告和文檔,本文主要介紹了搭建maven私有倉(cāng)庫(kù)的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-05-05
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列

    下面小編就為大家分享一篇java隊(duì)列實(shí)現(xiàn)方法(順序隊(duì)列,循環(huán)隊(duì)列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • springboot整合couchbase集群的步驟

    springboot整合couchbase集群的步驟

    couchbase是一款開(kāi)源的,分布式的nosql數(shù)據(jù)庫(kù),主要用于分布式緩存和數(shù)據(jù)存儲(chǔ)領(lǐng)域,本文給大家介紹springboot整合couchbase集群的步驟,感興趣的朋友一起看看吧
    2025-03-03

最新評(píng)論

宝兴县| 长岭县| 罗平县| 康马县| 辽中县| 洪江市| 大石桥市| 西乌珠穆沁旗| 鄂伦春自治旗| 龙岩市| 定边县| 屯门区| 大洼县| 江口县| 大新县| 师宗县| 贞丰县| 上杭县| 宁化县| 阳江市| 双柏县| 淄博市| 会昌县| 胶南市| 滕州市| 南木林县| 沙田区| 醴陵市| 井陉县| 华安县| 藁城市| 神农架林区| 丹江口市| 南宫市| 江北区| 祁东县| 鹤庆县| 图片| 泗阳县| 泰和县| 丽水市|