您好,登錄后才能下訂單哦!
這篇文章主要講解了“代碼生成器原理是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“代碼生成器原理是什么”吧!
代碼生成器原理很簡單,用一句話概括就是:將數(shù)據(jù)庫字段轉(zhuǎn)換成Java字段并輸出內(nèi)容。
如下圖所示:
因此,首先需要做的是獲取表信息以及表的字段信息,一般有兩種方式,第一種:連接到數(shù)據(jù)庫,執(zhí)行相關(guān)SQL,查詢出表結(jié)構(gòu)信息。第二種:解析DDL,得到相關(guān)信息,code-gen采用第一種做法。
獲取表信息
包括表名稱,表備注,Mysql可以使用下面這個SQL。(code-gen源碼對應(yīng):com.gitee.gen.gen.mysql.MySqlTableSelector)
SHOW TABLE STATUS FROM table_name
如果需要指定某張表,直接加where條件即可
SHOW TABLE STATUS FROM table_name where name = 'user_info';
查詢后結(jié)果如下:
Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
"user_info" | "InnoDB" | "10" | "Dynamic" | "0" | "0" | "16384" | "0" | "0" | "0" | "1" | "2020-12-22 15:16:40" | "utf8_general_ci" | "用戶信息表" |
獲取表字段信息
Mysql可以用如下SQL(code-gen對應(yīng)源碼:com.gitee.gen.gen.mysql.MySqlColumnSelector):
SHOW FULL COLUMNS FROM user_info;
查詢后結(jié)果如下:
Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
---|---|---|---|---|---|---|---|---|
"id" | "int(11)" | "NO" | "PRI" | "auto_increment" | "select,insert,update,references" | "自增主鍵" | ||
"name" | "int(11)" | "NO" | "select,insert,update,references" | "姓名" | ||||
"create_time" | "timestamp" | "NO" | "CURRENT_TIMESTAMP" | "select,insert,update,references" | "添加時間" |
從表格中,可以獲取字段名稱、類型、備注、是否主鍵、是否自增
查詢出數(shù)據(jù)庫的基本信息后,把這信息放到對象中,方便后續(xù)處理。
/** * 數(shù)據(jù)庫表定義,從這里可以獲取表名,字段信息 */ public class TableDefinition { /** * 表名 */ private String tableName; /** * 表注釋 */ private String comment; /** * 字段 */ private List<ColumnDefinition> columnDefinitions ... 省略 getter setter }
其中TableDefinition
類存放表信息,ColumnDefinition
類存放字段信息
接下來是將TableDefinition
對象中的變量綁定到Velocity模板當中去。
VelocityContext context = new VelocityContext(); TableDefinition tableDefinition = ... context.put("table", tableDefinition); context.put("columns", tableDefinition.getColumnDefinitions()); return VelocityUtil.generate(context, template);
VelocityContext存放Velocity變量,在對象中放入兩個變量table、columns,template是模板內(nèi)容
然后再模板中就可以使用對應(yīng)的變量了,對應(yīng)的模板可以這么寫:
/** * ${table.comment} */ public class ${context.javaBeanName} { // Java字段信息 #foreach($column in $columns) /** ${column.comment} */ private ${column.javaTypeBox} ${column.javaFieldName}; #end // getter,setter部分 #foreach(${column} in ${columns}) public void set${column.javaFieldNameUF}(${column.javaTypeBox} ${column.javaFieldName}) { this.${column.javaFieldName} = ${column.javaFieldName}; } public ${column.javaTypeBox} get${column.javaFieldNameUF}() { return this.${column.javaFieldName}; } #end }
得到生成結(jié)果后,把內(nèi)容返回到前端頁面。
如何處理多種數(shù)據(jù)庫,這里的關(guān)鍵點是要獲取數(shù)據(jù)庫的表結(jié)構(gòu)以及字段信息,每種數(shù)據(jù)庫的獲取SQL是不一樣的,因此需要把獲取表信息和獲取字段信息抽象出來,然后讓實際的數(shù)據(jù)庫取實現(xiàn)抽象部分即可。
code-gen對應(yīng)抽象類:
com.gitee.gen.gen.TableSelector 抽象類,用來獲取表信息 子類:
com.gitee.gen.gen.mysql.MySqlTableSelector
com.gitee.gen.gen.oracle.OracleTableSelector
com.gitee.gen.gen.postgresql.PostgreSqlTableSelector
com.gitee.gen.gen.sqlserver.SqlServerTableSelector
com.gitee.gen.gen.ColumnSelector 抽象類,用來獲取表字段信息 子類:
com.gitee.gen.gen.mysql.MySqlColumnSelector
com.gitee.gen.gen.oracle.OracleColumnSelector
com.gitee.gen.gen.postgresql.PostgreSqlColumnSelector
com.gitee.gen.gen.sqlserver.SqlServerColumnSelector
感謝各位的閱讀,以上就是“代碼生成器原理是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對代碼生成器原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。