自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

告別無止境的增刪改查:Java代碼生成器

開發(fā) 后端
對(duì)于一個(gè)比較大的業(yè)務(wù)系統(tǒng),我們總是無止境的增加,刪除,修改,粘貼,復(fù)制,想想總讓人產(chǎn)生一種抗拒的心里。那有什么辦法可以在正常的開發(fā)進(jìn)度下自動(dòng)生成一些類,配置文件,或者接口呢?

有感于馬上要做個(gè)比較大的業(yè)務(wù)系統(tǒng),想到那無止境的增刪改查、粘貼復(fù)制,頓時(shí)腦后升起一陣涼風(fēng)。于是想到個(gè)找或者寫一個(gè)Java代碼的生成器,這樣在正常開發(fā)進(jìn)度下,也能余下更多的時(shí)間去做些別的事情。

閑話少說,首先總結(jié)下需求:

我需要的這個(gè)工具能夠讀取數(shù)據(jù)庫表結(jié)構(gòu),通過對(duì)字段類型、名稱等分析得到需要的各種變量,根據(jù)模板生成相應(yīng)的pojo類、hibernate的xml配置文件、dao和service的接口和類。

需求看起來很簡(jiǎn)單,但是一是沒搞過這樣的小工具,二是技術(shù)不過關(guān),所以還是想到了找找有沒有開源的代碼拿過來根據(jù)自己的需求改。

于是找到了rapid-generator這個(gè)開源工具,同學(xué)們可以下載rapid-generator直接使用,根據(jù)自己的需求寫好模板就行了。

由于自己項(xiàng)目中的特殊情況和公司規(guī)范等因素,另外也是想學(xué)習(xí)下別人的設(shè)計(jì),所以我對(duì)源碼進(jìn)行了刪減和功能的修改。

來看下主要的類:

Table:根據(jù)表結(jié)構(gòu)建立的對(duì)象。

Column:根據(jù)表中每列建立的對(duì)象。

Generator:生成器核心類,主要負(fù)責(zé)根據(jù)表對(duì)象和讀取FreeMarker模板生成最后的java代碼文件。

GeneratorControl:控制生成過程等的一些參數(shù),例如文件是否覆蓋、文件編碼等。

GeneratorProperties:讀取配置文件的類,配置文件包括數(shù)據(jù)庫連接信息和一些基本的參數(shù)配置。

下面來看一下模板的編寫:

