模仿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

原文地址:https://www.cnblogs.com/hongten/p/hongten_hibernate_reverse.html