`

java 数据库表反向生成相应的java类

    博客分类:
  • Java
阅读更多

 java 数据库表反向生成相应的java类,同时完成了字段和表名中包含下划线的情况。

 
package cn.tongkuan.common;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

 
public class TableToJavaBean {

	private static final String LINE = "\r\n";
	private static final String TAB = "\t";
	String packages = this.getClass().getPackage().getName().replace("common", "model");;
	private static Map<String, String> map;

	static {
		map = new HashMap<String, String>();
		map.put("VARCHAR", "String");
		map.put("INTEGER", "Integer");
		map.put("FLOAT", "float");
		map.put("TIMESTAMP", "Date");
		map.put("CHAR", "String");
		map.put("DATETIME", "Date");
		map.put("TIMESTAMP_IMPORT", "import java.util.Date");
		map.put("DATETIME_IMPORT","import java.util.Date");
	}

	public static String getPojoType(String dataType) {
		StringTokenizer st = new StringTokenizer(dataType);
		return map.get(st.nextToken());
	}
	
	public static String getImport(String dataType) {
		if (map.get(dataType)==null||"".equals(map.get(dataType))) {
		   return null;	
		}else{
		   return map.get(dataType);
		}
	}

 
	public void tableToBean(Connection connection, String tableName) throws SQLException {
		String sql = "select * from " + tableName + " where 1 <> 1";
		PreparedStatement ps = null;
		ResultSet rs = null;
		ps = connection.prepareStatement(sql);
		rs = ps.executeQuery();
		ResultSetMetaData md = rs.getMetaData();
		int columnCount = md.getColumnCount();
		StringBuffer sb = new StringBuffer();
		tableName = tableName.substring(0, 1).toUpperCase() + tableName.subSequence(1, tableName.length());
		tableName = this.dealLine(tableName);
		sb.append("package " + this.packages + " ;");
		sb.append(LINE);
		importPackage(md, columnCount, sb);
		sb.append(LINE);
		sb.append(LINE);
		sb.append("public class " + tableName + " {");
		sb.append(LINE);
		defProperty(md, columnCount, sb);
		genSetGet(md, columnCount, sb);
		sb.append("}");
		String paths = System.getProperty("user.dir");
		String endPath = paths + "\\src\\" + (packages.replace("/", "\\")).replace(".", "\\");
		buildJavaFile(endPath + "\\" + tableName + ".java", sb.toString());
	}
	//属性生成get、 set 方法
	private void genSetGet(ResultSetMetaData md, int columnCount, StringBuffer sb) throws SQLException {
		for (int i = 1; i <= columnCount; i++) {
			sb.append(TAB);
			String pojoType = getPojoType(md.getColumnTypeName(i));
			String columnName = dealLine(md, i);
			String getName = null;
			String setName = null;
			if (columnName.length() > 1) {
				getName = "public " + pojoType + " get" + columnName.substring(0, 1).toUpperCase()
						+ columnName.substring(1, columnName.length()) + "() {";
				setName = "public void set" + columnName.substring(0, 1).toUpperCase()
						+ columnName.substring(1, columnName.length()) + "(" + pojoType + " " + columnName + ") {";
			} else {
				getName = "public get" + columnName.toUpperCase() + "() {";
				setName = "public set" + columnName.toUpperCase() + "(" + pojoType + " " + columnName + ") {";
			}
			sb.append(LINE).append(TAB).append(getName);
			sb.append(LINE).append(TAB).append(TAB);
			sb.append("return " + columnName + ";");
			sb.append(LINE).append(TAB).append("}");
			sb.append(LINE);
			sb.append(LINE).append(TAB).append(setName);
			sb.append(LINE).append(TAB).append(TAB);
			sb.append("this." + columnName + " = " + columnName + ";");
			sb.append(LINE).append(TAB).append("}");
			sb.append(LINE);

		}
	}
	
	//导入属性所需包
	private void importPackage(ResultSetMetaData md, int columnCount, StringBuffer sb) throws SQLException {
		for (int i = 1; i <= columnCount; i++) {
			String im=getImport(md.getColumnTypeName(i)+"_IMPORT");
			if (im!=null) {
				sb.append(im+ ";");
				sb.append(LINE);
			}
		}
	}
	//属性定义
	private void defProperty(ResultSetMetaData md, int columnCount, StringBuffer sb) throws SQLException {
		
		for (int i = 1; i <= columnCount; i++) {
			sb.append(TAB);
			String columnName = dealLine(md, i);
			sb.append("private " + getPojoType(md.getColumnTypeName(i)) + " " + columnName + ";");
			sb.append(LINE);
		}
	}

	private String dealLine(ResultSetMetaData md, int i) throws SQLException {
		String columnName = md.getColumnName(i);
		// 处理下划线情况,把下划线后一位的字母变大写;
		columnName = dealName(columnName);
		return columnName;
	}

	private String dealLine(String tableName) {
		// 处理下划线情况,把下划线后一位的字母变大写;
		tableName = dealName(tableName);
		return tableName;
	}
	//下划线后一位字母大写
	private String dealName(String columnName) {
		if (columnName.contains("_")) {
			StringBuffer names = new StringBuffer();
			String arrayName[] = columnName.split("_");
			names.append(arrayName[0]);
			for (int i = 1; i < arrayName.length; i++) {
				String arri=arrayName[i];
				String tmp=arri.substring(0, 1).toUpperCase()+ arri.substring(1, arri.length());
				names.append(tmp);
			}
			columnName=names.toString();
		}
		return columnName;
	}
	//生成java文件
	public void buildJavaFile(String filePath, String fileContent) {
		try {
			File file = new File(filePath);
			FileOutputStream osw = new FileOutputStream(file);
			PrintWriter pw = new PrintWriter(osw);
			pw.println(fileContent);
			pw.close();
		} catch (Exception e) {
			System.out.println("生成txt文件出错:" + e.getMessage());
		}
	}

	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		String jdbcString = "jdbc:mysql://192.168.224.1/test";
		Class.forName("com.mysql.jdbc.Driver");
		Connection con = DriverManager.getConnection(jdbcString, "root", "root");
		DatabaseMetaData databaseMetaData = con.getMetaData();
		String[] tableType = { "TABLE" };
		ResultSet rs = databaseMetaData.getTables(null, null, "%",tableType);
		TableToJavaBean d = new TableToJavaBean();
		while(rs.next()){
			String tableName=rs.getString(3).toString();
			d.tableToBean(con,tableName);
		}
	}
}
 
2
1
分享到:
评论
3 楼 杰克穷死s 2013-11-10  
还不错,用了,哈,那个好像数据库是int 类型的话,生成的类属性是null的。在静态块里加上int就行了,真是太好用了。
2 楼 不念书的小子 2013-01-08  
冷剑豪 写道
嘿嘿嘿,把你的这部分偷走了,做了一个数据库自动生成实体类的工具类,谢谢哈!不过你的这个有好多地方需要改进呢!

1 楼 冷剑豪 2012-12-28  
嘿嘿嘿,把你的这部分偷走了,做了一个数据库自动生成实体类的工具类,谢谢哈!不过你的这个有好多地方需要改进呢!

相关推荐

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    生成数据库表结构: 根据解析得到的SQL语句中的表名、字段名、数据类型等信息,动态地生成相应的数据库表结构。这可以通过编程语言与数据库操作的API来实现,比如Java中的JDBC或者MyBatis/iBatis提供的API。 执行SQL...

    JAVA通过实体生成数据库表

    在这个场景中,"JAVA通过实体生成数据库表"指的是使用特定的工具或框架,根据预先定义好的Java实体类,自动生成对应的数据库表结构。 首先,我们需要理解什么是实体类。在Java中,实体类通常是对应数据库中的一张表...

    逆向生成工具,有数据库表生成java bean实体类

    总的来说,"逆向生成工具,有数据库表生成java bean实体类"是一种提高开发效率、降低维护成本的利器。通过合理的XML配置和简单的执行命令,我们可以快速地从数据库中获取到对应的Java Bean实体类,使开发过程更加...

    idea配置数据库,反向生成实体类demo,支持lombok,swagger2注解

    idea配置数据库,反向生成实体类demo,支持lombok,swagger2注解

    mybatis将数据库表反向生成java的实体类,dao以及相应的mapper文件

    下载解压至相应的盘符,打开generatorConfig.xml修改数据库连接信息等相关配置保存后,win+R调起cmd命令,进入解压后的盘符目录,我的是F盘,...overwrite 命令即可生成数据库表对应的实体类,dao以及相应的mapper文件

    JAVA MVC三层架构 代码生成器.JAVA根据数据库表反向工程生成 MVC三层架构 代码的生成器

    在Java中,反向工程常用于根据数据库表自动生成对应的实体类、DAO接口和实现、Service接口和实现等代码,减少开发者手动编写这些基础代码的工作量。 在这个特定的"JAVA MVC三层架构 代码生成器"中,它使用了反向...

    oracle 根据数据库自动生成JAVA代码

    "Oracle根据数据库自动生成JAVA代码"这一技术就是将数据库中的表结构映射到Java编程语言中的实体类、DAO(Data Access Object)、Service、Controller以及前端展示层的HTML模板,从而减少手动编写这些基础代码的工作...

    java之表反向生成类

    首先,"表反向生成类"指的是从数据库中的表结构逆向工程生成Java类的过程,这些类通常代表数据库中的记录,包含了字段属性和对应的方法。这个过程可以极大地提高开发效率,避免手动编写大量的getter、setter、构造...

    根据hibernate反向生成数据库的java代码

    这些元数据是生成Java代码的基础,确保了Java类与数据库表结构的一致性。 4. Java持久化接口: Hibernate逆向工程生成的Java代码通常遵循JPA(Java Persistence API)规范,使得这些实体类可以直接在任何支持JPA的...

    java代码反向生成

    Java代码反向生成是一种常见的开发工具功能,它能够根据数据库中的表结构自动生成相应的Java实体类、MyBatis映射文件以及其他相关代码,极大地提高了开发效率。在Java Web开发中,MyBatis作为一款轻量级的持久层框架...

    mybatis根据数据库表反向工程自动生成代码model,mapper,dao.zip_mybatis自动生成主键

    MyBatis的反向工程工具可以快速地根据数据库表生成对应的Java实体类(Model)、Mapper接口及XML配置文件,以及DAO接口和实现类。这极大地减少了手动编写这些基本代码的工作量,使得开发者能够更专注于业务逻辑的...

    mybatis实体类反向生成

    "mybatis实体类反向生成"是指利用特定工具,根据数据库中的表结构自动生成对应的Java实体类以及MyBatis的映射文件(XML配置文件),这一过程极大地提高了开发效率,减少了手动编写这些基础代码的工作量。 1. **...

    eclipse由数据库反向生成hibernate实体类(图解).doc

    ### Eclipse中通过数据库反向生成Hibernate实体类及JPA注释详解 #### 一、配置数据源 在Eclipse中实现数据库反向生成Hibernate实体类的过程主要包括数据源配置与实体类生成两大步骤。 ##### 1. 数据源配置 **第...

    Hibernate 3.2反向生成数据库文件

    在反向生成数据库文件的过程中,首先你需要确保已安装并配置好Hibernate 3.2以及相应的JDBC驱动(对于SQL 2000,这通常是Microsoft的JDBC驱动)。接下来,按照以下步骤进行操作: 1. **配置Hibernate**: 创建...

    SpringBoot + MybatisPlus 实现实体类转成数据库表结构,可直接运行

    总结,通过SpringBoot和MybatisPlus的结合,我们可以方便地从Java实体类生成数据库表结构,无需手动编写SQL脚本。这种方式对于快速构建原型或者在数据丢失后恢复表结构非常有用。在实际应用中,记得对重要数据进行...

    java反向生成实体工具

    有了这种反向生成实体工具,开发者可以快速、准确地自动生成与数据库表结构对应的实体类,极大地提高了开发效率。 该工具的核心功能在于它能够通过连接数据库,读取表结构信息,包括字段名、数据类型、主键等,然后...

    数据库反向生成实体类

    数据库反向生成实体类是软件开发中的一个常见实践,特别是在使用ORM(对象关系映射)框架如Hibernate时。这个过程主要是将数据库结构转化为代码,自动创建对应的Java实体类,这样可以减少手动编写这些类的工作量,...

    数据库反向生成基础代码

    数据库反向生成基础代码是指通过特定工具或技术从已有的数据库结构中自动生成相应的应用程序代码,这大大减少了开发人员手动编写数据访问层的工作量。在软件开发过程中,尤其是在大型项目中,这种自动化过程能提高...

    mybatis plus+springboot反向生成代码

    Mybatis Plus的反向生成代码功能,可以根据数据库中的表结构自动生成对应的Java实体类、Mapper接口及实现、Service接口及实现、Controller等代码,大大提高了开发效率。 SpringBoot作为一款微服务框架,它简化了...

    反向生成实体类

    ### 反向生成实体类:从数据库表结构到JavaBean 在软件开发过程中,特别是基于数据库的应用程序开发中,我们经常需要将数据库中的表映射为面向对象编程语言(如Java)中的实体类(通常称为JavaBean)。这种过程称为...

Global site tag (gtag.js) - Google Analytics