pojo模板:

  1. <#include "/java_copyright.include">  
  2. <#assign className = table.className>     
  3. <#assign classNameLower = className?uncap_first>   
  4. package ${basepackage}.pojo.${mpackage}.${table.classNameFirstLower};  
  5.  
  6. <#include "/java_imports.include">  
  7. import com.linkage.agri.pojo.base.BaseEntity;  
  8.  
  9. public class ${className} extends BaseEntity {  
  10.     private static final long serialVersionUID = 5454155825314635342L;  
  11.       
  12.     <#list table.columns as column>  
  13.     /**  
  14.      * ${column.remarks}  
  15.      */ 
  16.     private ${column.simpleJavaType} ${column.columnNameLower};  
  17.     </#list>  
  18.  
  19. <@generateJavaColumns/>  
  20.  
  21. <#macro generateJavaColumns>  
  22.     <#list table.columns as column>  
  23.         <#if column.isDateTimeColumn>  
  24.     public String get${column.columnName}String() {  
  25.         return DateConvertUtils.format(get${column.columnName}(), FORMAT_${column.constantName});  
  26.     }  
  27.     public void set${column.columnName}String(String ${column.columnNameLower}) {  
  28.         set${column.columnName}(DateConvertUtils.parse(${column.columnNameLower}, FORMAT_${column.constantName},${column.simpleJavaType}.class));  
  29.     }  
  30.         </#if>      
  31.     public void set${column.columnName}(${column.simpleJavaType} ${column.columnNameLower}) {  
  32.         this.${column.columnNameLower} = ${column.columnNameLower};  
  33.     }  
  34.       
  35.     public ${column.simpleJavaType} get${column.columnName}() {  
  36.         return this.${column.columnNameLower};  
  37.     }  
  38.     </#list>  
  39. </#macro> 

FreeMarker的基本語法可以看下FreeMarker中文手冊(cè)。

${}可以引用很多變量,這些變量包括:環(huán)境變量、table對(duì)象、配置變量等,這些變量都裝在一個(gè)map里,如果自己有特殊需求,當(dāng)然可以修改源碼來裝載更多的變量值。

注意:當(dāng)變量為對(duì)象時(shí),訪問對(duì)象的屬性是通過get方法來訪問的。例如${table.classNameFirstLower},是引用 table對(duì)象的getNameFirstLower()方法,即使table對(duì)象中沒有nameFirstLower這個(gè)屬性也能夠引用。

再看下我寫的dao的模板:

  1. <#include "/java_copyright.include">  
  2. <#assign className = table.className>     
  3. <#assign classNameLower = className?uncap_first>     
  4. package ${basepackage}.dao.${mpackage}.${table.classNameFirstLower};  
  5.  
  6. import java.math.BigDecimal;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.  
  10. import com.linkage.agri.dao.base.AbstractHibernateDAO;  
  11. import com.linkage.agri.exception.DAOException;  
  12. import ${basepackage}.pojo.${mpackage}.${classNameLower}.${className};  
  13.  
  14. <#include "/java_imports.include">  
  15.  
  16. public Class ${className}DAOImpl extends AbstractHibernateDAO implements ${className}DAO  
  17. {  
  18.     /**  
  19.      * <query all>  
  20.      * @param paramMap  
  21.      * @param orderMap  
  22.      * @param pageNum  
  23.      * @param pageSize  
  24.      * @return  
  25.      * @throws DAOException  
  26.      */ 
  27.     @SuppressWarnings 
  28.     public List<${className}> queryList${className}ByAttr(Map<String, Object> paramMap, Map<String, String> orderMap, int pageNum,  
  29.         int pageSize)  
  30.         throws DAOException  
  31.     {  
  32.         return super.listInstances(${className}.class, paramMap, orderMap, pageNum, pageSize);  
  33.     }  
  34.       
  35.     /**  
  36.      *   
  37.      * <find one by id>  
  38.      * @param serial  
  39.      * @throws DAOException  
  40.      */ 
  41.     public ${className} find${className}By${table.pkColumn.columnName}(${table.pkColumn.simpleJavaType} ${table.pkColumn.columnNameFirstLower})  
  42.         throws DAOException  
  43.     {  
  44.         return (${className})super.findById(${className}.class, ${table.pkColumn.columnNameFirstLower});  
  45.     }  
  46.       
  47.     /**  
  48.      *   
  49.      * <save one>  
  50.      * @param ${table.classNameFirstLower}  
  51.      * @throws DAOException  
  52.      */ 
  53.     public ${table.pkColumn.simpleJavaType} save${className}(${className} ${table.classNameFirstLower})  
  54.         throws DAOException  
  55.     {  
  56.         return (${table.pkColumn.simpleJavaType})super.saveInstance(${table.classNameFirstLower});  
  57.     }  
  58.       
  59.     /**  
  60.      *   
  61.      * <update one>  
  62.      * @param ${table.classNameFirstLower}  
  63.      * @throws DAOException  
  64.      */ 
  65.     public void update${className}(${className} ${table.classNameFirstLower})  
  66.         throws DAOException  
  67.     {  
  68.         super.updateInstance(${className});  
  69.     }  
  70.       
  71.     /**  
  72.      * <check one is have?>  
  73.      * @param paramMap  
  74.      * @return  
  75.      * @throws DAOException  
  76.      */ 
  77.     public boolean check${className}IsHaveByAttr(Map<String, Object> paramMap)  
  78.         throws DAOException  
  79.     {  
  80.         StringBuffer sqlBuffer = new StringBuffer();  
  81.         sqlBuffer.append("SELECT COUNT(*) FROM ${table.sqlName} T ");  
  82.         sqlBuffer.append("WHERE T.${table.pkColumn.sqlName} = ? ");  
  83.           
  84.         BigDecimal big = (BigDecimal)super.findUniqueResultBySQLWithParams(sqlBuffer.toString(), paramMap.get("${table.pkColumn.columnNameFirstLower}"));  
  85.         return big.intValue() > 0 ? false : true;  
  86.     }  
  87.       
  88.     /**  
  89.      * <update some>  
  90.      * @param ${table.classNameFirstLower}List  
  91.      * @return  
  92.      * @throws DAOException  
  93.      */ 
  94.     public void update${className}Batch(List<${className}> ${table.classNameFirstLower}List)  
  95.         throws DAOException  
  96.     {  
  97.         super.updateBatchInstance(${table.classNameFirstLower}List);  
  98.     }  
  99.       
  100.     /**  
  101.      *   
  102.      * <delete one>  
  103.      * @param ${table.classNameFirstLower}  
  104.      * @throws DAOException  
  105.      */ 
  106.     public void delete${className}(${className} ${table.classNameFirstLower})  
  107.         throws DAOException  
  108.     {  
  109.         super.deleteInstance(${table.classNameFirstLower});  
  110.     }  
  111.  

建立模板是能否解決自己?jiǎn)栴}的關(guān)鍵,在摸索出門道以后寫模板變的十分簡(jiǎn)單。其實(shí)原理很簡(jiǎn)單,就是用一系列占位符來替換實(shí)際的變量值。

