熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Spring3 Mybatis3 freemarker 自動生成對應表

2013-11-23 19:10:33  來源: Java核心技術 

  自己利用springmybatis進行開發時前期花費了大量的時間去寫對應的modelmapperservice文件並想到用freemarker來動態生成對應的JAVA文件
   
開發思路
   
    其實就是將數據庫中的表取出來表名作為類名並把對應的列名取出來作為字段名稱然後通過 freemarker定制的模版去生成相關的文件即可
   
    我這裡只舉例說明如何生成對應的model文件其它的可以直接COPY改改就成示例代碼如下
   
    首先定義一個對象SqlColumnData包含兩個屬性columnName(列名稱)columnType(列類型)具體定義如下 :
   
    package orgstudyjobdomain; /**   * SqlColumnDatajava Create on 上午::   *    *    * Copyright (c) by MTA   *    * @author lmeteor   * @Email   * @description  * @version   */ public class SqlColumnData {
   
    private String columnName;
   
   
   
    private String columnType;
   
    public String getColumnName()
   
    {
   
    return columnName;
   
    }
   
    public void setColumnName(String columnName)
   
    {
   
    lumnName = columnName;
   
    }
   
    public String getColumnType()
   
    {
   
    return columnType;
   
    }
   
    public void setColumnType(String columnType)
   
    {
   
    lumnType = columnType;
   
    }
   
   
   
    }
   


   下面三個方法作用如下
   
    //用來獲取指定表的所有列名及類型 public List getColumnDatas(String tableName)//將列名生成對應的field 和 methodpublic String getBeanField(String tableName) throws SQLException//將數據庫類型轉換成對應的JAVA類型publicString getType(String type)
   
    /** 
   
    * 獲取指定表的所有列名 
   
    *
   
   
   
    * @param tableName 
   
    * @return 
   
    * @throws SQLException 
   
    */ 
   
    public List getColumnDatas(String tableName) 
   
    throws SQLException
   
    {
   
    String sqlColumns = SELECT COLUMN_NAME DATA_TYPE FROM inlumns WHERE table_name = 
   
    + tableName + order by ordinal_position;
   
    Connection conn = null;
   
    PreparedStatement pst = null;
   
    ResultSet rs = null;
   
    List columnList = new ArrayList()
   
    try
   
    {
   
    conn = sqlDialectgetConn()
   
    pst = connprepareStatement(sqlColumns)
   
    rs = pstexecuteQuery()
   
    while (rsnext())
   
    {
   
    String name = rsgetString(
   
    String type = rsgetString(
   
    type = thisgetType(type)
   
    SqlColumnData cd = new SqlColumnData()
   
    cdsetColumnName(nametoLowerCase())
   
    cdsetColumnType(type)
   
    columnListadd(cd)
   
    }  
   
    }
   
    catch ( Exception e )
   
    {
   
    eprintStackTrace()
   
    }
   
    finally
   
    {
   
    try
   
    {
   
    if (conn != null) connclose()
   
    if (pst != null) pstclose()
   
    if (rs != null) rsclose()
   
    }
   
    catch ( SQLException e )
   
    {
   
    eprintStackTrace()
   
    }
   
    }
   
    return columnList;
   
    }  
   
    /**
   
    * 將列名生成對應的field 和 method
   
    * 
   
    * @param tableName
   
    * @return
   
    * @throws SQLException
   
    */
   
    public String getBeanField(String tableName) throws SQLException
   
    {
   
    List dataList = getColumnDatas(tableName)
   
    StringBuffer str = new StringBuffer()
   
    StringBuffer getset = new StringBuffer()
   
    for (SqlColumnData d : dataList)
   
    {
   
    String name = dgetColumnName()toLowerCase()
   
    String type = dgetColumnType()
   
    String maxChar = namesubstring( toUpperCase()
   
    strappend(\r\tappend(private append(type + append(
   
    name)append(;\n
   
    String method = maxChar + namesubstring( namelength())
   
    getsetappend(\r\tappend(public append(type + append(
   
    get + method + ()\n\t{\n
   
    getsetappend(\t\tappend(return thisappend(name)append(;\n\t}\n
   
    getsetappend(\r\tappend(public void append(
   
    set + method + + type + + name + )\n\t{\n
   
    getsetappend(\t\tappend(this + name + =append(name)append(
   
    ;\n\t}\n
   
    }
   
    argv = strtoString()
   
    method = getsettoString()
   
    return argv + method;
   
    }  
   
    private String argv;
   
    private String method;  
   
    /**


   
    * 將數據庫類型轉換成對應的JAVA類型
   
    * 
   
    * @param type
   
    * @return
   
    */
   
    public String getType(String type)
   
    {
   
    type = typetoLowerCase()
   
    if (charequals(type) || varcharequals(type)
   
    || nvarcharequals(type))
   
    {
   
    return String;
   
    }
   
    else if (intequals(type))
   
    {
   
    return Integer;
   
    }
   
    else if (bigintequals(type))
   
    {
   
    return Long;
   
    }
   
    else if (timestampequals(type) || dateequals(type)
   
    || datetimeequals(type))
   
    {
   
    return javasqlTimestamp;
   
    }
   
    else if (decimalequals(type))
   
    {
   
    return Double;
   
    }
   
    else if (imageequals(type))
   
    {
   
    return byte[];
   
    }
   
    else if (smallintequals(type))
   
    {
   
    return int;
   
    }
   
    return null;
   
    }
   
    /**
   
    * 將表名轉成class名稱
   
    *
   
    * @param tableName
   
    * @return
   
    */
   
    public String getTableNameToClassName(String tableName)
   
    {
   
    String[] splits = tableNametoLowerCase()split(_
   
    if (splitslength >
   
    {
   
    StringBuffer className = new StringBuffer()
   
    for (String split : splits)
   
    {
   
    String tempTableName = splitsubstring( toUpperCase()
   
    + splitsubstring(
   
    classNameappend(tempTableName)
   
    }
   
    return classNametoString()
   
    }
   
    else
   
    {
   
    String className = splits[]substring( toUpperCase()
   
    + splits[]substring(
   
    return className;
   
    }
   
    }
   
 SQL方面就准備的差不多了現在開始准備對應的模版文件如下
   
    我這裡使用的freemarker
   
    package orgstudyjobdomain;   import javaioSerializable; /**   * ${className?default()}java Create on ${datetime?default()}   *    *    * Copyright (c) by MTA   *   * @author lmeteor  * @Email   * @description  * @version   */ @SuppressWarnings(serial public class ${className?default()} implements Serializable {
   
    ${feilds?default()} }
   
    用freemarker通過模版創建文件
   
    /**
   
    * 創建靜態文件
   
    * 
   
    * @param templateFileName
   
    *
   
    模板文件名例如/WEBINF/view/tempftl
   
    * @param propMap
   
    *
   
    用於處理模板的屬性object映射
   
    * @param htmlFilePath
   
    *
   
    要生成的靜態文件的路徑例如/WEBINF/view////
   
    * @param htmlFileName
   
    *
   
    要生成的文件名例如l
   
    * @param templateFilePath
   
    *
   
    模版路徑
   
    */
   
    @SuppressWarnings(
   
    { unchecked })
   
    public static void createHtmlFile(String templateFileName Map propMap
   
    String htmlFilePath String htmlFileName String templateFilePath)
   
    {
   
    try
   
    {
   
    Template t = getFreemarkerCFG(templateFilePath)getTemplate(
   
    templateFileName)
   
    //createDirs(htmlFilePath)
   
    File file = null;
   
    if(StringToolsisEmpty(htmlFileName))file = new File(htmlFilePath)
   
    else file = new File(htmlFilePath + / + htmlFileName)
   
    if(!fileexists())filecreateNewFile()
   
    else filedelete()
   
    Writer out = new BufferedWriter(new OutputStreamWriter(
   
    new FileOutputStream(file)UTF))
   
    tprocess(propMap out)
   
    outflush()
   
    outclose()


   
    (文件+htmlFilePath+生成成功
   
    }
   
    catch ( IOException e )
   
    {
   
    eprintStackTrace()
   
    }
   
    catch ( TemplateException e )
   
    {
   
    eprintStackTrace()
   
    }
   
    }
   
    現在該准備的都准備好了准備開始實際調用如下
   
    /**
   
    * 生成JAVAMODULE文件
   
    * @param tableName
   
    */
   
    public static void createJavaModuleFile(String tableName)
   
    {
   
    String className = sqlutilgetTableNameToClassName(tableName)
   
    // 生成到指定的目錄下
   
    String modelPath = domain\\ + className + java;
   
    Map context = new HashMap()
   
    contextput(className className) //
   
    contextput(tableName tableName)
   
    contextput(datetime DateToolsgetDateTools()format(new Date()))
   
    /****************************** 生成bean字段 *********************************/
   
    try
   
    {
   
    contextput(feilds sqlutilgetBeanField(tableName)) // 生成bean
   
    (請稍侯正在生成Bean屬性及GETSET方法
   
    }
   
    catch ( Exception e )
   
    {
   
    eprintStackTrace()
   
    }
   
    // 生成文件代碼/
   
    CreateHtmlcreateHtmlFile(TempBeanftl context PCKPATH+modelPath null TEMPLATE_FILEPATH)
   
    }
   
    大致代碼就是這麼多我在自己的項目中將這個功能界面化了如下








  

  因為我項目中對SPRING的管理都是用注解完成所以不用去修改springxml文件


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26400.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.