天天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已经生成好了),本身根据业务开发便可。
今日总结:
一、大量重复的工做要交给机器去作。
二、作事以前不妨想一下,使用什么技术手段能够提升你的工做效率。