模板路徑可以按照實(shí)際項(xiàng)目中的路徑來拜訪,生成器可以讀取某個(gè)路徑下所有模板進(jìn)行生成,結(jié)果如下圖:

接口和實(shí)現(xiàn):

就說這么多吧,感興趣的可以研究下這個(gè)工具的源碼,也DIY出一套自己代碼生成工具。不感興趣的直接寫模板就能用。

我只是走在路上,偶爾駐足觀賞,偶爾回頭看看。

原文鏈接:http://www.cnblogs.com/zhuYears/archive/2012/02/29/2373491.html

【編輯推薦】

  1. 使用JNI進(jìn)行混合編程:在Java中調(diào)用C/C++本地庫
  2. Java通過SSH2協(xié)議運(yùn)行遠(yuǎn)程程序
  3. Java Socket編程:初識(shí)TCP Socket
  4. Java Socket編程:如何識(shí)別網(wǎng)絡(luò)主機(jī)
  5. Java Socket編程:基本的術(shù)語和概念
責(zé)任編輯:林師授 來源: 朱樣年華的博客
相關(guān)推薦

2009-04-24 21:02:08

Vmwareesx虛擬化

2017-03-20 17:49:21

Java Web模板代碼

2015-08-25 15:54:17

程序員代碼生成器

2021-07-23 11:24:54

Create Inc開源G代碼生成器

2009-12-21 13:50:55

Linux桌面

2023-05-17 16:02:00

CSS工具代碼生成器

2009-11-03 14:53:13

無線接入網(wǎng)

2015-10-30 10:24:31

JAVA微信插件框架

2015-04-22 09:36:27

JAVA代碼生成器

2020-10-20 09:53:11

代碼IDEA生成器

2012-03-30 09:31:44

WEBCSS

2023-01-06 07:52:52

代碼生成器開發(fā)

2011-09-21 13:33:48

DBA數(shù)據(jù)庫

2021-10-29 11:25:41

代碼編程語言Java

2021-12-10 09:45:19

生成器配置代碼

2010-06-12 09:51:07

Eclipse插件Java代碼生成器slave4j1.0.

2017-09-06 09:26:03

Python生成器協(xié)程

2022-05-19 14:57:30

CSS代碼工具

2009-07-03 09:29:24

KeelKit

2020-10-29 08:39:45

JSONJava對(duì)象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)