日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
告別無(wú)止境的增刪改查:Java代碼生成器

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

創(chuàng)新互聯(lián)IDC提供業(yè)務(wù):成都服務(wù)器托管,成都服務(wù)器租用,成都服務(wù)器托管,重慶服務(wù)器租用等四川省內(nèi)主機(jī)托管與主機(jī)租用業(yè)務(wù);數(shù)據(jù)中心含:雙線機(jī)房,BGP機(jī)房,電信機(jī)房,移動(dòng)機(jī)房,聯(lián)通機(jī)房。

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

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

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

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

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

來(lái)看下主要的類:

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

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

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

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

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

下面來(lái)看一下模板的編寫:

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. <#include "/java_imports.include">
  6. import com.linkage.agri.pojo.base.BaseEntity;
  7. public class ${className} extends BaseEntity {
  8.     private static final long serialVersionUID = 5454155825314635342L;
  9.     
  10.     <#list table.columns as column>
  11.     /**
  12.      * ${column.remarks}
  13.      */
  14.     private ${column.simpleJavaType} ${column.columnNameLower};
  15.     
  16. <@generateJavaColumns/>
  17. <#macro generateJavaColumns>
  18.     <#list table.columns as column>
  19.         <#if column.isDateTimeColumn>
  20.     public String get${column.columnName}String() {
  21.         return DateConvertUtils.format(get${column.columnName}(), FORMAT_${column.constantName});
  22.     }
  23.     public void set${column.columnName}String(String ${column.columnNameLower}) {
  24.         set${column.columnName}(DateConvertUtils.parse(${column.columnNameLower}, FORMAT_${column.constantName},${column.simpleJavaType}.class));
  25.     }
  26.             
  27.     public void set${column.columnName}(${column.simpleJavaType} ${column.columnNameLower}) {
  28.         this.${column.columnNameLower} = ${column.columnNameLower};
  29.     }
  30.     
  31.     public ${column.simpleJavaType} get${column.columnName}() {
  32.         return this.${column.columnNameLower};
  33.     }
  34.     

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

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

注意:當(dāng)變量為對(duì)象時(shí),訪問(wèn)對(duì)象的屬性是通過(guò)get方法來(lái)訪問(wèn)的。例如${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. import java.math.BigDecimal;
  6. import java.util.List;
  7. import java.util.Map;
  8. import com.linkage.agri.dao.base.AbstractHibernateDAO;
  9. import com.linkage.agri.exception.DAOException;
  10. import ${basepackage}.pojo.${mpackage}.${classNameLower}.${className};
  11. <#include "/java_imports.include">
  12. public Class ${className}DAOImpl extends AbstractHibernateDAO implements ${className}DAO
  13. {
  14.     /**
  15.      * 
  16.      * @param paramMap
  17.      * @param orderMap
  18.      * @param pageNum
  19.      * @param pageSize
  20.      * @return
  21.      * @throws DAOException
  22.      */
  23.     @SuppressWarnings
  24.     public List<${className}> queryList${className}ByAttr(Map paramMap, Map orderMap, int pageNum,
  25.         int pageSize)
  26.         throws DAOException
  27.     {
  28.         return super.listInstances(${className}.class, paramMap, orderMap, pageNum, pageSize);
  29.     }
  30.     
  31.     /**
  32.      * 
  33.      * 
  34.      * @param serial
  35.      * @throws DAOException
  36.      */
  37.     public ${className} find${className}By${table.pkColumn.columnName}(${table.pkColumn.simpleJavaType} ${table.pkColumn.columnNameFirstLower})
  38.         throws DAOException
  39.     {
  40.         return (${className})super.findById(${className}.class, ${table.pkColumn.columnNameFirstLower});
  41.     }
  42.     
  43.     /**
  44.      * 
  45.      * 
  46.      * @param ${table.classNameFirstLower}
  47.      * @throws DAOException
  48.      */
  49.     public ${table.pkColumn.simpleJavaType} save${className}(${className} ${table.classNameFirstLower})
  50.         throws DAOException
  51.     {
  52.         return (${table.pkColumn.simpleJavaType})super.saveInstance(${table.classNameFirstLower});
  53.     }
  54.     
  55.     /**
  56.      * 
  57.      * 
  58.      * @param ${table.classNameFirstLower}
  59.      * @throws DAOException
  60.      */
  61.     public void update${className}(${className} ${table.classNameFirstLower})
  62.         throws DAOException
  63.     {
  64.         super.updateInstance(${className});
  65.     }
  66.     
  67.     /**
  68.      * 
  69.      * @param paramMap
  70.      * @return
  71.      * @throws DAOException
  72.      */
  73.     public boolean check${className}IsHaveByAttr(Map paramMap)
  74.         throws DAOException
  75.     {
  76.         StringBuffer sqlBuffer = new StringBuffer();
  77.         sqlBuffer.append("SELECT COUNT(*) FROM ${table.sqlName} T ");
  78.         sqlBuffer.append("WHERE T.${table.pkColumn.sqlName} = ? ");
  79.         
  80.         BigDecimal big = (BigDecimal)super.findUniqueResultBySQLWithParams(sqlBuffer.toString(), paramMap.get("${table.pkColumn.columnNameFirstLower}"));
  81.         return big.intValue() > 0 ? false : true;
  82.     }
  83.     
  84.     /**
  85.      * 
  86.      * @param ${table.classNameFirstLower}List
  87.      * @return
  88.      * @throws DAOException
  89.      */
  90.     public void update${className}Batch(List<${className}> ${table.classNameFirstLower}List)
  91.         throws DAOException
  92.     {
  93.         super.updateBatchInstance(${table.classNameFirstLower}List);
  94.     }
  95.     
  96.     /**
  97.      * 
  98.      * 
  99.      * @param ${table.classNameFirstLower}
  100.      * @throws DAOException
  101.      */
  102.     public void delete${className}(${className} ${table.classNameFirstLower})
  103.         throws DAOException
  104.     {
  105.         super.deleteInstance(${table.classNameFirstLower});
  106.     }
  107. }

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

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

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

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

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


本文名稱:告別無(wú)止境的增刪改查:Java代碼生成器
文章鏈接:http://m.5511xx.com/article/djjggsi.html