之前在一篇"Hibernate 逆向工程生成POJO类和映射文件"文章中,一位朋友提出了这样的问题:
源地址:
这几天闲着没事儿,就想了一下hibernate的逆向工程的实现原理。
这是我个人构思的想法:
1.我们在数据库中建立一个我们自己的表;
如:
1 CREATE TABLE `person` (
2 `id` int(11) NOT NULL AUTO_INCREMENT,
3 `name` varchar(20) COLLATE utf8_bin NOT NULL,
4 `age` int(11) DEFAULT NULL,
5 `sex` varchar(2) COLLATE utf8_bin DEFAULT NULL,
6 PRIMARY KEY (`id`)
7 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
创建后的表结构如:
2,我们在数据库控制台用“desc person”可以查看person表的结构:
3.我们用代码实现这样的查询功能:
代码如下:
1 /**
2 *
3 */
4 package com.b510;
5
6 import java.sql.Connection;
7 import java.sql.DriverManager;
8 import java.sql.PreparedStatement;
9 import java.sql.ResultSet;
10 import java.sql.SQLException;
11
12 /**
13 *
14 * @author hongten
15 * @date 2013-3-22
16 */
17 public class JDBCTest {
18 public static void main(String[] args) {
19 String driver = "com.mysql.jdbc.Driver";
20 String dbName = "spring";
21 String passwrod = "root";
22 String userName = "root";
23 String url = "jdbc:mysql://localhost:3308/" + dbName;
24 String sql = "desc person";
25
26 try {
27 Class.forName(driver);
28 Connection conn = DriverManager.getConnection(url, userName,
29 passwrod);
30 PreparedStatement ps = conn.prepareStatement(sql);
31 ResultSet rs = ps.executeQuery();
32 System.out.println(" Field Type Null Key Default Extra");
33 while (rs.next()) {
34 System.out.println("--------------------------------------------");
35 System.out.println(" "+rs.getString(1) +" "+ rs.getString(2) +" "+ rs.getString(3) +" "+ rs.getString(4) +" "+ rs.getString(5) +" "+ rs.getString(6) );
36 }
37
38 // 关闭记录集
39 if (rs != null) {
40 try {
41 rs.close();
42 } catch (SQLException e) {
43 e.printStackTrace();
44 }
45 }
46
47 // 关闭声明
48 if (ps != null) {
49 try {
50 ps.close();
51 } catch (SQLException e) {
52 e.printStackTrace();
53 }
54 }
55
56 // 关闭链接对象
57 if (conn != null) {
58 try {
59 conn.close();
60 } catch (SQLException e) {
61 e.printStackTrace();
62 }
63 }
64
65 } catch (Exception e) {
66 e.printStackTrace();
67 }
68 }
69
70 }
运行效果:
可以发现,运行出来的效果和我们在控制台运行的效果是一样的。所以我们可以用代码实现获取表结构,这一步尤为关键!!!
4.我们可以用代码获取表的结构,那么我们就可以知道一个表的所有信息,如:
表里面的所有字段,字段的类型,长度,是否为空,是否为主键....很多信息,我们可以提取其中有用的信息,我们只要在freemarker
或velocity模板引擎中创建好我们的模板这样打工就可以告成...
5.使用freemaker或者velocity模板引擎制作模板的时候,我想在生成表对应的实体类和xml配置文件的时候需要注意的是表与表的关联关系....
上面的观点都是Hongten个人的观点以及见解,如果有说的不好,或说错的地方,欢迎大家拍砖....