自动生成hibernate配置文件和对象关系映射文件

一、根据数据表生成对应的实体和注解(GenEntityOracle.java)

package com.ant.tool;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
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 java.sql.Statement;
import java.util.Date;

public class GenEntityOracle {

	// 指定实体生成所在包的路径
	private String packageOutPath = "com.scms.entity";
	// 作者名字
	private String authorName = "wang";
	// 数据库表名
	private String tablename = "skt_modules";
	// 列名数组
	private String[] colnames;
	// 列名类型数组
	private String[] colTypes;
	// 列名大小数组
	private int[] colSizes;
	// 是否需要导入包java.util.*
	private boolean f_util = false;
	// 是否需要导入包java.sql.*
	private boolean f_sql = false;

	// 数据库连接
	private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
	private static final String NAME = "oracle11g";
	private static final String PASS = "oracle11g";
	private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";

	/*
	 * 构造函数
	 */
	public GenEntityOracle() {
		// 创建连接
		Connection con = null;
		// 查要生成实体类的表
		String sql = "select * from " + tablename;
		Statement pStemt = null;
		try {
			try {
				Class.forName(DRIVER);
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			con = DriverManager.getConnection(URL, NAME, PASS);
			pStemt = (Statement) con.createStatement();
			ResultSet rs = pStemt.executeQuery(sql);
			ResultSetMetaData rsmd = rs.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("date")
						|| colTypes[i].equalsIgnoreCase("timestamp")) {
					f_util = true;
				}
				if (colTypes[i].equalsIgnoreCase("blob")
						|| colTypes[i].equalsIgnoreCase("char")) {
					f_sql = true;
				}
				colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
			}

			String content = parse(colnames, colTypes, colSizes);

			try {
				File directory = new File("");
				String path = this.getClass().getResource("").getPath();

				System.out.println(path);
				System.out.println("src/?/"
						+ path.substring(path.lastIndexOf("/com/",
								path.length())));
				// String outputPath = directory.getAbsolutePath()+
				// "/src/"+path.substring(path.lastIndexOf("/com/",
				// path.length()), path.length()) + initcap(tablename) +
				// ".java";
				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) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 功能:生成实体类主体代码
	 * 
	 * @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");
		}
		// 注释部分
		sb.append("/**\r\n");
		sb.append("* " + tablename + " 实体类\r\n");
		sb.append("* \r\n");
		sb.append("* @hibernate.class table = \""+tablename+"\" dynamic-update = \"false\" \r\n");
		sb.append("*                  dynamic-insert = \"false\" \r\n");
		sb.append("* " + new Date() + " " + this.authorName + "\r\n");
		sb.append("*/ \r\n");
		// 实体部分
		sb.append("\r\n\r\npublic class " + initcap(tablename) + "{\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]) + " "
					+ columToJave(colnames[i]) + ";\r\n");
		}

	}

	/**
	 * 数据字段变成Java属性
	 * 
	 * @param string
	 * @return
	 */
	private String columToJave(String string) {
		String string2 = string.toLowerCase();
		StringBuilder builder = new StringBuilder(string2);

		for (int i = 0; i < builder.length(); i++) {
			if (builder.charAt(i) == '_') {
				// 第一次出现该符号的位置
				char c = builder.charAt(i + 1);
				c = (char) (c - 32);
				StringBuilder replace1 = builder.replace(i + 1, i + 2, c + "");
				builder = replace1.replace(i, i + 1, "");

				// 最后一次出现该符号的位置
				int of = builder.lastIndexOf("_", string2.length());
				if (of != -1) {
					char c1 = builder.charAt(of + 1);
					c1 = (char) (c1 - 32);
					StringBuilder replace2 = builder.replace(of + 1, of + 2, c1
							+ "");
					builder = replace2.replace(of, of + 1, "");
					;
				}

			}
		}
		return builder.toString();
	}

	/**
	 * 功能:生成所有方法
	 * 
	 * @param sb
	 */
	private void processAllMethod(StringBuffer sb) {
		
		
		for (int i = 0; i < colnames.length; i++) {
		    if(columToJave(colnames[i]).equals("id")){
				sb.append("\t/** \r\n");
				sb.append("\t* @hibernate.id  column = \""+colnames[i]+"\"  generator-class=\"sequence\"  \r\n");
			    sb.append("\t* @return \r\n");
			    sb.append("\t*/\r\n");
			}else{
				sb.append("\t/** \r\n");
				sb.append("\t* @hibernate.property column = \""+colnames[i]+"\" \r\n");
			    sb.append("\t* @return \r\n");
			    sb.append("\t*/\r\n");
			}
			sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get"
					+ initcaps(columToJave(colnames[i])) + "(){\r\n");
			sb.append("\t\treturn " + columToJave(colnames[i]) + ";\r\n");
			sb.append("\t}\r\n");
			
			sb.append("\tpublic void set" + initcaps(columToJave(colnames[i]))
					+ "(" + sqlType2JavaType(colTypes[i]) + " "
					+ columToJave(colnames[i]) + "){\r\n");
			sb.append("\t\tthis." + columToJave(colnames[i]) + "="
					+ columToJave(colnames[i]) + ";\r\n");
			sb.append("\t}\r\n");
			
		}

	}

	/**
	 * 功能:将输入字符串的首字母改成大写
	 * 
	 * @param str
	 * @return
	 */
	private String initcap(String string2) {
		String str = columToJave(string2);
		char[] ch = str.toCharArray();
		if (!string2.contains("_")) {
			ch[0] = (char) (ch[0] - 32);
		} else {
			for (int j = 0; j < 3; j++) {
				ch[j] = (char) (ch[j] - 32);
			}
		}
		return new String(ch);
	}

	private String initcaps(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("binary_double")) {
			return "double";
		} else if (sqlType.equalsIgnoreCase("binary_float")) {
			return "float";
		} else if (sqlType.equalsIgnoreCase("blob")) {
			return "byte[]";
		} else if (sqlType.equalsIgnoreCase("blob")) {
			return "byte[]";
		} else if (sqlType.equalsIgnoreCase("char")
				|| sqlType.equalsIgnoreCase("nvarchar2")
				|| sqlType.equalsIgnoreCase("varchar2")) {
			return "String";
		} else if (sqlType.equalsIgnoreCase("date")
				|| sqlType.equalsIgnoreCase("timestamp")
				|| sqlType.equalsIgnoreCase("timestamp with local time zone")
				|| sqlType.equalsIgnoreCase("timestamp with time zone")) {
			return "Date";
		} else if (sqlType.equalsIgnoreCase("number")) {
			return "Long";
		}

		return "String";
	}

	/**
	 * 出口 TODO
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		new GenEntityOracle();

	}

}
二、编写ant文件生成hibernate的配置文件和关系映射文件(build.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project name="OA系统构造脚本" default="生成hibernate配置文件" basedir=".">
	<property name="src.dir" value="${basedir}" />
	<!--这里使用到xdoclet插件,官方可下载-->
	<property name="xdoclet.home" value="E:\Ant\xdoclet-plugins-dist-1.0.4-bin\xdoclet-plugins-dist-1.0.4" />

	<!-- build classpath -->
	<path id="xdoclet.task.classpath">
		<fileset dir="${xdoclet.home}/lib">
			<include name="**/*.jar" />
		</fileset>
	</path>

	<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.task.classpath" />

	<target name="生成hibernate配置文件">
		<xdoclet>
			<fileset dir="${src.dir}/com/scms/entity">
				<include name="**/*.java" />
			</fileset>
			<!--jdbc配置-->
			<component classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin" 
				destdir="${src.dir}" 
				version="3.0" 
				hbm2ddlauto="update" 
				jdbcurl="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" 
				jdbcdriver="oracle.jdbc.driver.OracleDriver" 
				jdbcusername="oracle11g" 
				jdbcpassword="oracle11g" 
				dialect="org.hibernate.dialect.Oracle9Dialect" 
				showsql="true" />
		</xdoclet>
	</target>

	<target name="生成hibernate映射文件">
		<property name="hibernate.merge.home"
					          value="${src.dir}/hibernate3" />

		<delete>
			<fileset dir="${src.dir}" includes="**/*.hbm.xml"/>
		</delete>
		<xdoclet>
			<!--这个目录是你javaBean的位置-->
			<fileset dir="${src.dir}/com/scms/entity">
				<include name="**/*.java" />
			</fileset>
			<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin" 
				version="3.0" 
				destdir="${src.dir}" />
		</xdoclet>

	</target>
</project>

三、运行GenEntityOracle.java 文件  再右键  build.xml   run-->ant生成数据表对应的实体类、hibernate配置文件、实体和数据库之间的关系映射文件。

注:功能不是针对所有的根据自己的需要修改GenEntityOracle.java和 build.xml 文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值