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

springboot引入druid解析sql的過程

 更新時(shí)間:2023年08月22日 15:15:46   作者:夜空下的星  
在開發(fā)中,有時(shí)我們可能會需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類型SQL會存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類型的sql解析,需要的朋友可以參考下

一、前言

在開發(fā)中,有時(shí)我們可能會需要獲取SQL中的表名,那么因?yàn)椴煌臄?shù)據(jù)源類型SQL會存在部分差異,那么我們就可以使用alibaba 的druid包實(shí)現(xiàn)不同的數(shù)據(jù)源類型的sql解析。

二、引入相關(guān)maven依賴

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>

三、通過工具類SqlUtils實(shí)現(xiàn)對SQL的解析。

public class QualitySqlUtils {
	  /**
     *  根據(jù)sql及數(shù)據(jù)源類型獲取表名
     */
	 public static List<String> getSelectSqlTable(String sql, String dbType) {
        List<String> tableList = new ArrayList<>();
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
        SchemaStatVisitor visitor;
        for (SQLStatement sqlStatement : stmtList) {
            if (DbType.mysql.name().equalsIgnoreCase(dbType)) {
                visitor = new MySqlSchemaStatVisitor();
            } else if (DbType.hive.name().equalsIgnoreCase(dbType)) {
                visitor = new HiveSchemaStatVisitor();
            } else if (DbType.postgresql.name().equalsIgnoreCase(dbType)) {
                visitor = new PGSchemaStatVisitor();
            } else if (DbType.oracle.name().equalsIgnoreCase(dbType)) {
                visitor = new OracleSchemaStatVisitor();
            } else {
                visitor = new SchemaStatVisitor(DbType.of(dbType));
            }
            sqlStatement.accept(visitor);
            Map<TableStat.Name, TableStat> tables = visitor.getTables();
            for (Map.Entry<TableStat.Name, TableStat> entry: tables.entrySet()){
                String value = entry.getValue().toString();
                if (StringUtils.isNotBlank(value)) {
                    tableList.add(entry.getKey().getName());
                }
            }
        }
        return tableList;
    }
    /**
    * 根據(jù)sql獲取查詢的字段
    */
    public static Map<String, String> getSelectSqlColumn(String sql, String dbType) {
        Map<String, String> columnMap = new HashMap<>();
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
        for (int i = 0; i < stmtList.size(); i++) {
            SQLStatement stmt = stmtList.get(i);
            if (stmt instanceof SQLSelectStatement) {
                SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) stmt;
                SQLSelect select = sqlSelectStatement.getSelect();
                SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();
                List<SQLSelectItem> selectList = query.getSelectList();
                selectList.forEach(item->{
                    columnMap.put(item.getExpr().toString(), item.getAlias());
                });
            }
        }
        return columnMap;
    }
}

三、測試結(jié)果

public class testDemo{
    public static void main(String[] args) {
        String sql = "select t.* from table1 as t left join table2 t2 on t.id = t2.id";
        List<String> tableList =getSelectSqlTable(sql, "mysql");
        System.out.println("獲取到的表名: "+tableList);
    }
}

運(yùn)行結(jié)果如下:

到此這篇關(guān)于springboot引入druid解析sql的文章就介紹到這了,更多相關(guān)springboot引入druid內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 對比Java中的Comparable排序接口和Comparator比較器接口

    對比Java中的Comparable排序接口和Comparator比較器接口

    Comparable和Comparator接口都可用作普通意義上對象間的比大小,但兩個(gè)接口在實(shí)例化方面的用法不盡相同,接下來我們就來詳細(xì)對比Java中的Comparable排序接口和Comparator比較器接口
    2016-05-05
  • springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例

    下面小編就為大家分享一篇springmvc 傳遞和接收數(shù)組參數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 一篇文章帶你入門java代理模式

    一篇文章帶你入門java代理模式

    這篇文章主要介紹了Java代理模式,結(jié)合實(shí)例形式詳細(xì)分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運(yùn)算符、邏輯運(yùn)算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • Java基礎(chǔ)之throw和throws的示例詳解

    Java基礎(chǔ)之throw和throws的示例詳解

    throw是用來拋出一個(gè)具體的異常實(shí)例,而throws是用來聲明方法可能會拋出哪些類型的異常,是對調(diào)用者的一種通知和要求,這篇文章主要介紹了Java基礎(chǔ):throw和throws的詳解,需要的朋友可以參考下
    2024-06-06
  • Java中字符編碼問題的解決方法詳解

    Java中字符編碼問題的解決方法詳解

    在日常 Java 開發(fā)中,字符編碼問題是一個(gè)非常常見卻又特別容易踩坑的地方,這篇文章就帶你一步一步看清楚字符編碼的來龍去脈,并結(jié)合可運(yùn)行的代碼,看看如何在 Java 項(xiàng)目里徹底解決編碼不一致的問題
    2025-09-09
  • Response如何實(shí)現(xiàn)重定向

    Response如何實(shí)現(xiàn)重定向

    這篇文章主要介紹了Response如何實(shí)現(xiàn)重定向方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringMVC異常處理知識點(diǎn)總結(jié)

    SpringMVC異常處理知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于SpringMVC異常處理相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-10-10
  • Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書神器

    Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書神器

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)追書神器,用技術(shù)改變生活,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-10-10
  • 設(shè)計(jì)模式之中介者模式_動力節(jié)點(diǎn)Java學(xué)院整理

    設(shè)計(jì)模式之中介者模式_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了設(shè)計(jì)模式之中介者模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java開發(fā)WMS倉庫商品預(yù)警需求示例解析

    java開發(fā)WMS倉庫商品預(yù)警需求示例解析

    這篇文章主要為大家介紹了java開發(fā)WMS倉庫商品預(yù)警需求示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04

最新評論

青铜峡市| 罗江县| 青岛市| 张家界市| 武山县| 黄石市| 崇礼县| 明水县| 宁波市| 凌海市| 沁源县| 孝感市| 黄平县| 北海市| 拜城县| 滕州市| 富锦市| 霸州市| 河源市| 安阳县| 汉寿县| 蓬莱市| 怀来县| 桓台县| 汉寿县| 闵行区| 沧州市| 崇仁县| 内丘县| 云梦县| 黔西县| 漠河县| 连州市| 昌平区| 当阳市| 鹤岗市| 周口市| 贵德县| 峨边| 尤溪县| 汨罗市|