• 模仿Hibernate的逆向工程_java版_源码下载


    在这篇blog:"Hibernate逆向工程原理_java版本"中谈到了Hibernate逆向工程原理。

    我喜欢理论和实践相结合....so,今天我试着模仿hibernate的逆向工程,哈哈,我成功啦....

    话不多说....直接上图先:

    项目结构:

    运行效果:

    1 #jdbc.cfg.properties配置文件信息
    2 #database name
    3 DB_NAME = mytest

    POJO效果:

    #jdbc.cfg.properties配置文件信息
    #database name
    DB_NAME = hongten

    运行效果:

    //说明:我们生成的POJO类的getter,setter方法没有自动生成,需要我们手动生成...^_^
    //===============================================

    ====================================================

    代码部分:

    ====================================================

    /hibernate_reverse/src/com/b510/db/util/DBUtil.java

      1 /**
      2  * 
      3  */
      4 package com.b510.db.util;
      5 
      6 import java.sql.Connection;
      7 import java.sql.DriverManager;
      8 import java.sql.PreparedStatement;
      9 import java.sql.ResultSet;
     10 import java.util.ArrayList;
     11 import java.util.List;
     12 
     13 import org.apache.log4j.Logger;
     14 
     15 import com.b510.velocity.util.DescTableBean;
     16 import com.b510.velocity.util.LoadProperties;
     17 
     18 /**
     19  * 数据库工具,该类功能:<br>
     20  * <li>showTables()获取数据库的所有表信息</li>
     21  * <li>descTable()获取表的描述信息</li>
     22  * <br>********************************************<br>
     23  * <code>jdbc.cfg.properties</code>为数据库的配置信息,默认位置是在项目src目录下面<br>
     24  * @author Hongten
     25  * @date 2013-4-9
     26  */
     27 public class DBUtil {
     28     Logger log = Logger.getLogger(DBUtil.class);
     29 
     30     // 载入配置
     31     // ==================================
     32     private static final String JDBC_CFG_PROPERTIES = "jdbc.cfg.properties";
     33     private static LoadProperties loadProperties = new LoadProperties(JDBC_CFG_PROPERTIES);
     34 
     35     // JDBC RESOURCES
     36     // ==================================
     37     private static String DB_DRIVER = loadProperties.getValue("DB_DRIVER");
     38     private static String DB_NAME = loadProperties.getValue("DB_NAME");
     39     private static String DB_PASSWORD = loadProperties.getValue("DB_PASSWORD");
     40     private static String DB_USER_NAME = loadProperties.getValue("DB_USER_NAME");
     41     private static String DB_URL = "jdbc:mysql://localhost:" + loadProperties.getValue("DB_PORT") + "/" + DB_NAME;
     42     private static String SHOW_TABLES = "show tables";
     43     
     44     /**
     45      * 读取配置文件,初始化信息
     46      */
     47     public DBUtil() {
     48         loadProperties = loadProperties == null ? new LoadProperties(JDBC_CFG_PROPERTIES) : loadProperties;
     49     }
     50 
     51     /**
     52      * 获取数据库中所有的表名称
     53      * 
     54      * @return 数据库中表名称的list
     55      * @throws Exception
     56      */
     57     public List<String> showTables() throws Exception {
     58         List<String> list = new ArrayList<String>();
     59         Class.forName(DB_DRIVER);
     60         Connection conn = DriverManager.getConnection(DB_URL, DB_USER_NAME, DB_PASSWORD);
     61         PreparedStatement ps = conn.prepareStatement(SHOW_TABLES);
     62         ResultSet rs = ps.executeQuery();
     63         log.info("数据库:[" + DB_NAME + "]中的表如下:");
     64         while (rs.next()) {
     65             String tableName = rs.getString(1);
     66             log.info(tableName);
     67             list.add(tableName);
     68         }
     69         close(rs, ps, conn);
     70         return list;
     71     }
     72 
     73     /**
     74      * 获取表的描述
     75      * @param tableName 表名称
     76      * @return
     77      * @throws Exception
     78      */
     79     public List<DescTableBean> descTable(String tableName) throws Exception {
     80         List<DescTableBean> list = new ArrayList<DescTableBean>();
     81         DescTableBean temp = null;
     82         Class.forName(DB_DRIVER);
     83         Connection conn = DriverManager.getConnection(DB_URL, DB_USER_NAME, DB_PASSWORD);
     84         PreparedStatement ps = conn.prepareStatement("desc " + tableName);
     85         ResultSet rs = ps.executeQuery();
     86         log.info("获取数据库表:[" + tableName + "]的结构:");
     87         while (rs.next()) {
     88             String descTable = " " + rs.getString(1) + "   " + rs.getString(2) + "    " + rs.getString(3) + "        " + rs.getString(4) + "        " + rs.getString(5) + "      " + rs.getString(6);
     89             log.info(descTable);
     90             temp = new DescTableBean();
     91             temp.setField(rs.getString(1));
     92             String type = rs.getString(2);
     93             temp.setType(getType(type));
     94             temp.setLength(Integer.valueOf(getValueByType(type)));
     95             temp.setDecase(Integer.valueOf(getDecase(type)));
     96             temp.setIsNull(rs.getString(3));
     97             temp.setKey(rs.getString(4));
     98             temp.setDefaultValue(rs.getString(5));
     99             temp.setExtra(rs.getString(6));
    100             list.add(temp);
    101         }
    102         close(rs, ps, conn);
    103         return list;
    104     }
    105     
    106     /**
    107      * 关闭:记录集,声明,链接对象
    108      * @param rs 记录集
    109      * @param ps 声明
    110      * @param conn 链接对象
    111      * @throws Exception
    112      */
    113     protected void close(ResultSet rs,PreparedStatement ps,Connection conn) throws Exception{
    114         if (rs != null) {
    115             rs.close();
    116         }
    117         if (ps != null) {
    118             ps.close();
    119         }
    120         if (conn != null) {
    121             conn.close();
    122         }
    123     }
    124     
    125     /**
    126      * 获取类型
    127      * @param type 如:<code>varchar(20)</code>,<code>datetime</code>,<code>double</code>,<code>longtext</code>
    128      * @return 结果:<br><li>type = "varchar(20)", return type = "varchar";</li>
    129      *            <li>type = "datetime", return type = "datetime";</li>
    130      */
    131     protected String getType(String type){
    132         if(type.endsWith(")")){
    133             type = type.substring(0, type.indexOf("("));
    134         }
    135         return type;
    136     }
    137     
    138     /**
    139      * 获取类型的长度,默认为255
    140      * @param type 如:<code>varchar(20)</code>,<code>decimal(19,2)</code>,<code>datetime</code>,<code>double</code>,<code>longtext</code>
    141      * @return 结果:<br><li>type = "varchar(20)", return "20";</li>
    142      *            <li>type = "datetime", return type = "255";</li>
    143      *            <li>type = "decimal(19,2)", return type = "19";</li>
    144      */
    145     protected String getValueByType(String type) {
    146         if (type.endsWith(")")) {
    147             type = type.substring(type.indexOf("(") + 1, type.length() - 1);
    148             if(type.contains(",")){
    149                 type = type.substring(0,type.indexOf(","));
    150             }
    151             return type;
    152         } else {
    153             return "255";
    154         }
    155     }
    156     
    157     /**
    158      * 获取十进位,默认为0
    159      * @param type 如:<code>varchar(20)</code>,<code>decimal(19,2)</code>,<code>datetime</code>,<code>double</code>,<code>longtext</code>
    160      * @return 结果:<br><li>type = "varchar(20)", return "0";</li>
    161      *            <li>type = "datetime", return type = "255";</li>
    162      *            <li>type = "decimal(19,2)", return type = "19";</li>
    163      */
    164     protected String getDecase(String type){
    165         if (type.endsWith(")")) {
    166             type = type.substring(type.indexOf("(") + 1, type.length() - 1);
    167             if(type.contains(",")){
    168                 type = type.substring(type.indexOf(",") + 1, type.length());
    169             }else{
    170                 type = "0";
    171             }
    172             return type;
    173         } else {
    174             return "0";
    175         }
    176     }
    177 
    178     
    179 /*    public static void main(String[] args) throws Exception {
    180         DBUtil dbUtil = new DBUtil();
    181         List<String> list = dbUtil.showTables();
    182         for (String str : list) {
    183             System.out.println(str);
    184             List<DescTableBean> listd = dbUtil.descTable(str);
    185             for(DescTableBean d : listd){
    186                 System.out.println(d.getField()+d.getLength()+d.getDecase()+d.getType()+d.getIsNull()+d.getKey()+d.getDefaultValue()+d.getExtra());
    187             }
    188         }
    189     }*/
    190 }

    /hibernate_reverse/src/com/b510/reverse/test/HibernateReverseTest.java

     1 /**
     2  * 
     3  */
     4 package com.b510.reverse.test;
     5 
     6 import java.util.List;
     7 
     8 import com.b510.db.util.DBUtil;
     9 import com.b510.velocity.util.DescTableBean;
    10 import com.b510.velocity.util.VelocityUtil;
    11 
    12 /**
    13  * 测试类,运行该类,在刷新一下项目,就可以获得我们的POJO类啦
    14  * @author Hongten
    15  * @date 2013-4-9
    16  */
    17 public class HibernateReverseTest {
    18     public static void main(String[] args) throws Exception {
    19         VelocityUtil velocityUtil = new VelocityUtil();
    20         DBUtil dbUtil = new DBUtil();
    21         List<String> list = dbUtil.showTables();
    22         for (String tableName : list) {
    23             System.out.println(tableName);
    24             List<DescTableBean> descTable = dbUtil.descTable(tableName);
    25             velocityUtil.generateBean(tableName, descTable);
    26         }
    27     }
    28 }

    /hibernate_reverse/src/com/b510/velocity/util/Annotation.java

     1 package com.b510.velocity.util;
     2 
     3 /**
     4  * 注释
     5  * 
     6  * @author hongten<br>
     7  * @date 2013-3-10
     8  */
     9 public class Annotation {
    10 
    11     /**
    12      * 作者名称
    13      */
    14     private String authorName;
    15     /**
    16      * 作者邮箱
    17      */
    18     private String authorMail;
    19     /**
    20      * 日期
    21      */
    22     private String date;
    23     /**
    24      * 版本
    25      */
    26     private String version;
    27 
    28     public String getAuthorName() {
    29         return authorName;
    30     }
    31 
    32     public void setAuthorName(String authorName) {
    33         this.authorName = authorName;
    34     }
    35 
    36     public String getAuthorMail() {
    37         return authorMail;
    38     }
    39 
    40     public void setAuthorMail(String authorMail) {
    41         this.authorMail = authorMail;
    42     }
    43 
    44     public String getDate() {
    45         return date;
    46     }
    47 
    48     public void setDate(String date) {
    49         this.date = date;
    50     }
    51 
    52     public String getVersion() {
    53         return version;
    54     }
    55 
    56     public void setVersion(String version) {
    57         this.version = version;
    58     }
    59 
    60 }

    /hibernate_reverse/src/com/b510/velocity/util/Bean.java

      1 package com.b510.velocity.util;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 /**
      7  * bean类
      8  * 
      9  * @author hongten<br>
     10  * @date 2013-3-10
     11  */
     12 @SuppressWarnings("rawtypes")
     13 public class Bean {
     14 
     15     /** bean 名称 */
     16     private String name;
     17     /** bean 首字母小写名称 */
     18     private String lowerName;
     19     /** bean 路径 */
     20     private String beanUrl;
     21     /** dao 路径 */
     22     private String beanDaoUrl;
     23     /** dao 实现路径 */
     24     private String beanDaoImplUrl;
     25     /** service 路径 */
     26     private String beanServiceUrl;
     27     /** service 实现路径 */
     28     private String beanServiceImplUrl;
     29     /** web Action 路径 */
     30     private String webActionUrl;
     31     /** web Admin Action 路径 */
     32     private String webAdminActionUrl;
     33 
     34     private List<Class> beanDaoList = new ArrayList<Class>();
     35     private List<Class> beanDaoImplList = new ArrayList<Class>();
     36     private List<Class> beanServiceList = new ArrayList<Class>();
     37     private List<Class> beanServiceImplList = new ArrayList<Class>();
     38 
     39     private static List<String> beanDaoUrlList = new ArrayList<String>();
     40     private static List<String> beanDaoImplUrlList = new ArrayList<String>();
     41     private static List<String> beanServiceUrlList = new ArrayList<String>();
     42     private static List<String> beanServiceImplUrlList = new ArrayList<String>();
     43 
     44     public String getName() {
     45         return name;
     46     }
     47 
     48     public void setName(String name) {
     49         this.name = name;
     50     }
     51 
     52     public String getLowerName() {
     53         return lowerName;
     54     }
     55 
     56     public void setLowerName(String lowerName) {
     57         this.lowerName = lowerName;
     58     }
     59 
     60     public String getBeanUrl() {
     61         return beanUrl;
     62     }
     63 
     64     public void setBeanUrl(String beanUrl) {
     65         this.beanUrl = beanUrl;
     66     }
     67 
     68     public String getBeanDaoUrl() {
     69         return beanDaoUrl;
     70     }
     71 
     72     public void setBeanDaoUrl(String beanDaoUrl) {
     73         this.beanDaoUrl = beanDaoUrl;
     74     }
     75 
     76     public String getBeanDaoImplUrl() {
     77         return beanDaoImplUrl;
     78     }
     79 
     80     public void setBeanDaoImplUrl(String beanDaoImplUrl) {
     81         this.beanDaoImplUrl = beanDaoImplUrl;
     82     }
     83 
     84     public String getBeanServiceUrl() {
     85         return beanServiceUrl;
     86     }
     87 
     88     public void setBeanServiceUrl(String beanServiceUrl) {
     89         this.beanServiceUrl = beanServiceUrl;
     90     }
     91 
     92     public String getBeanServiceImplUrl() {
     93         return beanServiceImplUrl;
     94     }
     95 
     96     public void setBeanServiceImplUrl(String beanServiceImplUrl) {
     97         this.beanServiceImplUrl = beanServiceImplUrl;
     98     }
     99 
    100     public String getWebActionUrl() {
    101         return webActionUrl;
    102     }
    103 
    104     public void setWebActionUrl(String webActionUrl) {
    105         this.webActionUrl = webActionUrl;
    106     }
    107 
    108     public List<Class> getBeanDaoList() {
    109         return beanDaoList;
    110     }
    111 
    112     public void setBeanDaoList(List<Class> beanDaoList) {
    113         this.beanDaoList = beanDaoList;
    114     }
    115 
    116     public List<Class> getBeanDaoImplList() {
    117         return beanDaoImplList;
    118     }
    119 
    120     public void setBeanDaoImplList(List<Class> beanDaoImplList) {
    121         this.beanDaoImplList = beanDaoImplList;
    122     }
    123 
    124     public List<Class> getBeanServiceList() {
    125         return beanServiceList;
    126     }
    127 
    128     public void setBeanServiceList(List<Class> beanServiceList) {
    129         this.beanServiceList = beanServiceList;
    130     }
    131 
    132     public List<Class> getBeanServiceImplList() {
    133         return beanServiceImplList;
    134     }
    135 
    136     public void setBeanServiceImplList(List<Class> beanServiceImplList) {
    137         this.beanServiceImplList = beanServiceImplList;
    138     }
    139 
    140     public static List<String> getBeanDaoUrlList() {
    141         return beanDaoUrlList;
    142     }
    143 
    144     public static void setBeanDaoUrlList(List<String> beanDaoUrlList) {
    145         Bean.beanDaoUrlList = beanDaoUrlList;
    146     }
    147 
    148     public static List<String> getBeanDaoImplUrlList() {
    149         return beanDaoImplUrlList;
    150     }
    151 
    152     public static void setBeanDaoImplUrlList(List<String> beanDaoImplUrlList) {
    153         Bean.beanDaoImplUrlList = beanDaoImplUrlList;
    154     }
    155 
    156     public static List<String> getBeanServiceUrlList() {
    157         return beanServiceUrlList;
    158     }
    159 
    160     public static void setBeanServiceUrlList(List<String> beanServiceUrlList) {
    161         Bean.beanServiceUrlList = beanServiceUrlList;
    162     }
    163 
    164     public static List<String> getBeanServiceImplUrlList() {
    165         return beanServiceImplUrlList;
    166     }
    167 
    168     public static void setBeanServiceImplUrlList(List<String> beanServiceImplUrlList) {
    169         Bean.beanServiceImplUrlList = beanServiceImplUrlList;
    170     }
    171 
    172     public String getWebAdminActionUrl() {
    173         return webAdminActionUrl;
    174     }
    175 
    176     public void setWebAdminActionUrl(String webAdminActionUrl) {
    177         this.webAdminActionUrl = webAdminActionUrl;
    178     }
    179 
    180 }

    /hibernate_reverse/src/com/b510/velocity/util/DescTableBean.java

      1 /**
      2  * 
      3  */
      4 package com.b510.velocity.util;
      5 
      6 /**
      7  * 在数据库中,我们可以用sql语句:"desc table_name",查询名称为:"table_name"的表的结构情况<br>
      8  * 这里就是
      9  * 
     10  * @author Hongten
     11  * @date 2013-4-9
     12  */
     13 public class DescTableBean {
     14 
     15     /**
     16      * id编号
     17      */
     18     private Integer id;
     19     /**
     20      * 属性,eg:<code>name</code>
     21      */
     22     private String field;
     23     /**
     24      * 类型,eg:<code>varchar</code>,<code>datetime</code>,<code>double</code>,<code>longtext</code>
     25      */
     26     private String type;
     27     /**
     28      * 长度,如果没有规定长度的,则默认为255
     29      */
     30     private Integer length = 255;
     31     /**
     32      * 十进位,默认为0,针对<code>decimal</code>
     33      */
     34     private Integer decase;
     35     /**
     36      * 是否为空,只有两个选择:YES,NO,eg:<code>YES</code>
     37      */
     38     private String isNull;
     39     /**
     40      * 是否为主键,如果为主键则, key = <code>PRI</code>,如果唯一,则 key = <code>UNI</code>
     41      * ,如果为外键,则 key = <code>MUL</code>
     42      */
     43     private String key;
     44     /**
     45      * 属性的默认值
     46      */
     47     private String defaultValue;
     48     /**
     49      * 其他选项,如一个表的id的增长方式为:auto_increment
     50      */
     51     private String extra;
     52 
     53     public Integer getId() {
     54         return id;
     55     }
     56 
     57     public void setId(Integer id) {
     58         this.id = id;
     59     }
     60 
     61     public String getField() {
     62         return field;
     63     }
     64 
     65     public void setField(String field) {
     66         this.field = field;
     67     }
     68 
     69     public String getType() {
     70         return type;
     71     }
     72 
     73     public void setType(String type) {
     74         this.type = type;
     75     }
     76 
     77     public Integer getLength() {
     78         return length;
     79     }
     80 
     81     public void setLength(Integer length) {
     82         this.length = length;
     83     }
     84 
     85     public String getIsNull() {
     86         return isNull;
     87     }
     88 
     89     public void setIsNull(String isNull) {
     90         this.isNull = isNull;
     91     }
     92 
     93     public String getKey() {
     94         return key;
     95     }
     96 
     97     public void setKey(String key) {
     98         this.key = key;
     99     }
    100 
    101     public String getDefaultValue() {
    102         return defaultValue;
    103     }
    104 
    105     public void setDefaultValue(String defaultValue) {
    106         this.defaultValue = defaultValue;
    107     }
    108 
    109     public String getExtra() {
    110         return extra;
    111     }
    112 
    113     public void setExtra(String extra) {
    114         this.extra = extra;
    115     }
    116 
    117     public Integer getDecase() {
    118         return decase;
    119     }
    120 
    121     public void setDecase(Integer decase) {
    122         this.decase = decase;
    123     }
    124 
    125 }

    /hibernate_reverse/src/com/b510/velocity/util/LoadProperties.java

     1 /**
     2  * 
     3  */
     4 package com.b510.velocity.util;
     5 
     6 import java.io.IOException;
     7 import java.io.InputStream;
     8 import java.util.Properties;
     9 
    10 import org.apache.log4j.Logger;
    11 
    12 /**
    13  * @author Hongten
    14  * @date 2013-4-9
    15  */
    16 public class LoadProperties {
    17 
    18     Logger log = Logger.getLogger(LoadProperties.class);
    19 
    20     private Properties prop = new Properties();
    21 
    22     public LoadProperties(String propertiesName) {
    23         prop = loadProperty(propertiesName);
    24     }
    25 
    26     /**
    27      * 载入配置文件
    28      * 
    29      * @return
    30      */
    31     public Properties loadProperty(String propertiesName) {
    32         try {
    33             if (propertiesName != null || !"".equals(propertiesName)) {
    34                 InputStream is = LoadProperties.class.getClassLoader().getResourceAsStream(propertiesName);
    35                 if (is == null) {
    36                     is = LoadProperties.class.getClassLoader().getResourceAsStream("/" + propertiesName);
    37                 }
    38                 prop.load(is);
    39                 is.close();
    40                 log.info("载入配置文件:[" + propertiesName + "]成功!");
    41             }
    42         } catch (IOException e) {
    43             log.error("载入配置文件:[" + propertiesName + "]失败!");
    44             e.printStackTrace();
    45         }
    46         return prop;
    47     }
    48 
    49     /**
    50      * 根据key值,获取key对应的value
    51      * 
    52      * @param key
    53      *            key值
    54      * @param defaultv
    55      *            key对应的value
    56      * @return
    57      */
    58     public String getValue(String key, String defaultv) {
    59         return prop.getProperty(key, defaultv);
    60     }
    61 
    62     /**
    63      * 根据key值,获取key对应的value
    64      * 
    65      * @param key
    66      *            key值
    67      * @return
    68      */
    69     public String getValue(String key) {
    70         return prop.getProperty(key);
    71     }
    72 
    73     public static void main(String[] args) {
    74         String proPath = "jdbc.cfg.properties";
    75         LoadProperties loadProperties = new LoadProperties(proPath);
    76         String value = loadProperties.getValue("ANNOTATION_AUTHOR_NAME");
    77         System.out.println(value);
    78     }
    79 
    80 }

    /hibernate_reverse/src/com/b510/velocity/util/VelocityUtil.java

      1 /**
      2  * 
      3  */
      4 package com.b510.velocity.util;
      5 
      6 import java.io.File;
      7 import java.io.FileWriter;
      8 import java.io.StringWriter;
      9 import java.text.SimpleDateFormat;
     10 import java.util.Date;
     11 import java.util.List;
     12 
     13 import org.apache.log4j.Logger;
     14 import org.apache.velocity.Template;
     15 import org.apache.velocity.VelocityContext;
     16 import org.apache.velocity.app.VelocityEngine;
     17 
     18 /**
     19  * 模板工具类,该类功能:<br>
     20  * <li>generateBean()生成java的POJO类</li>
     21  * <br>********************************************<br>
     22  * <code>bean.cfg.properties</code>为数据库的配置信息,默认位置是在项目src目录下面<br>
     23  * @author Hongten
     24  * @date 2013-4-9
     25  */
     26 public class VelocityUtil {
     27 
     28     Logger log = Logger.getLogger(VelocityUtil.class);
     29 
     30     // 载入bean配置
     31     // ===================================
     32     private static final String BEAN_CFG_PROPERTIES = "bean.cfg.properties";
     33     private static LoadProperties beanLoadProperties = new LoadProperties(BEAN_CFG_PROPERTIES);
     34 
     35     // BEAN PROPERTIES
     36     // ===================================
     37     Bean bean = new Bean();
     38     private static String BEAN_URL = beanLoadProperties.getValue("BEAN_URL");
     39     private static String BEAN_PATH = BEAN_URL.replace(".", "/");
     40 
     41     // ANNOTATION
     42     // ====================================
     43     private static Annotation annotation = new Annotation();
     44 
     45     /**
     46      * 读取配置文件,初始化信息
     47      */
     48     public VelocityUtil() {
     49         beanLoadProperties = beanLoadProperties == null ? new LoadProperties(BEAN_CFG_PROPERTIES) : beanLoadProperties;
     50         initAnnotation(beanLoadProperties);
     51     }
     52 
     53     /**
     54      * 初始化注释信息
     55      * 
     56      * @param beanLoadProperties
     57      *            加载配置
     58      */
     59     protected void initAnnotation(LoadProperties beanLoadProperties) {
     60         annotation.setAuthorName(beanLoadProperties.getValue("ANNOTATION_AUTHOR_NAME"));
     61         annotation.setAuthorMail(beanLoadProperties.getValue("ANNOTATION_AUTHOR_MAIL"));
     62         annotation.setVersion(beanLoadProperties.getValue("ANNOTATION_VERSION"));
     63         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
     64         annotation.setDate(simpleDateFormat.format(new Date()));
     65     }
     66 
     67     /**
     68      * 根据模板生成代码
     69      * 
     70      * @param fileVMPath
     71      *            模板路径
     72      * @param bean
     73      *            目标bean
     74      * @param annotation
     75      *            注释
     76      * @param descTable
     77      *            表描述
     78      * @return
     79      * @throws Exception
     80      */
     81     public String createCode(String fileVMPath, Bean bean, Annotation annotation, List<DescTableBean> descTable) throws Exception {
     82         VelocityEngine velocityEngine = new VelocityEngine();
     83         velocityEngine.setProperty("input.encoding", "UTF-8");
     84         velocityEngine.setProperty("output.encoding", "UTF-8");
     85         velocityEngine.init();
     86         Template template = velocityEngine.getTemplate(fileVMPath);
     87         VelocityContext velocityContext = new VelocityContext();
     88         velocityContext.put("bean", bean);
     89         velocityContext.put("annotation", annotation);
     90         velocityContext.put("descTable", descTable);
     91         StringWriter stringWriter = new StringWriter();
     92         template.merge(velocityContext, stringWriter);
     93         return stringWriter.toString();
     94     }
     95 
     96     /**
     97      * 生成java bean文件
     98      * 
     99      * @param tableName
    100      *            表名称,这里会映射成bean的名称
    101      * @param descTable
    102      *            表描述
    103      * @throws Exception
    104      */
    105     public void generateBean(String tableName, List<DescTableBean> descTable) throws Exception {
    106         if (descTable != null) {
    107             String path = System.getProperty("user.dir") + "/src/" + BEAN_PATH + "/";
    108             File filePath = new File(path);
    109             if (!filePath.exists()) {
    110                 filePath.mkdirs();
    111                 log.info("创建路径[" + path + "]成功!");
    112             }
    113             String fileName = path + handleTableName(tableName) + ".java";
    114             File file = new File(fileName);
    115             FileWriter fw = new FileWriter(file);
    116 
    117             bean.setName(handleTableName(tableName));
    118             bean.setBeanUrl(BEAN_URL);
    119             bean.setLowerName(tableName);
    120 
    121             fw.write(createCode(beanLoadProperties.getValue("BEAN_TEMPLATE_VM_PATH"), bean, annotation, descTable));
    122             fw.flush();
    123             fw.close();
    124         }
    125     }
    126 
    127     /**
    128      * 字符串处理
    129      * 
    130      * @param tableName
    131      *            需要被处理的字符串
    132      * @return <li>
    133      *         <code>tableName = "expert_user_admin"; <br>return "ExpertUserAdmin";</code>
    134      *         </li> <li><code>tableName = "expert"; <br>return "Expert";</code>
    135      *         </li>
    136      */
    137     protected String handleTableName(String tableName) {
    138         if (tableName.contains("_")) {
    139             String[] array = tableName.split("_");
    140             String temp = "";
    141             for (String str : array) {
    142                 temp = temp + str.substring(0, 1).toUpperCase() + str.substring(1);
    143             }
    144             return temp;
    145         } else {
    146             return tableName.substring(0, 1).toUpperCase() + tableName.substring(1);
    147         }
    148     }
    149 
    150     /*public static void main(String[] args) throws Exception{
    151         VelocityUtil velocityUtil = new VelocityUtil();
    152         DBUtil dbUtil = new DBUtil();
    153         List<String> list = dbUtil.showTables();
    154         for (String tableName : list) {
    155             System.out.println(tableName);
    156             List<DescTableBean> descTable = dbUtil.descTable(tableName);
    157             velocityUtil.generateBean(tableName, descTable);
    158         }
    159     }*/
    160 
    161 }

    /hibernate_reverse/src/vms/bean.vm

     1 package ${bean.beanUrl};
     2 
     3 import java.util.Date;
     4 import java.math.BigDecimal;
     5 
     6 import javax.persistence.Column;
     7 import javax.persistence.Entity;
     8 import javax.persistence.GeneratedValue;
     9 import javax.persistence.Id;
    10 import javax.persistence.Table;
    11 import javax.persistence.Temporal;
    12 import javax.persistence.TemporalType;
    13 
    14 /**
    15  * ${bean.name} 实体类
    16  * @author <a href="mailto:$!{annotation.authorMail}">$!{annotation.authorName}</a>
    17  * @date $!{annotation.date}
    18  *
    19  * @version $!{annotation.version}
    20  *
    21  */
    22 @Entity
    23 @Table(name = "${bean.lowerName}")
    24 public class ${bean.name} {
    25 
    26 #set($_int = "int")
    27 #set($_varchar = "varchar")
    28 #set($_datetime = "datetime")
    29 #set($_decimal = "decimal")
    30 #set($_tinyint = "tinyint")
    31 #set($_longtext = "longtext")
    32 ##foreach begin
    33 ##################################################
    34 #foreach ( $descTableBean in $descTable )
    35 #set($type = $descTableBean.type)
    36 ##处理int,转换为java.lang.Integer
    37 ##################################################
    38 #if($type == $_int)
    39     private Integer ${descTableBean.field};
    40 #end
    41 ##处理varchar,转换为java.lang.String
    42 ##################################################
    43 #if($type == $_varchar)
    44     private String ${descTableBean.field};
    45 #end
    46 ##处理datetime,转换为java.util.Date
    47 ##################################################
    48 #if($type == $_datetime)
    49     private Date ${descTableBean.field};
    50 #end
    51 ##处理decimal,转换为java.math.BigDecimal
    52 ##################################################
    53 #if($type == $_decimal)
    54     private BigDecimal ${descTableBean.field};
    55 #end
    56 ##处理longtext,转换为java.lang.String
    57 ##################################################
    58 #if($type == $_longtext)
    59     private String ${descTableBean.field};
    60 #end
    61 ##处理tinyint,转换为int
    62 ##################################################
    63 #if($type == $_tinyint)
    64     private int ${descTableBean.field};
    65 #end
    66 #end
    67 }

    /hibernate_reverse/src/bean.cfg.properties

     1 #########################################################
     2 ##  the template files path
     3 #########################################################
     4 #the bean template file path
     5 BEAN_TEMPLATE_VM_PATH = src/vms/bean.vm
     6 
     7     
     8 #########################################################
     9 ##  the packages
    10 #########################################################
    11 #the bean UniformResourceLocator
    12 BEAN_URL = com.b510.core.bean
    13 
    14 
    15 #########################################################
    16 ##  the annotation information
    17 #########################################################
    18 #the author's name in the annotation
    19 ANNOTATION_AUTHOR_NAME = hongten
    20 
    21 #the author's mail in the annotation
    22 ANNOTATION_AUTHOR_MAIL = hongtenzone@foxmail.com
    23 
    24 #the version of the program in the annotation
    25 ANNOTATION_VERSION = 1.0

    /hibernate_reverse/src/jdbc.cfg.properties

     1 #jdbc driver
     2 DB_DRIVER = com.mysql.jdbc.Driver
     3 
     4 #database name
     5 DB_NAME = mytest
     6 
     7 #jdbc chartacter encoding
     8 DB_CHARACTER_ENCODING = UTF-8
     9 
    10 #jdbc database port
    11 DB_PORT = 3306
    12 
    13 #jdbc url eg:<code>jdbc:mysql://localhost:3306/sample?characterEncoding=UTF-8</code>
    14 #DB_URL = jdbc:mysql://localhost:3306
    15 
    16 #jdbc user name
    17 DB_USER_NAME = root
    18 
    19 #jdbc password
    20 DB_PASSWORD = root

    /hibernate_reverse/src/log4j.properties

     1 log4j.appender.current=org.apache.log4j.ConsoleAppender
     2 log4j.appender.current.Target=System.out
     3 log4j.appender.current.layout=org.apache.log4j.PatternLayout
     4 log4j.appender.current.layout.ConversionPattern=[apple] %d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c:%L - %m%n
     5 
     6 log4j.appender.hongten.log=org.apache.log4j.DailyRollingFileAppender
     7 log4j.appender.hongten.log.File=E:\\log4j\\log4j-reverse
     8 log4j.appender.hongten.log.DatePattern='_'yyyy-MM-dd'.log'
     9 log4j.appender.hongten.log.layout=org.apache.log4j.PatternLayout 
    10 log4j.appender.hongten.log.layout.ConversionPattern=[apple] %d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c:%L - %m%n
    11 
    12 log4j.rootLogger=debug,current,hongten.log
    13 
    14 log4j.logger.org.hibernate.type=error

    所需Jar包:

    在“为大家提供一个完整的Hibernate Annotation项目_源码下载”中可以下载到hibernate相关jar文件;

    在“利用Velocity自动生成自定义代码_java版_源码下载”中可以下载到velocity的相关jar文件;

    源码下载https://files.cnblogs.com/hongten/hibernate_reverse.rar

  • 相关阅读:
    angular学习之通俗易懂篇-----constructor()与ngOnInit()
    vscode----快捷键
    angular学习之通俗易懂篇-----路由
    angular学习之通俗易懂篇-----双向数据绑定MVVM
    angular学习之通俗易懂篇-----数据绑定
    angular学习之通俗易懂篇-----新建组件并调用
    angular学习之-----常用命令行
    windows环境下node更新最新版本----简单粗暴
    首例爬虫禁令:法院裁定立即停止擅自爬取微信公众号相关数据行为取微信公众号相关数据行为
    Pycharm两种快速激活方式(附最新激活码和插件)
  • 原文地址:https://www.cnblogs.com/hongten/p/hongten_hibernate_reverse.html
Copyright © 2020-2023  润新知