zoukankan      html  css  js  c++  java
  • 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个人的观点以及见解,如果有说的不好,或说错的地方,欢迎大家拍砖....

  • 相关阅读:
    k3 cloud点击按钮单开单据
    k3 cloud _LK表字段代表的意思
    sql server根据触发器名称查看代码
    sql server中查询所有触发器已经对应的表名称
    面向架构编程
    领域设计:领域事件
    QApplication: No such file or directory 完美解决方案
    C++ GUI Qt4编程(第二版) 源代码 下载
    ArcMap进行天空开阔度(SVF)分析
    wpf 高性能自定义chart
  • 原文地址:https://www.cnblogs.com/hongten/p/hongten_hibernate_person.html
Copyright © 2011-2022 走看看