這是學習筆記的第 1862篇文章java
Druid在行業內是一個很流行的開源工具,在不少開發項目裏的數據源選型都是它,按照官方的參考數據,Druid的性能很是好,都是納秒級別。mysql
GitHub上Druid的星有一萬多,光提交的issue就有1000多個,可見在社區裏面也算是久經沙場了。sql
Druid和開發方向關係比較緊密,和DBA方向有什麼關係呢。其實仍是迴歸到本質,和SQL有關,在SQL方向目前存在幾個瓶頸。 數據庫
行業內的審覈工具對於DML的支持頗有限。微信
開源工具和數據庫的綁定比較緊,不夠通用,難以實現SQL方言化解析.maven
語法和詞法分析是一個技術活,單純分析文本作解析簡單粗暴,沒有體系化就難以實現擴展。工具
鑑於目前MySQL方向走得快一些,其餘方向的事務性工做依舊繁瑣,因此我但願在已有的基礎上作一個大的改變,那就是SQL審覈2.0版本,經過提供通用的技術體系來支撐通用的數據庫規範。性能
Druid不光做爲一個通用的數據源性能優越,並且裏面也內置了大量的輔助功能。 其實看到Druid實現的demo,會發現它早已超出了自己的定位,能夠作一些監控和優化,還有SQL解析器。學習
咱們能夠徹底站在巨人的肩膀上,把這些信息繼承起來,而後融入咱們自定義的邏輯來知足當前的業務需求。 優化
若是你不熟悉Java,按照GitHub的方式來編譯Druid,這應該會是一個很差的開始。
由於擺在你面前的第一道門檻就是maven,其實maven就是一個檔案庫,咱們能夠從裏面提取獲得相關的軟件。對於maven,就相似於咱們使用yum的方式是相似的。
咱們要建立一個java項目,以maven的方式建立。
在pom.xml引入以下的依賴便可。
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
新建一個Java文件,代碼相似下面的形式。
import java.util.List;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;
/**
* Hello world!
*
*/
public class Test {
public static void main(String[] args) {
//String sql = "update t set name = 'x' where id < 100 limit 10";
// String sql = "SELECT ID, NAME, AGE FROM USER WHERE ID = ? limit 2";
// String sql = "select * from tablename limit 10";
String sql = "CREATE TABLE `define_cdetag` (\n" +
" `id` int(32) unsigned NOT NULL COMMENT '配置項使用時標識',\n" +
" `thiSection` varchar(32) DEFAULT NULL COMMENT 'StageID白名單區間',\n" +
" `thiExceptList` text COMMENT 'test名單列表',\n" +
" PRIMARY KEY (`id`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';";
String dbType = JdbcConstants.MYSQL;
//格式化輸出
String result = SQLUtils.format(sql, dbType);
System.out.println(result); // 缺省大寫格式
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
//解析出的獨立語句的個數
System.out.println("size is:" + stmtList.size());
for (int i = 0; i < stmtList.size(); i++) {
SQLStatement stmt = stmtList.get(i);
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
stmt.accept(visitor);
//獲取表名稱
//System.out.println("Tables : " + visitor.getCurrentTable());
//獲取操做方法名稱,依賴於表名稱
System.out.println("Manipulation : " + visitor.getTables());
//獲取字段名稱
System.out.println("fields : " + visitor.getColumns());
System.out.println(visitor.getColumn("define_cdetag","thiSection").getDataType());
System.out.println(visitor.getColumn("define_cdetag","thiSection").getFullName());
System.out.println(visitor.getColumn("define_cdetag","id").isPrimaryKey());
System.out.println(visitor.getTableStat("define_cdetag"));
}
}
}
程序的輸入以下,能夠看到能夠解析到字段信息,主鍵信息
CREATE TABLE `define_cdetag` (
`id` int(32) UNSIGNED NOT NULL COMMENT '配置項使用時標識',
`thiSection` varchar(32) DEFAULT NULL COMMENT 'StageID白名單區間',
`thiExceptList` text COMMENT 'test名單列表',
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8 COMMENT 'test';
size is:1
一月 17, 2019 11:33:45 下午 com.alibaba.druid.sql.repository.SchemaRepository info
信息: replaced table 'define_cdetag'
Manipulation : {define_cdetag=Create}
fields : [define_cdetag.id, define_cdetag.thiSection, define_cdetag.thiExceptList]
varchar
`define_cdetag`.`thiSection`
true
Create
其實還有更多的DML相關的輔助信息,整個一套體系是比較全的。
本文分享自微信公衆號 - 楊建榮的學習筆記(jianrong-notes)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。