- 浏览: 206000 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (397)
- j2se (28)
- nio (3)
- 易错点 (3)
- 面试ssh (9)
- ssh整合 (11)
- jbpm+spring (2)
- js (15)
- 高级技术 (59)
- swing (3)
- 数据库 (16)
- hibernate (18)
- spring (19)
- 开发网站知识点 (9)
- jbpm (4)
- json (5)
- 设计模式 (22)
- 自定义标签 (1)
- j2ee (9)
- lucene (3)
- cahce (11)
- maven (5)
- html5 (1)
- 多数据源 (10)
- 页面聊天 (9)
- 富客户端 (1)
- android (13)
- aop+拦截器+jms (13)
- 框架整合 (1)
- 非阻塞io (24)
- 暂时不看 (13)
- webservice (3)
- oracle (3)
- 算法 (4)
- 协程 (2)
- netty (1)
- 爬虫 (0)
- 高级基础 (1)
- JVM调优总结 (12)
- 知识点技巧 (1)
- REST (0)
- 基础 io (2)
- dubbo (8)
- 线程 (1)
- spring源码 (2)
- git (1)
- office (2)
最新评论
-
sjzcmlt:
,写的挺好的啊
一个完整的负载均衡的例子 . -
他大姨妈:
网上大部分例子都是直接通过IdleStateHandler来实 ...
Netty的超时机制 心跳机制
数据库反向生成实体类是dbdesigner的一个功能,现在很多开发工具也带有这样的功能。实现原理也很简单:先通过SQL语句获取所有数据库表,再通过SQL语句获取表的结构,最后根据表的字段信息生成相应的hibernate实体类。
本文的初步实现代码只考虑mysql 5.1版本,其它版本数据库暂不考虑。
获取所有表的SQl:
show tables
获取表字段信息的SQL有两种:
(1) SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM information_schema.columns WHERE table_name = 表名
(2) describe 表名
主要的实现代码如下
DBDao主要提供获取数据库表和表字段信息的方法
GenerateEntity主要是根据NodeProperty的内容,生成实体类。
NodeProperty记录xml节点的内容
下面看一下在dbdesigner的运行效果:
添加数据库连接
//生成的实体类效果
本文的初步实现代码只考虑mysql 5.1版本,其它版本数据库暂不考虑。
获取所有表的SQl:
show tables
获取表字段信息的SQL有两种:
(1) SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT FROM information_schema.columns WHERE table_name = 表名
(2) describe 表名
主要的实现代码如下
DBDao主要提供获取数据库表和表字段信息的方法
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.commons.dbutils.handlers.ArrayListHandler; import org.apache.commons.dbutils.handlers.MapListHandler; import org.dbdesigner.ui.component.ConnectDbDialog; import org.dbdesigner.ui.util.NodeProperty; public class DBDao { private NodeProperty conConfig; public DBDao(NodeProperty con) { this.conConfig = con; } private Connection getConnect() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException { String strDriver = conConfig.getProperty(ConnectDbDialog.PRO_DRIVER); String strUrl = "jdbc:mysql://" + conConfig.getProperty(ConnectDbDialog.PRO_SERVER) + ":" + conConfig.getProperty(ConnectDbDialog.PRO_PORT) + "/" + conConfig.getProperty(ConnectDbDialog.PRO_DATABASE); String strUser = conConfig.getProperty(ConnectDbDialog.PRO_USER); String strPass = conConfig.getProperty(ConnectDbDialog.PRO_PSW); Class.forName(strDriver).newInstance(); return DriverManager.getConnection(strUrl, strUser, strPass); } /** *//** * 获取所有数据表 */ public ArrayList getAllTable() { ArrayList result = null; Connection con = null; try { con = getConnect(); QueryRunner qr = new QueryRunner(); ResultSetHandler rsh = new ArrayListHandler(); String strsql = "show tables"; //show tables为mysql获取所有表的方法 result = qr.query(con, strsql, rsh); // for (int i = 0; i < result.size(); i++) { // System.out.println(((Object[]) result.get(i))[0]); // } } catch (Exception ex) { ex.printStackTrace(System.out); } finally { try { DbUtils.close(con); } catch (Exception ex) { } } return result; } /** *//** * 获取指定表的字段信息 * @param t 表名 */ public NodeProperty getTableDescribe(String t) { Connection con = null; NodeProperty table = NodeProperty.getInstance(NodeProperty.NODE_TABLE); table.addProperty(NodeProperty.PROPERTY_NAME, t); try { con = getConnect(); QueryRunner qr = new QueryRunner(); String strsql = "describe " + t; List results = qr.query(con, strsql, new MapListHandler()); NodeProperty columns = NodeProperty .getInstance(NodeProperty.NODE_COLUMNS); table.addChild(columns); for (int i = 0; i < results.size(); i++) { NodeProperty column = NodeProperty .getInstance(NodeProperty.NODE_COLUMN); Map map = (Map) results.get(i); String name = map.get("COLUMN_NAME").toString(); String key = map.get("COLUMN_KEY").toString(); String isKey = key.equals("PRI") ? "true" : "false"; String nullable = map.get("IS_NULLABLE").toString(); boolean isNullable = nullable.equals("YES") ? true : false; String type = map.get("COLUMN_TYPE").toString(); String unsigned = "false"; int index = type.indexOf("unsigned"); if(index > 0){ unsigned = "true"; type = type.substring(0, index - 1); } column.addProperty(NodeProperty.PROPERTY_NAME, name); column.addProperty(NodeProperty.PROPERTY_COMMENT, name); column.addProperty(NodeProperty.PROPERTY_PRIMARYKEY, isKey); column.addProperty(NodeProperty.PROPERTY_UNSIGNED, unsigned); column.addProperty(NodeProperty.PROPERTY_DATATYPE, type); columns.addChild(column); } } catch (Exception ex) { ex.printStackTrace(System.out); } finally { try { DbUtils.close(con); } catch (Exception ex) { } } return table; } }
GenerateEntity主要是根据NodeProperty的内容,生成实体类。
import java.util.List; import org.dbdesigner.db.MySqlDataType; import org.dbdesigner.ui.component.DBGraphComponent; import org.dbdesigner.ui.util.NodeProperty; import org.dbdesigner.utils.FileUtil; import org.dbdesigner.utils.StringUtil; public class GenerateEntity { private String filePath = null; private String packageName = null; public GenerateEntity(String filePath, String packageName, DBGraphComponent graphComponent){ this.filePath = filePath; this.packageName = packageName; } //根据DBDao.getTableDescribe(String t)方法返回的NodeProperty内容,生成相应的实体类 public void NodeToEntity(NodeProperty node){ StringBuilder sr = new StringBuilder(); StringBuilder declareSr = new StringBuilder(); StringBuilder methodSr = new StringBuilder(); String tableName = node.getProperty(NodeProperty.PROPERTY_NAME); String uTableName = StringUtil.upperFirst(tableName); if(StringUtil.isEmpty(packageName) == false){ sr.append("package ").append(packageName).append("\n"); } //添加引用包 sr.append("import java.io.Serializable;\n"); sr.append("import javax.persistence.*;\n"); NodeProperty columns = node.getChildByType(NodeProperty.NODE_COLUMNS); if(columns != null){ List<NodeProperty> list = columns.getChild(); if(list.size() > 0){ for(NodeProperty column:list){ String dataType =column.getProperty(NodeProperty.PROPERTY_DATATYPE); if(dataType != null){ String type = dataType.toLowerCase(); if(type.equals("date") || type.equals("datetime")){ sr.append("import java.util.Date;\n"); } } //声明 generateDeclare(declareSr, column, dataType); //方法 generateMethod(methodSr, column, dataType); } } } /**//*输出类名*/ sr.append("\n"); sr.append("@Entity\n"); sr.append("@Table(name =\"").append(tableName) .append("\")\n"); sr.append("public class ").append(uTableName).append( " implements Serializable {\n"); sr.append("\tprivate static final long serialVersionUID = 1L;\n"); sr.append("\n"); /**//*输出声明*/ sr.append(declareSr.toString()); /**//*输出方法*/ sr.append(methodSr.toString()); sr.append("}\n"); sr.append("\n"); try{ FileUtil.save(filePath + FileUtil.sp + uTableName + ".java", sr.toString().getBytes()); } catch(Exception e){ System.out.println("生成实体类出错!"); e.printStackTrace(); } } //生成字段声明内容 public void generateDeclare(StringBuilder deSr, NodeProperty column, String dataType){ int start = dataType.indexOf("("); int end = dataType.indexOf(")"); String type = dataType; String lenght = ""; if(start > 0 && end > 0){ type = dataType.substring(0, start); lenght = dataType.substring(start + 1, dataType.length() - 1); } String primaryKey = column.getProperty(NodeProperty.PROPERTY_PRIMARYKEY); if(primaryKey != null && primaryKey.equals("true")){ deSr.append("\t@Id\n"); } deSr.append("\t@Column(name =\"").append(column.getProperty(NodeProperty.PROPERTY_NAME)).append("\""); if (type.equals("varchar") || type.equals("char")) { deSr.append(", length=").append(lenght); } deSr.append(")\n"); if (type.equals("date") || type.equals("datetime")) { deSr.append("\t@Temporal(TemporalType.TIMESTAMP)\n"); } deSr.append("\tprivate ").append(MySqlDataType.get(type)).append(" ").append(column.getProperty(NodeProperty.PROPERTY_NAME)).append(";\n"); deSr.append("\n"); } //生成字段的setter、getter方法 public void generateMethod(StringBuilder deSr, NodeProperty column, String dataType){ String name = column.getProperty(NodeProperty.PROPERTY_NAME); String upperName = StringUtil.upperFirst(name); int start = dataType.indexOf("("); if(start > 0){ dataType = dataType.substring(0, start); } String type = MySqlDataType.get(dataType) != null ? MySqlDataType.get(dataType) : dataType; deSr.append("\tpublic ").append(type).append(" ").append( "boolean".equals(dataType) ? "is" : "get").append(upperName) .append("() {\n"); deSr.append("\t\treturn ").append(name).append(";\n"); deSr.append("\t}\n"); deSr.append("\n"); deSr.append("\tpublic void set").append(upperName).append("(").append(type) .append(" ").append(name).append(") {\n"); deSr.append("\t\tthis.").append(name).append(" = ").append(name) .append(";\n"); deSr.append("\t}\n"); deSr.append("\n"); } }
NodeProperty记录xml节点的内容
import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Hashtable; /** *//** * 记录xml内容的java类 */ public class NodeProperty implements Serializable { public static final String NODE_TABLE = "Table"; public static final String NODE_COLUMNS = "Columns"; public static final String NODE_COLUMN = "Column"; public static final String PROPERTY_NAME = "Name"; public static final String PROPERTY_ID = "Id"; public static final String PROPERTY_DESCRIPT = "Descript"; public static final String PROPERTY_G = "G"; public static final String PROPERTY_P = "P"; public static final String PROPERTY_COMMENT = "Comment"; public static final String PROPERTY_DATATYPE = "DataType"; public static final String PROPERTY_MANDATORY = "Mandatory"; public static final String PROPERTY_UNSIGNED = "Unsigned"; public static final String PROPERTY_PRIMARYKEY = "isPrimaryKey"; public static final String PROPERTY_LENGTH = "Length"; private String type = null; private List<NodeProperty> child = null; private Map<String, String> property = null; private String value = null; private NodeProperty() { this.child = new ArrayList<NodeProperty>(); this.property = new Hashtable<String, String>(); } public void addChild(NodeProperty fp) { child.add(fp); } public List<NodeProperty> getChild() { return child; } public void addProperty(String key, String value) { property.put(key, value); } public String getProperty(String key) { return property.get(key); } public static NodeProperty getInstance(String type) { NodeProperty xml = new NodeProperty(); xml.setType(type); return xml; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String toXML() { StringBuilder sb = new StringBuilder(); sb.append("<").append(type); Iterator<Entry<String, String>> it = property.entrySet().iterator(); while (it.hasNext()) { sb.append(" "); Entry<String, String> e = it.next(); sb.append(e.getKey()).append("=\"").append(e.getValue()) .append("\""); } if (child.size() > 0) { sb.append(">\n"); for (NodeProperty node : child) { sb.append(node.toXML()); } sb.append("\n</").append(type).append(">"); } else { sb.append(" />"); } return sb.toString(); } /** *//** * 获取当前节点中指定类型的子节点 * @param type * @return */ public NodeProperty getChildByType(String type) { NodeProperty result = null; if (this.child.size() > 0) { for (NodeProperty np : child) { if (np.getType().equals(type)) { result = np; } } } return result; } public void removeChild() { if (child.size() > 0) { int size = child.size(); for (int i = 0; i < size; i++) { child.remove(0); } } } public String toString() { return this.getProperty(PROPERTY_NAME) == null ? "" : getProperty(PROPERTY_NAME); } }
下面看一下在dbdesigner的运行效果:
添加数据库连接
//生成的实体类效果
package com.penngo.model; import java.io.Serializable; import javax.persistence.*; import java.math.BigInteger; @Entity @Table(name ="jbpm4_deployment") public class Jbpm4_deployment implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name ="DBID_") private BigInteger dbid_; @Column(name ="NAME_") private String name_; @Column(name ="TIMESTAMP_") private BigInteger timestamp_; @Column(name ="STATE_", length=255) private String state_; public BigInteger getDbid_() { return dbid_; } public void setDbid_(BigInteger dbid_) { this.dbid_ = dbid_; } public String getName_() { return name_; } public void setName_(String name_) { this.name_ = name_; } public BigInteger getTimestamp_() { return timestamp_; } public void setTimestamp_(BigInteger timestamp_) { this.timestamp_ = timestamp_; } public String getState_() { return state_; } public void setState_(String state_) { this.state_ = state_; } }
发表评论
-
WebLogic11g-单双向SSL配置(以Springside3为例)
2016-03-27 09:45 5312、观察weblogic方便开发部署提供的演示秘钥库 ... -
WebLogic11g-半小时让你的domain集群化
2016-03-27 09:39 692其实网上关于weblogic集群的资料非常多【大 ... -
解决nginx负载均衡的session共享问题
2016-03-27 09:29 448查了一些资料,看了一些别人写的文档,总结如下,实现ngin ... -
JProfiler学习笔记
2016-03-20 10:36 439JProfiler学习笔记 一、安装JProfile ... -
使用阻塞式队列处理大数据 excel
2016-03-20 11:05 649前言 我们都知道,JAVA对于文本文件在读时是独占的,即 ... -
RMI是什么
2016-03-14 10:21 594(14) RM ... -
Java 高并发缓存与Guava Cache
2016-03-13 21:59 762一.背景 缓存是我们在开发中为了提高系统 ... -
Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
2016-03-13 21:13 433互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无 ... -
轻量级分布式 RPC 框架
2016-03-13 15:31 450目录[-] 第一步 ... -
exe4j 可以很容易吧一个 jar 打包成 exe
2015-11-02 19:45 0一、背景 exe4j 可以很容易吧一个 jar 打包 ... -
如何预估服务器带宽需求【转】
2015-06-07 13:35 628PC=PV/T*C*t*f其中,PC是并发数,T是观测时间 ... -
年终培训关于磁盘冗余阵列、热备、群集、负载均衡、云计算、F5、Nginx等的概念和基本原理
2015-06-07 12:52 508在系统部署实施过程中,客户往往会关注系统的可用性方 ... -
年终知识分享——大型项目架构
2015-06-07 12:25 483... -
分布式缓存服务器设计原理
2015-06-07 11:48 7331.数据是如何被分布到多个服务器上的?(一致性哈希算法) ... -
Apache2.2.x+Tomcat6.x+jk2.x做集群配置
2014-10-18 10:43 420【Middleware】☆★之Apac ... -
单点登录SSO
2014-10-22 21:34 497摘要 :单点登录( ... -
java批量处理数据
2014-06-08 13:51 658程序清单ImproveReadFile .java ... -
大型网站技术架构
2014-06-06 09:38 588看完了有一本书,就 ... -
关于敏捷开发的总结 .
2014-06-06 09:38 398•用例一完全能够运行后再开发用例二。厨房里有一种说法正好可以印 ... -
应聘java项目经理经常遇到的问题
2014-06-06 09:38 612司最近招项目经理,我负责一面。下面是我面试的部分问题,有些问题 ...
相关推荐
idea配置数据库,反向生成实体类demo,支持lombok,swagger2注解
有图解说明,直观学习,同学们可以对着图解进行操作
文章http://www.blogjava.net/pengo/archive/2011/04/30/349310.html的附件
mybatis逆向从数据库生成实体类
因为.net core不能一键生成EF数据结构,所以做了个数据库实体类代码生成器,一键生成数据库所有表的实体类,代码可以参考,特殊需求可以自己改
按照说明配置xml文件 ,执行GeneratorSqlmap中主方法即可
获取数据库的表结构 ,从而反向生成javaBean
eclipse从数据库逆向生成Hibernate实体类
eclipse中,由数据库反向生成hibernate实体类.pdf
Eclipse使用hibernate插件反向生成数据库实体类,亲身操作,绝对真实有效
根据数据库自动生成JAVA代码 实体类 dao service controller jsp html 模版
由于项目中模块功能废弃,因此删除了相关数据表结构,且不能恢复,没有备份,只有代码里的实体类,所以用此项目直接将实体类在数据库中生成对应的表结构,仅需配置你的数据库地址即可运行
将数据库里面所需要的表,通过工具生成所需要的实体类与映射文件
下载解压至相应的盘符,打开generatorConfig.xml修改数据库连接信息等相关配置保存后,win+R调起cmd命令,进入解压后的盘符目录,我的是F盘,...overwrite 命令即可生成数据库表对应的实体类,dao以及相应的mapper文件
由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。
由JAVA的实体类反生成数据库表。
主要介绍了Intellij IDEA 如何通过数据库表生成带注解的实体类(图文详细教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
mybatis反向生成工具,可以将数据库表反向生成对应的实体类和工具类,xml配置
hibernate利用配置文件,实体关系数据库映射文件及数据库配置相关文件) 反向生成数据库所有配置文件, 及其所需的几个文件所有详细代码
Mybatis-Generator反向生成工具包,可以将数据库表反向生成对应的实体类和工具类,xml配置