`
yu120
  • 浏览: 81844 次
社区版块
存档分类
最新评论

利用Java将Mysql数据表生成JPA实体对象

    博客分类:
  • Java
阅读更多
package cn.lry.iteye.jpa.tool;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
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.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 从数据库表反射出实体类,自动生成实体类
 * @author lry
 *
 */
public class GenEntityMysql {
	
	private String packageOutPath = "cn.lry.iteye.jpa.po";//指定实体生成所在包的路径
	private String authorName = "lry";//作者名字
	private String tablename = "";//表名
	private String[] colnames; // 列名数组
	private String[] colTypes; //列名类型数组
	private int[] colSizes; //列名大小数组
	private boolean f_util = false; // 是否需要导入包java.util.*
	private boolean f_sql = false; // 是否需要导入包java.sql.*
	private boolean f_jpa = true; // 是否需要生成基于注解的JPA实体对象
    
    //数据库连接
	private static final String URL ="jdbc:mysql://localhost:3306/yu120";
	private static final String NAME = "root";
	private static final String PASS = "123456";
	private static final String DRIVER ="com.mysql.jdbc.Driver";

	/*
	 * 构造函数
	 */
	public GenEntityMysql(){
		List<String> list=getTableName();
		for(int p=0;p<list.size();p++){
			tablename=list.get(p);
	    	//创建连接
	    	Connection con;
			//查要生成实体类的表
	    	String sql = "select * from " + tablename;
	    	PreparedStatement pStemt = null;
	    	try {
	    		try {
					Class.forName(DRIVER);
				} catch (ClassNotFoundException e1) {
					e1.printStackTrace();
				}
	    		con = DriverManager.getConnection(URL,NAME,PASS);
				pStemt = con.prepareStatement(sql);
				ResultSetMetaData rsmd = pStemt.getMetaData();
				int size = rsmd.getColumnCount();	//统计列
				colnames = new String[size];
				colTypes = new String[size];
				colSizes = new int[size];
				for (int i = 0; i < size; i++) {
					colnames[i] = rsmd.getColumnName(i + 1);
					colTypes[i] = rsmd.getColumnTypeName(i + 1);
					
					if(colTypes[i].equalsIgnoreCase("datetime")){
						f_util = true;
					}
					if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){
						f_sql = true;
					}
					colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
				}
				
				String content = parse(colnames,colTypes,colSizes);
				
				try {
					File directory = new File("");
					String outputPath = directory.getAbsolutePath()+ "/src/"+this.packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";
					FileWriter fw = new FileWriter(outputPath);
					PrintWriter pw = new PrintWriter(fw);
					pw.println(content);
					pw.flush();
					pw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{
	//			try {
	//				con.close();
	//			} catch (SQLException e) {
	//				// TODO Auto-generated catch block
	//				e.printStackTrace();
	//			}
			}
		}
		System.out.println("生成完毕!");
    }
	/**
	  * Java方法 得到当前数据库下所有的表名 
	  * @param con
	  */
	private List<String> getTableName() {
		 List<String> list=new ArrayList<String>();
		 try {  
			 DatabaseMetaData meta = DriverManager.getConnection(URL,NAME,PASS).getMetaData();  
			 ResultSet rs = meta.getTables(null, null, null,new String[]{"TABLE"});
			 while (rs.next()) {
				 list.add(rs.getString(3));  
			 }  
		   }catch(Exception e){  
			   e.printStackTrace();  
		   }
		return list;
	 }
	/**
	 * 功能:生成实体类主体代码
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @return
	 */
	private String parse(String[] colnames, String[] colTypes, int[] colSizes) {
		StringBuffer sb = new StringBuffer();
		sb.append("package " + this.packageOutPath + ";\r\n");
		sb.append("\r\n");
		
		//判断是否导入工具包
		if(f_util){
			sb.append("import java.util.Date;\r\n");
		}
		if(f_sql){
			sb.append("import java.sql.*;\r\n");
		}
		
		//jpa
		if(f_jpa){
			sb.append("import javax.persistence.Entity;\r\n");
			sb.append("import javax.persistence.GeneratedValue;\r\n");
			sb.append("import javax.persistence.GenerationType;\r\n");
			sb.append("import javax.persistence.Id;\r\n\r\n");
		}
		
		//注释部分
		sb.append("/**\r\n");
		sb.append(" * "+tablename+" 实体类\r\n");
		sb.append(" * "+new Date()+"\r\n");
		sb.append(" * @"+this.authorName+"\r\n");
		sb.append(" */ \r\n");
		
		if(f_jpa){
			sb.append("@Entity\r\n");
		}
		//实体部分
		sb.append("public class " + initcap(tablename) + "{\r\n\r\n");
		processAllAttrs(sb);//属性
		processAllMethod(sb);//get set方法
		sb.append("}\r\n");
		
    	//System.out.println(sb.toString());
		return sb.toString();
	}
	
	/**
	 * 功能:生成所有属性
	 * @param sb
	 */
	private void processAllAttrs(StringBuffer sb) {
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + ";\r\n");
		}
		sb.append("\r\n");
	}

	/**
	 * 功能:生成所有方法
	 * @param sb
	 */
	private void processAllMethod(StringBuffer sb) {
		
		for (int i = 0; i < colnames.length; i++) {
			
			if(f_jpa){
				if(i==0){
					sb.append("\t@Id\r\n");
					sb.append("\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n");
					sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
				}else{
					sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
				}
			}else{
				sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
			}
			sb.append("\t\treturn " + colnames[i] + ";\r\n");
			sb.append("\t}\r\n\r\n");
			sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + colnames[i] + "){\r\n");
			sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
			sb.append("\t}\r\n\r\n");
		}
		
	}
	
	/**
	 * 功能:将输入字符串的首字母改成大写
	 * @param str
	 * @return
	 */
	private String initcap(String str) {
		
		char[] ch = str.toCharArray();
		if(ch[0] >= 'a' && ch[0] <= 'z'){
			ch[0] = (char)(ch[0] - 32);
		}
		
		return new String(ch);
	}

	/**
	 * 功能:获得列的数据类型
	 * @param sqlType
	 * @return
	 */
	private String sqlType2JavaType(String sqlType) {
		
		if(sqlType.equalsIgnoreCase("bit")){
			return "boolean";
		}else if(sqlType.equalsIgnoreCase("tinyint")){
			return "byte";
		}else if(sqlType.equalsIgnoreCase("smallint")){
			return "short";
		}else if(sqlType.equalsIgnoreCase("int")||sqlType.equalsIgnoreCase("INT UNSIGNED")){
			//INT UNSIGNED无符号整形
			return "int";
		}else if(sqlType.equalsIgnoreCase("bigint")){
			return "long";
		}else if(sqlType.equalsIgnoreCase("float")){
			return "float";
		}else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric") 
				|| sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money") 
				|| sqlType.equalsIgnoreCase("smallmoney")){
			return "double";
		}else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char") 
				|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar") 
				|| sqlType.equalsIgnoreCase("text")){
			return "String";
		}else if(sqlType.equalsIgnoreCase("datetime")){
			return "Date";
		}else if(sqlType.equalsIgnoreCase("image")){
			return "Blod";
		}		
		return null;
	}
	
	/**
	 * 出口
	 * TODO
	 * @param args
	 */
	public static void main(String[] args) {
		new GenEntityMysql();
	}
}
1
1
分享到:
评论
1 楼 lxw840129536 2014-07-14  
为何不使用模板技术?生成出来的比你这样简单多了

相关推荐

    Java根据实体创建Mysql数据库表

    在Java开发中,将对象模型(实体)映射到关系型数据库如MySQL是常见的需求,这一过程被称为对象关系映射(ORM)。ORM框架允许我们通过编程语言操作数据,而不是直接编写SQL语句,大大提高了开发效率。本资源分享的是...

    MySql转Java实体类

    当我们在用Java处理数据库相关业务时,经常需要将MySQL数据库中的表结构映射到Java对象,即实体类(Entity Class),以便进行数据的CRUD操作。本文将详细探讨如何将MySQL中的表转换为Java实体类。 1. **什么是Java...

    java实体转mysql建表语句

    在Java开发中,将Java实体类转换为MySQL数据库的建表语句是一项常见的任务,它有助于快速构建数据库模型,尤其在使用ORM(对象关系映射)框架如Hibernate、MyBatis时更为便捷。本篇文章将深入探讨这个过程,并提供...

    mysql表映射成java实体类

    MySQL是一种广泛使用的开源关系型数据库管理系统,而Java实体类则是将数据库表结构映射到编程语言中的对象,便于进行对象关系映射(ORM)。本话题将详细介绍如何通过原生JDBC连接MySQL数据库,自动获取所有表名并...

    jpa代码自动生成工具-springboot

    在给定的"codetool"压缩包中,很可能包含了一个这样的工具,它可以帮助我们自动生成domain(实体类)、dao(数据访问对象)、service(业务逻辑层)以及controller(控制器)等代码。这些代码通常遵循MVC(Model-...

    springboot集成jpa代码,自动生成表

    下面我们将深入探讨Spring Boot集成JPA实现数据库表自动生成的过程。 1. **添加依赖** 首先,我们需要在`pom.xml`或`build.gradle`文件中引入Spring Boot的JPA和相关数据库驱动依赖。例如,如果使用的是MySQL,...

    mysql+orcale表生成实体

    "mysql+orcale表生成实体"的主题涉及到如何将这两种数据库中的表结构映射到编程语言中的对象,通常这个过程称为对象关系映射(ORM)。ORM允许开发人员使用面向对象的方式来处理数据库,提高了开发效率并降低了数据库...

    java实体类生成工具

    Java实体类生成工具是一种高效的开发辅助软件,特别适用于处理大量数据模型对象的场景。在Java开发过程中,我们经常需要创建代表数据库表结构的实体类,这些类通常包含大量的getter、setter、构造函数以及对应的注解...

    Eclipse下如何配置JPA生成数据库表对应的已注解实体类(图文详解)

    JPA(Java Persistence API)提供了一种标准的方式来管理这些对象,使得开发者可以从数据库表自动生成对应的实体类,减轻了手动编写代码的工作量。本文将详细介绍如何在Eclipse环境中配置JPA,以便自动生成数据库表...

    jpa自动代码生成工具

    本工具可以根据数据库表自动生成JPA开发所需的实体JavaBean(带有jpa主注解)、repository及service类,提高开发效率;目前支持数据库:MYSQL;并提供配合演示使用的demo项目。

    Java直接通过连接数据库生成对应的Resful格式的API

    在这个场景下,ORM框架可能用于自动根据表结构生成Java实体类和DAO层代码。 3. JPA(Java Persistence API):Java标准的ORM规范,提供了一种统一的方式来管理持久化对象。 4. Spring Boot:一个流行的Java框架,...

    myeclipse反向生成jpa

    在MyEclipse中进行反向工程生成JPA实体类的过程大致如下: 1. **开启JPA支持**:首先,确保项目中已经添加了JPA相关的库(如Hibernate),然后通过右键点击项目,选择`Add JPA Capabilities`,这会引导你完成JPA...

    openjpa实体标识的生成策略

    当设置`strategy=GenerationType.IDENTITY`时,实体的主键将由数据库自动生成,这通常适用于支持自动增长字段的数据库,如HSQL、SQL Server、MySQL、DB2和Derby等。这种方式简洁高效,但需要数据库级别的支持。 第...

    SpringBoot框架 实体类(Model类)生成工具 for MySQL

    SpringBoot框架 实体类(Model类)生成工具 for MySQL 需要.netframework4支持,如果无法运行,请自行安装.netframework4。推荐下载搜索关键字 dotNetFx40_Full_x86_x64.exe 说明:由于这是自写自用的工具,功能还...

    myabtis jpa代码生成器

    JPA 是 Java 平台上的一个标准,它提供了一种面向对象的方式来管理关系数据库中的数据。结合两者,代码生成器可以为开发者提供一套基于 ORM(对象关系映射)的解决方案。 在描述中提到的 "项目里面搜main方法" 指的...

    java生成实体工具

    此外,为了方便持久化操作,实体类可能会引入一些常见的注解,如`@Entity`(用于标注这是一个JPA实体)、`@Table`(指定对应的数据库表名)、`@Id`(标识主键字段)以及`@GeneratedValue`(控制主键生成策略)等。...

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    **JPA(Java Persistence API)...综上所述,这个压缩包提供的教程详细讲解了JPA的基本概念,以及如何通过实例创建和管理JPA实体,特别是强调了主键生成策略的重要性,这对于理解和使用JPA进行数据库操作具有指导意义。

    持久化对象的标准JPA

    JPA通过ORM(对象关系映射)技术将Java对象与数据库表进行映射,简化了数据库访问的复杂性。 **关联(一对一,一对多,多对多)** 在JPA中,关联是描述实体间关系的概念。有三种主要的关联类型: 1. **一对一...

    JPA环境搭建及JPA实例与JPA主键生成策略

    通过以上步骤,你就成功地搭建了JPA环境,并理解了如何创建JPA实体和设置主键生成策略。继续深入学习,你将能够利用JPA的强大功能,如查询语言(JPQL)、级联操作、事务管理等,来更高效地进行数据库操作。

    jpa操作mysql数据库

    JPA通过ORM(Object-Relational Mapping)技术将Java类与数据库表进行映射,简化了数据库操作。 在“jpa操作mysql数据库”的项目中,我们可以推断出这个工程是使用JPA来连接并操作MySQL数据库的。这通常涉及到以下...

Global site tag (gtag.js) - Google Analytics