之前在一篇"Hibernate 逆向工程生成POJO类和映射文件"文章中,一位朋友提出了这样的问题:

Hibernate逆向工程原理_java版本_sql

源地址:

这几天闲着没事儿,就想了一下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;



创建后的表结构如:

Hibernate逆向工程原理_java版本_数据库_02

2,我们在数据库控制台用“desc person”可以查看person表的结构:

Hibernate逆向工程原理_java版本_System_03

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 }



运行效果:

Hibernate逆向工程原理_java版本_sql_04

可以发现,运行出来的效果和我们在控制台运行的效果是一样的。所以我们可以用代码实现获取表结构,这一步尤为关键!!!

4.我们可以用代码获取表的结构,那么我们就可以知道一个表的所有信息,如:

表里面的所有字段,字段的类型,长度,是否为空,是否为主键....很多信息,我们可以提取其中有用的信息,我们只要在freemarker

或velocity模板引擎中创建好我们的模板这样打工就可以告成...

5.使用freemaker或者velocity模板引擎制作模板的时候,我想在生成表对应的实体类和xml配置文件的时候需要注意的是表与表的关联关系....

上面的观点都是Hongten个人的观点以及见解,如果有说的不好,或说错的地方,欢迎大家拍砖....