做一個有產品思維的研發:程式碼生成

獵手家園發表於2019-04-22

每天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、做事之前不妨想一下,使用什麼技術手段可以提高你的工作效率。

 

相關文章