天天10分鐘,解決一個研發問題。html
若是你想了解我在作什麼,請看《作一個有產品思惟的研發:課程大綱》傳送門:http://www.javashuo.com/article/p-cayviilq-hn.html前端
今天咱們說一下代碼生成問題:java
一個真實的案例:去年6月份,我帶了一個新項目,從零開始的那種。庫表設計完之後就交給一個研發同事進行開發,兩天過去了,週一開站會的時候我問他進度怎麼樣?你猜他怎麼說?他告訴我:「數據庫已經建完了,SQLMap剛纔作完,今天會開發Dao層。」web
我聽完之後,一想,完了。spring
會後我去看他的代碼,果真如我所料,他在一個一個的建立文件!數據庫
這原本是一個小時能夠完成的工做,他用了兩天才完成了20%的工做量。後端
我後悔沒有早點告訴他怎麼作,我問他:「你知道有一種代碼生成工具嗎?」dom
他說:「知道,可是很差用」。工具
而後,我把他拉到我工位,給他演示了一遍如何使用,如何在30秒內生成1500個文件。spa
他看完之後眼睛直冒光。
因此說,代碼生成這一篇很是重要,以前沒有使用過的必定要仔細讀完,由於它能夠提升你99%的工做效率。
我以前使用的工具是CodeSimith,後來發現動軟件代碼生成器比較好用。
工具的使用方法,本身看官方教程就行了,我這裏說幾個重要的點。
一、先肯定你的項目一共分多少層,給每一層建一個模板。
以下圖,這裏咱們的項目先後端一共有10層,我建了10個模板。
後端
xml:存放SQLMap
common:公共組件層
domain:實體類層
dao:持久層
service:服務提供層
rpc-interface:遠程接口
前端
service:服務層
query:條件
convert:實體類轉化層
web:前端展示
二、下面提供一個dao層模板代碼
<#@ template language="C#" HostSpecific="True" #> <#@ output extension= ".java" #> <# TableHost host = (TableHost)(Host); host.Fieldlist.Sort(CodeCommon.CompareByintOrder); #> <#string tb_name = host.GetModelClass(host.TableName).ToLower(); string[] tb_args = tb_name.Split('_'); tb_name = null; string tb_name_small = null; int i = 0; foreach(string s in tb_args) { tb_name += (s.Substring(0, 1).ToUpper() + s.Substring(1)); if (i == 0) { tb_name_small = s; } else { tb_name_small += (s.Substring(0, 1).ToUpper() + s.Substring(1)); } i++; }#> package com.hunttown.analysis.dao; import com.hunttown.common.dao.base.BaseDao; import com.hunttown.common.domain.Query; import com.jd.analysis.domain.<#= tb_name #>; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; import java.util.List; /** * created by admin on <#= DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> */ @Repository public class <#= tb_name #>Dao extends BaseDao { private static final Logger logger = LoggerFactory.getLogger(<#= tb_name #>Dao.class); public <#= tb_name #> insert(final <#= tb_name #> <#= tb_name_small #>) { insert("<#= tb_name #>.insert", <#= tb_name_small #>); return <#= tb_name_small #>; } public Boolean updateInfoById(final <#= tb_name #> <#= tb_name_small #>) { return update("<#= tb_name #>.updateInfoById", <#= tb_name_small #>) > 0; } public Boolean updateInfoByQuery(final Query query) { return update("<#= tb_name #>.updateInfoByQuery", query) > 0; } public <#= tb_name #> selectById(final Long id) { Query query = Query.noPage(); query.put("id", id); return queryForObject("<#= tb_name #>.selectById", query); } public List<<#= tb_name #>> selectByQuery(final Query query) { return queryForList("<#= tb_name #>.selectByQuery", query); } public Long countByQuery(final Query query) { return queryForObject("<#= tb_name #>.countByQuery", query); } public Boolean deleteById(final Long id) { <#= tb_name #> <#= tb_name_small #> = new <#= tb_name #>(); <#= tb_name_small #>.setDeleteFlag(1); <#= tb_name_small #>.setId(id); return update("<#= tb_name #>.updateInfoById", <#= tb_name_small #>) > 0; } //物理刪除不可恢復,慎用! public Boolean deleteByIdForPhysical(final Long id) { Query query = Query.noPage(); query.put("id", id); return delete("<#= tb_name #>.deleteById", query) > 0; } }
三、模板建好之後進行一鍵生成
四、將建立好的文件複製到你的項目中。
注意:直接複製文件須要注意文件是不是utf-8
五、代碼複製完成之後,就剩下controller層的特殊邏輯了(通用的CURD已經生成好了),本身根據業務開發便可。
今日總結:
一、大量重複的工做要交給機器去作。
二、作事以前不妨想一下,使用什麼技術手段能夠提升你的工做效率。