zoukankan      html  css  js  c++  java
  • 做一个有产品思维的研发:代码生成

    每天10分钟,解决一个研发问题。

    如果你想了解我在做什么,请看《做一个有产品思维的研发:课程大纲》传送门:https://www.cnblogs.com/hunttown/p/10490965.html

    今天我们说一下代码生成问题:

    一个真实的案例:去年6月份,我带了一个新项目,从零开始的那种。库表设计完以后就交给一个研发同事进行开发,两天过去了,周一开站会的时候我问他进度怎么样?你猜他怎么说?他告诉我:“数据库已经建完了,SQLMap刚才做完,今天会开发Dao层。”

    我听完以后,一想,完了。

    会后我去看他的代码,果然如我所料,他在一个一个的创建文件!

    这本来是一个小时可以完成的工作,他用了两天才完成了20%的工作量。

    我后悔没有早点告诉他怎么做,我问他:“你知道有一种代码生成工具吗?”

    他说:“知道,但是不好用”。

    然后,我把他拉到我工位,给他演示了一遍如何使用,如何在30秒内生成1500个文件。

    他看完以后眼睛直冒光。

    所以说,代码生成这一篇非常重要,之前没有使用过的一定要仔细读完,因为它可以提高你99%的工作效率。

     我之前使用的工具是CodeSimith,后来发现动软件代码生成器比较好用。

     工具的使用方法,自己看官方教程就好了,我这里说几个重要的点。

    1、先确定你的项目一共分多少层,给每一层建一个模板。

    如下图,这里我们的项目前后端一共有10层,我建了10个模板。

    后端
    xml:存放SQLMap
    common:公共组件层
    domain:实体类层
    dao:持久层
    service:服务提供层
    rpc-interface:远程接口

    前端
    service:服务层
    query:条件
    convert:实体类转化层
    web:前端展现

    2、下面提供一个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;
        }
    }

    3、模板建好以后进行一键生成

    4、将创建好的文件复制到你的项目中。

    注意:直接复制文件需要注意文件是否是utf-8

    5、代码复制完成以后,就剩下controller层的特殊逻辑了(通用的CURD已经生成好了),自己根据业务开发即可。

    今日总结:

    1、大量重复的工作要交给机器去做。

    2、做事之前不妨想一下,使用什么技术手段可以提高你的工作效率。

  • 相关阅读:
    【建兰普及模拟赛第一场】20181023
    【Uva11400 Lighting System Design】动态规划
    【洛谷 P2388 阶乘之乘】模拟
    【Uva1025 A Spy in the Metro】动态规划
    【洛谷P2028 龙兄摘苹果】动态规划
    【洛谷P1507 NASA的食物计划】动态规划
    【洛谷P1795 无穷的序列_NOI导刊2010提高(05)】模拟
    【洛谷P1281 书的复制】二分+动态规划
    【洛谷P4933 大师】动态规划
    「GXOI / GZOI2019」旧词
  • 原文地址:https://www.cnblogs.com/hunttown/p/10734264.html
Copyright © 2011-2022 走看看