Hibernate逆向工程原理_java版本
之前在一篇"Hibernate 逆向工程生成POJO类和映射文件"文章中,一位朋友提出了这样的问题:
源地址:http://www.cnblogs.com/hongten/archive/2011/07/08/2101481.html#2637768
这几天闲着没事儿,就想了一下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个人的观点以及见解,如果有说的不好,或说错的地方,欢迎大家拍砖....