`
onedear
  • 浏览: 69175 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

通过java代码读取数据库表反向生成相应的pojo类

阅读更多
    下午要根据数据库的一个表写一个pojo,那个累啊,80列名。写了大概10列就没心情写了。于是就想到通过数据库反向生成java类,但没有myeclipse又不懂生成,于是手动写了一个大概的方法,暂时仅仅在sqlserver测试通过,对于包名跟引用类就没写了,把代码复制到eclipse直接ctrl+shift+o就导入了



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.onedear.util.database.DataBaseType;

/**
 * 数据库工具类
 * 
 * @author onedear
 * @data:2010-10-21 下午06:12:39
 */
public class DBUtil {

	public static final int SQLSERVER = 1;
	public static final int MYSQL = 2;
	public static final int ORACLE = 3;
	private static final String LINE = "\r\n";
	private static final String TAB = "\t";

	/**
	 * 用于调试,懒得写相应的参数
	 * 
	 * @return
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 */
	public static Connection getConnection() throws ClassNotFoundException, SQLException {
			return getConnection("192.168.0.161:1997", "ETForMonitor_V2", "sa",
					"password", DBUtil.SQLSERVER);
	}

	/**
	 * 
	 * 通过jdbc获取相应的数据库链接connection
	 * 
	 * @param ipport
	 *            ip+port ,eg.: 192.168.0.161:1997
	 * @param dbName
	 *            databaseName ,eg. : ETForMonitor_V2
	 * @param username
	 *            eg.:sa
	 * @param password
	 *            eg. :password
	 * @param type
	 *            请看本类的静态变量
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static Connection getConnection(String ipport, String dbName,
			String username, String password, int type)
			throws ClassNotFoundException, SQLException {
		String jdbcString = null;
		if (type == SQLSERVER) {
			jdbcString = "jdbc:jtds:sqlserver://" + ipport + ";databaseName="
					+ dbName;
			Class.forName("net.sourceforge.jtds.jdbc.Driver");
		} else if (type == MYSQL) {
			jdbcString = "jdbc:mysql://" + ipport + "/" + dbName;
			Class.forName("org.gjt.mm.mysql.Driver");
		} else if (type == ORACLE) {
			jdbcString = "jdbc:oracle:thin:@" + ipport + ":" + dbName;
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}

		Connection connection = null;
		connection = DriverManager
				.getConnection(jdbcString, username, password);
		return connection;
	}

	/**
	 * 数据库表生成相应的java类,生成规则
	 * 类名=		表名(第一个字母大写)
	 * 属性名=   数据库列名
	 * get/set方法 = 根据标准生成
	 * 其中生成的基本类型均为包装类,例如Integer , Long , Boolean , String  
	 * @param connection
	 * @param tableName
	 * @param dbType
	 * @param path
	 * @param isCreateFile
	 * @return
	 * @throws SQLException
	 */
	public static String table2pojo(Connection connection, String tableName,
			int dbType, String path , boolean isCreateFile) 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());
		sb.append("public class " + tableName + " {");
		sb.append(LINE);

		for (int i = 1; i <= columnCount; i++) {
			sb.append(TAB);
			sb.append("private "
					+ DataBaseType.getPojoType(md.getColumnTypeName(i)) + " "
					+ md.getColumnName(i) + ";");
			// System.out.println("name : " + md.getColumnName(i) +
			// "   , type :"
			// + md.getColumnTypeName(i));
			sb.append(LINE);
		}

		for (int i = 1; i <= columnCount; i++) {
			sb.append(TAB);

			String pojoType = DataBaseType.getPojoType(md.getColumnTypeName(i));
			String columnName = md.getColumnName(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);
			
		}
		sb.append("}");

		System.out.println(sb.toString());
		
		if(isCreateFile)
			FileUtils.stringToFile(null,tableName +".java" , sb.toString());
		return null;
	}

	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		Connection con = getConnection();
		table2pojo(con, "PlayBackVisitorControl", DBUtil.SQLSERVER, "" , true);
		
	}


}





import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

/**
 * 
 * @author onedear
 * @data:2010-11-15 下午07:54:23
 */
public class DataBaseType {
	private static Map<String , String> map ;
	
	static {
		map = new HashMap<String , String>();
		map.put("varchar", "String");
		map.put("int", "Integer");
		map.put("datetime", "Date");
		map.put("nvarchar", "String");
		map.put("char", "String");
		map.put("uniqueidentifier", "String");
		map.put("bigint", "Long");
		map.put("tinyint", "Boolean");
	}
	
	public static  String getPojoType(String dataType ) {
		String tmp = dataType.toLowerCase();
		StringTokenizer st = new StringTokenizer(tmp);
		return map.get(st.nextToken()) ;
	}
}

2
0
分享到:
评论
2 楼 onedear 2011-08-25  
shakajava 写道
楼主,你那FileUtils有哪些功能的,顺便也放出来,我也在弄这个呢,弄出数据库来研究研究关系

这个fileUtil类就是普通io操作,由于网上太多例子了,我就不他的代码了
1 楼 shakajava 2011-08-25  
楼主,你那FileUtils有哪些功能的,顺便也放出来,我也在弄这个呢,弄出数据库来研究研究关系

相关推荐

    eclipse 配置 hibernate tools 反向生成 pojo类 注解

    现在你可以使用Hibernate Tools反向生成POJO类了: 1. 在Eclipse的Package Explorer或Project Explorer中,右键点击你想生成POJO类的包名,选择“New” &gt; “Other…”。 2. 在弹出的对话框中,展开“Hibernate”...

    SSH和DWR简单整合,还包括了根据Pojo反向生成数据库的经典代码

    这个过程通常使用Hibernate的工具,如Hibernate Tools,它可以读取Pojo类和相应的注解,自动生成对应的数据库表结构。步骤包括: 1. **创建Pojo类**:定义实体类,并使用Hibernate的注解(如@Entity, @Table, @...

    MyBatis反向工程源码

    MyBatis反向工程是MyBatis框架中的一个重要特性,它允许开发者通过简单的配置或工具,自动生成基于数据库表的Java实体类(POJO)、Mapper接口以及对应的XML映射文件,极大地提高了开发效率,减少了手动编写这些基础...

    mybatis反向生成实体类和配置文件插件及说明文档

    MyBatis Generator通过读取数据库表结构,能够自动创建Java实体类(POJO)、MyBatis的映射文件(Mapper XML)以及对应的Mapper接口。这使得开发者无需手动编写这些基础代码,从而能更专注于业务逻辑的实现。 2. **...

    Java的逆向工程.

    3. 生成Pojo类:根据表结构生成对应的Java类,包括字段、注解以及getter和setter方法。 4. 创建Mapper接口:为每个表生成一个Mapper接口,接口中定义了与表操作相关的Java方法。 5. 生成Mapper XML文件:为每个...

    mybatis逆向生成项目

    这个项目的核心在于利用MyBatis的Generator组件,通过配置来实现对数据库表结构的反向工程,自动生成与数据库表对应的Java实体类、Mapper接口以及XML映射文件。 1. MyBatis简介:MyBatis是一个优秀的持久层框架,它...

    使用Maven Hibernate5 之反向工程

    在Hibernate中,这通常由Hibernate Tools完成,它可以读取数据库模式并生成POJO(Plain Old Java Object)类,这些类代表数据库中的表,包含了属性(对应字段)和getter/setter方法。这样,开发者就不需要手动创建每...

    MyBatis_nxgc.zip(带jar包)

    "MyBatis_nxgc.zip(带jar包)" 提供了一个包含MyBatis逆向工程工具的压缩包,该工具能够自动化生成POJO(Plain Old Java Object)类、Mapper XML文件和相应的接口,极大地提高了开发效率。 逆向工程,也称为反向...

    generatorSqlmapCustom.zip

    本项目"generatorSqlmapCustom.zip"旨在通过Java程序自动化地从数据库反向生成与之对应的POJO实体类和Mapper类,极大地提高了开发效率和代码质量。 首先,我们需要理解Java、MyBatis和MySQL这三者的关系。Java是一...

    mybatis-generator-1.35-master.zip

    描述中提到"Mybatis-generator逆向生成工具",这里的“逆向生成”是指MBG可以根据现有的数据库结构反向生成Java代码,免去了手动编写这些基础代码的繁琐工作。它支持生成的类包括: 1. **POJO(Plain Old Java ...

    逆向工程项目工具

    这使得工具能够读取数据库的元数据,如表结构、索引和关系,然后根据这些信息生成相应的Java代码。这些代码通常包含数据库连接配置、数据访问对象(DAO)、以及数据库操作的方法。 运行Java程序的功能意味着逆向...

    MyBatis逆向工程工具

    一旦配置完成并运行,工具会自动读取数据库中的表结构,包括字段名、数据类型、主键等信息,生成相应的Java实体类(POJO)用于封装数据库记录,Mapper接口用于定义SQL操作,以及Mapper XML文件来具体编写SQL语句。...

    hibernate实验

    本实验手册介绍了 Hibernate 的基本概念和使用方法,包括创建数据库和表、创建 Hibernate 项目、使用反向工程快速生成 Java POJO 类、映射文件和 DAO、编写测试类和使用 HQL 语句查询数据等内容。

    Java相关课程系列笔记之十四Hibernate学习笔记

    Hibernate作为ORM工具,旨在消除Java应用程序与SQL之间的耦合,通过将Java对象与数据库表进行映射,实现了对象的持久化。开发者无需编写大量的JDBC代码,从而提高开发效率和代码可维护性。 1.2 Hibernate访问数据库...

    用myeclipse自动生成hibernate配置文件

    - 完成向导,MyEclipse将自动生成`hibernate.cfg.xml`配置文件、对应的Java Bean类(POJO)以及`.hb.xml`映射文件。 6. **测试代码**: - 创建一个测试类,例如`HibernateTest`,使用以下代码来验证配置是否正确...

    Hibernate开发环境搭配

    #### 六、通过反向工程生成POJO及HBM映射文件 Hibernate提供了强大的反向工程工具,可以自动生成实体类(POJO)和映射文件(.hbm.xml),大大减少了手工编写的工作量。 1. **进入Hibernate数据库**:在DB Browser...

    三大框架整合案例己调试

    - 使用MyEclipse的反向工程功能根据数据库表结构自动生成POJO类。 - **视图层设计**: - 设计简洁明了的用户界面,确保用户体验良好。 - **控制层开发**: - Action类需要实现对应的业务逻辑,并且能够与视图层...

    Struts+Spring+Hibernate--SSH整合实例.

    反向工程时,选择生成POJO、Hibernate映射文件以及更新Hibernate配置,Id生成器设置为`native`。 接下来,我们创建DAO(数据访问对象)接口`UserDao`,通常这个接口会定义对数据库的CRUD(创建、读取、更新、删除)...

    Generating Artifacts问题解决.doc

    该错误通常发生在尝试自动生成POJO类或配置文件等代码元素时。 #### 二、错误示例与分析 ##### 错误信息1 ```plaintext !ENTRY org.eclipse.core.jobs 4 2 2010-12-27 14:20:11.625 !MESSAGE An internal error ...

Global site tag (gtag.js) - Google Analytics