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

springboot引入druid解析sql的過程

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

一、前言

在開發(fā)中,有時我們可能會需要獲取SQL中的表名,那么因為不同的數據源類型SQL會存在部分差異,那么我們就可以使用alibaba 的druid包實現不同的數據源類型的sql解析。

二、引入相關maven依賴

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

三、通過工具類SqlUtils實現對SQL的解析。

public class QualitySqlUtils {
	  /**
     *  根據sql及數據源類型獲取表名
     */
	 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;
    }
    /**
    * 根據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;
    }
}

三、測試結果

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);
    }
}

運行結果如下:

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

相關文章

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

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

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

    springmvc 傳遞和接收數組參數的實例

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

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

    這篇文章主要介紹了Java代理模式,結合實例形式詳細分析了java基本數據類型、數據類型轉換、算術運算符、邏輯運算符等相關原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • Java基礎之throw和throws的示例詳解

    Java基礎之throw和throws的示例詳解

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

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

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

    Response如何實現重定向

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

    SpringMVC異常處理知識點總結

    在本篇文章里小編給大家整理的是關于SpringMVC異常處理相關知識點內容,需要的朋友們學習下。
    2019-10-10
  • Java實踐練習輕松幾行實現追書神器

    Java實踐練習輕松幾行實現追書神器

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

    設計模式之中介者模式_動力節(jié)點Java學院整理

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

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

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

最新評論

通渭县| 灵川县| 大新县| 安塞县| 荣昌县| 闽侯县| 楚雄市| 利川市| 利川市| 天柱县| 乌鲁木齐县| 洱源县| 高清| 临泉县| 周口市| 南昌市| 阿拉善右旗| 湖州市| 江华| 安溪县| 余姚市| 邯郸县| 富平县| 宁化县| 美姑县| 孝感市| 弥勒县| 襄樊市| 肃南| 兴安盟| 淮阳县| 马尔康县| 敦煌市| 天津市| 长兴县| 山东省| 合水县| 黄大仙区| 沅江市| 柯坪县| 法库县|