在这篇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文件;

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

模仿Hibernate的逆向工程_java版_源码下载相关推荐

  1. 爱发php企业发卡网源码_PHP最新企业级自动发卡平台网站源码完整商业版_源码下载...

    源码介绍 PHP环境: php 5.X MySQL环境 :mysql 5.6 服务器需开启伪静态 支付接口相关设置: 微信接口: 登陆后台-> 通道管理->接入信息->设置微信公众支 ...

  2. FreeMarker_模板引擎_代码自动生成器_源码下载

    首先我们先来认识一下Freemarker 1.what is the FreeMarker? 你可以到freemarker的官网上去,那里有很详细的介绍:http://freemarker.org/ ...

  3. QT_文本编辑器_源码下载

    QT_文本编辑器_源码下载 源码下载: 链接: http://pan.baidu.com/s/1c21EVRy 密码: qub8 实现主要的功能有:新建,打开,保存,另存为,查找(查找的时候需要先将光 ...

  4. 纯java版QQ源码下载

    纯java版QQ源码下载http://url.cn/7Mjy4P 郑重声明:(可先到华为网盘去看<java至尊QQ演示视频>) 因网盘不稳定,下载不了的话,请点击这里回贴留邮箱. 本人每天 ...

  5. lucene(全文搜索)_建立索引_根据关键字全文搜索_源码下载

    项目结构: 效果图: 需要建立索引的文件(我们需要从中查找出关键字的文档) 建立好的所有文件 搜索关键字"lucene"信息 大家是不是也想亲自动手尝试一下呢... ======= ...

  6. Java绘画板源码_Java 绘图板 示例源码下载(画板)

    Java 绘图板 示例源码下载(画板) java 2020-8-21 下载地址 https://www.codedown123.com/36795.html package minidrawpad; ...

  7. 友价商城不支持php5.3_PHP友价T5商城源码 UC论坛整合送手机版程序七套模板_源码下载...

    源码介绍 程序说明: 1.程序完美无错所有支付功能,全部可使用QQ登录,等等大家购买之前,先打开测试网站详细测试满意再拍一旦出售,不接受退货. 2,无需填写微信支付授权目录直接把微信商务号放在网站后台 ...

  8. 【自然框架】稳定版beta1——源码下载,Demo说明

    在线演示:http://demo.naturefw.com/ 开源协议 一直想说来着,可是总忘.开源协议采用 BSD开源协议. 一直在说开源,但只是把源码放出来了,连个开源协议都没说,虽然说了也基本等 ...

  9. java源码游戏包_Java 升级游戏源码下载

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 return tmp.getColorType()==getColorType() &&tmp.getColorValue()==getC ...

最新文章

  1. 3. nginx的请求转发算法,如何配置根据权重转发
  2. 【SVN】版本冲突处理之设置needs-lock:true属性
  3. [置顶] NoSQl mongodb数据库 配置篇
  4. Android中网络请求创建单个线程池的方法
  5. [翻译] 比较 Node.js,Python,Java,C# 和 Go 的 AWS Lambda 性能
  6. 2020研究生数学建模结果_关于举办2020年全国研究生数学建模大赛的通知
  7. 使用CUBA进行开发–是Spring的重大转变吗?
  8. 雅虎yql_从RSS Feed和YQL创建数据表
  9. python datetime to timestamp_python timestamp和datetime之间转换详解
  10. java设置方块阴影_边框阴影:box-shadow属性
  11. jenkins 手动执行_Jenkins环境配置篇-节点增加
  12. tensorflow2.0 图像处理项目_UCOSIII移植——STM32F769I 图像处理能力评测之五
  13. Linux 常用命令学习-文件及文件夹操作相关命令-持续更新
  14. 【转载】身份证号码验证算法
  15. 大脑是如何塑造你的感觉?
  16. pulseaudio 播放卡顿的解决方法
  17. 森林防火火灾漫延算法 火灾推演算法分析 火灾蔓延范围计算方法 森林火灾边界漫延计算方法
  18. HDU 1567(2006)
  19. 终于解决!——iPhone自带的邮件应用如何绑定163网易邮箱?
  20. java中关于包的描述_下列关于Java包的描述中,错误的是() (1.0分)_学小易找答案

热门文章

  1. c语言c++语言中静态变量,函数详解
  2. SpringBoot之集成swagger2
  3. 两道面试题,带你解析Java类加载机制
  4. Linux基础知识入门测试
  5. Rancher部署Traefik实现微服务的快速发现
  6. Codeforces 396A 数论,组合数学
  7. 新浪微博中的周期性爆发流量
  8. TypeKit ,use online fonts
  9. Rhel6-heartbeat配置文档
  10. android interview 1