`
flashdream8
  • 浏览: 678512 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

根据数据库表结构生成实体bean 包括 get set 方法和 注释

 
阅读更多

根据数据库表结构生成 javaBean 。

这个功能以前一直使用 hibernate ,老觉得不方便,而且hibernate 生成的javabean 没有注释(估计是我不会配置)

所以就写了这么一个工具类,将 数据库中的表生成 javaBean .

 

 

 

package com.xxx.common;

import java.io.File;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @createtime: 2012-10-19 下午03:29:35
 * 
 * @version: 将 表结构生成 实体类
 */
public class CopyOfSqlFiledUtil {
	private static String srcDirectory = "c:/xxx/";// 存放.java源文件的目录
	private static String classDirectory = "c:/xxx/class/";// 存放.class的目录
	private static String classPackage = "com.xxx.entity";// 对应bean对象的包名

	private static String driver = "com.mysql.jdbc.Driver";
	private static String url = "jdbc:mysql://localhost:3306/xxx?useUnicode=true&characterEncoding=GBK";
	private static String user = "xxx";
	private static String pass = "xxx";
	private static Set<String> columnTypeSet = new HashSet<String>();
	
	private final static  String decollator = "★";  // 分隔符

	private  static void init() {
		// 设置一个目录
		File dir = new File(CopyOfSqlFiledUtil.srcDirectory);
		File dir2 = new File(CopyOfSqlFiledUtil.classDirectory);
		if (!dir.exists()) {
			dir.mkdir();// 如果这个目录不存在,则创建一个用来存入源文件
		}
		if (!dir2.exists()) {
			dir2.mkdir();// 如果这个目录不存在,则创建一个用来存入源文件
		}
	}

	private static void getJavaFile(String tableName, List<String> columnList)
			throws Exception {
		System.out.println("a::" + tableName);
		String columnName = "";
		String zhushi = "";
		String columnType = "";
		String columnType4Obj = "";
		if (columnList != null && !columnList.isEmpty()) {
			StringBuffer fileContent = new StringBuffer();
			// 生成一个包
			fileContent.append("package ");
			fileContent.append(CopyOfSqlFiledUtil.classPackage);
			fileContent.append(";\n\n");

			// 生成类声明类这一行
			fileContent.append("public class ");
			fileContent.append(tableName);
			fileContent.append(" implements java.io.Serializable {\n\n");

			// 生成构造方法
			// fileContent.append("\tprivate " + tableName + "(){\n");
			// fileContent.append("\t}\n");

			for (String columnMessage : columnList) {
				if (columnMessage != null && columnMessage.contains(decollator)) {
					String[] columns = columnMessage.split(decollator);
					columnName = columns[0];
					zhushi = columns[1];
					columnType = columns[2];
					columnType4Obj = jdbc2objMap.get(columnType.toUpperCase());

					// System.err.println("columnName="+columnName+" , zhushi="+zhushi+" , columnType="+columnType+" , columnType4Obj="+columnType4Obj);
					// 生成javaBean的私有属性
					fileContent.append("\n\t private " + columnType4Obj + " ");
					fileContent
							.append(columnName.toString() + ";\t//" + zhushi);

				}
			}
			fileContent.append("\n");
			fileContent.append("\n\n\n\t/*下面是取得属性值的get方法*/");
			for (String columnMessage : columnList) {
				if (columnMessage != null && columnMessage.contains(decollator)) {
					String[] columns = columnMessage.split(decollator);
					columnName = columns[0];
					zhushi = columns[1];
					columnType = columns[2];
					columnType4Obj = jdbc2objMap.get(columnType.toUpperCase());

					// 生成get方法
					fileContent.append("\n\t public ");
					fileContent.append(columnType4Obj);
					fileContent.append(" get");
					fileContent.append(columnName.toString().substring(0, 1)
							.toUpperCase());
					fileContent.append(columnName.toString().substring(1));
					fileContent.append("(){\n");
					fileContent.append("\t\t return this."
							+ columnName.toString() + ";\n\t}");
					// fileContent.append("\n");
				}
			}

			// 生成set方法
			fileContent.append("\n");
			fileContent.append("\n\n\n\t/*下面是设置属性值的set方法*/");
			for (String columnMessage : columnList) {
				if (columnMessage != null && columnMessage.contains(decollator)) {
					String[] columns = columnMessage.split(decollator);
					columnName = columns[0];
					zhushi = columns[1];
					columnType = columns[2];
					columnType4Obj = jdbc2objMap.get(columnType.toUpperCase());
					// 生成set方法
					fileContent.append("\n\t public void set");
					fileContent.append(columnName.toString().substring(0, 1)
							.toUpperCase());
					fileContent.append(columnName.toString().substring(1));
					fileContent.append("( " + columnType4Obj + "\t");
					fileContent.append(columnName.toString());
					fileContent.append(" ){\n");
					fileContent.append("\t\tthis.");
					fileContent.append(columnName.toString());
					fileContent.append("=");
					fileContent.append(columnName.toString());
					fileContent.append(";\n\t}");
					fileContent.append("\n");

				}
			}
			fileContent.append("}");

			// 形成一个.java文件
			java.io.FileWriter file = new java.io.FileWriter(
					CopyOfSqlFiledUtil.srcDirectory + "/" + tableName + ".java");
			file.write(fileContent.toString());
			file.close();
			file = null;
			// 编译成.class文件
			String[] arg = new String[] { "-d", CopyOfSqlFiledUtil.classDirectory,
					CopyOfSqlFiledUtil.srcDirectory + "/" + tableName + ".java" };
			com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
			int statues = javac.compile(arg);
			System.out.println("OK" + statues);
			String className = CopyOfSqlFiledUtil.classPackage + ".";
			className += tableName;
		}

	}

	/**
	 * 驼峰转化为 大写 xxCar 转换为 xx_car
	 * 
	 * @param param
	 * @return
	 */
	public static String camel4underline(String param) {
		Pattern p = Pattern.compile("[A-Z]");
		if (param == null || param.equals("")) {
			return "";
		}
		StringBuilder builder = new StringBuilder(param);
		Matcher mc = p.matcher(param);
		int i = 0;
		while (mc.find()) {
			builder.replace(mc.start() + i, mc.end() + i, "_"
					+ mc.group().toLowerCase());
			i++;
		}

		if ('_' == builder.charAt(0)) {
			builder.deleteCharAt(0);
		}
		return builder.toString();
	}

	private static String changeStyle(String str, boolean toCamel) {
		if (str == null || str.isEmpty())
			return str;
		if (toCamel) {
			String[] s = str.split("_");
			String temp = "";
			for (int i = 0; i < s.length; i++) {
				String m = s[i].substring(0, 1).toUpperCase()
						+ s[i].substring(1);
				temp += m;
			}
			return temp;
		} else {
			return camel4underline(str);
		}
	}

	/**
	 * 
	 * @param jdbcType
	 * @return
	 */
	private static String switchIt(String jdbcType) {
		return jdbc2objMap.get(jdbcType);
	}

	/**
	 * 得到某个表的所有字段信息
	 * 
	 * @param tableName
	 * @param conn
	 * @return xxx_source|状态|TINYINT
	 * @throws Exception
	 */
	private static List<String> getColumnsByTableName(String tableName,
			Connection conn) throws Exception {
		List<String> columns = new ArrayList<String>();
		ResultSet rSet = null;
		try {
			if (conn == null) {
				conn = getConnection();
			}
			DatabaseMetaData dbms = conn.getMetaData();
			rSet = dbms.getColumns(null, null, tableName, null);
			while (rSet.next()) {
				String columnName = rSet.getString("COLUMN_NAME");
				String remark = rSet.getString("REMARKS");
				String typeName = rSet.getString("TYPE_NAME");
				columnTypeSet.add(typeName);
				// System.err.println(columnName + "|" + remark + "|" +
				// typeName);
				columns.add(columnName + decollator + remark + decollator + typeName);
			}
			return columns;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
	}

	/**
	 * 得到 conn 数据库的 所有表名称
	 * 
	 * @param conn
	 * @return
	 * @throws Exception
	 */
	private static List<String> getAllTableName(Connection conn)
			throws Exception {
		List<String> tableNames = new ArrayList<String>();
		ResultSet rSet = null;
		try {
			if (conn == null) {
				conn = getConnection();
			}
			DatabaseMetaData dbms = conn.getMetaData();
			rSet = dbms.getTables(null, null, null, null);
			while (rSet.next()) {
				// System.out.println("talbeName :" + rSet.getString(3));
				String tableName = rSet.getString(3);
				tableNames.add(tableName);
			}
			return tableNames;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			if (rSet != null) {
				rSet.close();
			}
		}
	}

	/**
	 * 得到一个数据库连接
	 * 
	 * @return
	 */
	private static Connection getConnection() throws Exception {
		try {
			Class.forName(driver);
			Connection conn = DriverManager.getConnection(url, user,pass);
			return conn;
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
	}

	private static Map<String, String> jdbc2objMap = new HashMap<String, String>();
	static {
		jdbc2objMap.put("CHAR", "String");
		jdbc2objMap.put("VARCHAR", "String");
		jdbc2objMap.put("LONGVARCHAR", "String");
		jdbc2objMap.put("TEXT", "String");
		jdbc2objMap.put("NUMERIC", "java.math.BigDecimal");
		jdbc2objMap.put("DECIMAL", "java.math.BigDecimal");
		jdbc2objMap.put("BIT", "boolean");
		jdbc2objMap.put("INT", "int");
		jdbc2objMap.put("INT UNSIGNED", "int");
		jdbc2objMap.put("TINYINT", "int");
		jdbc2objMap.put("TINYINT UNSIGNED", "int");
		jdbc2objMap.put("SMALLINT", "int");
		jdbc2objMap.put("TINYINT UNSIGNED", "int");
		jdbc2objMap.put("INTEGER", "int");
		jdbc2objMap.put("INTEGER UNSIGNED", "int");
		jdbc2objMap.put("BIGINT", "long");
		jdbc2objMap.put("BIGINT UNSIGNED", "long");
		jdbc2objMap.put("REAL", "float");
		jdbc2objMap.put("FLOAT", "double");
		jdbc2objMap.put("DOUBLE", "double");
		jdbc2objMap.put("BINARY", "byte[]");
		jdbc2objMap.put("VARBINARY", "byte[]");
		jdbc2objMap.put("LONGVARBINARY", "byte[]");
		jdbc2objMap.put("DATE", "java.util.Date");
		jdbc2objMap.put("DATETIME", "java.util.Date");
		jdbc2objMap.put("TIME", "java.util.Date");
		jdbc2objMap.put("TIMESTAMP", "java.util.Date");
	}

	public static void main(String[] args) throws Exception {
		Connection conn = null;
		try {
			init();
			conn = getConnection();
			List<String> tables = getAllTableName(conn);
			List<String> list = null;
			if(tables!=null && !tables.isEmpty()){
			for(String table : tables){
				if(table.startsWith("xxx_")){
						list = getColumnsByTableName(table, conn);
						getJavaFile(changeStyle(table,true), list);
					}
				}
			}
			if(columnTypeSet!=null && !columnTypeSet.isEmpty()){
				for (Iterator iterator = columnTypeSet.iterator(); iterator.hasNext();) {
					String string = (String) iterator.next();
					System.err.println(string);
					
				}
			}
			//System.out.println(changeStyle("xxx", false));
		} catch (Exception e) {
		} finally {
			conn.close();
		}
	}
}

 

分享到:
评论

相关推荐

    myeclipse -get set方法生成注释和字段注释以及具体设置步骤

    - 生成的Getters和Setters应该遵循Java Bean规范,即get方法返回变量值,set方法接收一个参数并设置变量值。 - 注意不要对final或static变量生成Setters,因为它们不能被实例方法改变。 - 生成的注释应当清晰地...

    自动生成带注释的getter和setter方法(Intellij、AndroidStudio插件).zip

    标题中的“自动生成带注释的getter和setter方法(Intellij、AndroidStudio插件)”指的是在编程过程中,开发者可以利用特定的插件自动化生成Java Bean模式中的getter和setter方法,并且这些方法会带有注释。...

    VSStrus 工具(类文件生成器)

    VSStrus是一款针对Java开发者的实用工具,其主要功能是模仿Struts框架的部分特性,帮助程序员快速地根据数据库中的表结构自动生成对应的Java类文件。这个过程极大地简化了对象模型的创建,使得开发者能够更加专注于...

    关于spring boot中几种注入方法的一些个人看法

    使用 @Autowired 可以消除 set、get 方法。在使用 @Autowired 之前,我们对一个 bean 配置起属性时,是使用 属性名" value=" 属性值"/&gt; 的方式来配置,比较繁琐,而且代码比较多。在 Spring 2.5 引入了 @Autowired ...

    教学、学习必备:jsp教案

    - **getProperty**和**setProperty**动作用于读取和设置bean的属性值。 5.3 辅助类 - 辅助类可以简化bean的操作,如属性访问器和修改器。 ### 第6章 JSP文件操作 涵盖文件的读取、创建、删除,以及文件上传和下载...

    JAVA编码标准规范.doc

    - GET和SET方法用于访问和修改属性,遵循Java Bean规范,如getAge(), setAge(int age)。 5. 属性变量的命名和注释规范 - 属性变量名也采用小驼峰命名法,如:firstName。 - 访问权限控制应根据需求设置,如...

    乐优商城.xmind

    声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe) @Data 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法 @Id & @GeneratedValue(strategy= GenerationType....

    软件开发编码规范.pptx

    - 文件、包头部应包含功能描述、作者、版权、创建和修改记录,使用C-Style注释而非JavaDoc注释。 - 类、方法、变量的注释应遵循JavaDoc规范,提供详细的功能、条件、参数说明,以方便生成易读的JavaDoc文档。 - ...

    JAVA规范基础,给出了JAVA编程的一些规范

    以下将根据给定文件的信息,详细解析Java编程中的核心规范,特别关注代码结构、封装原则、注释规范以及文档注释的重要性。 ### 1. **源代码的头部编写** 源代码的头部信息是任何Java项目的基础,它包含了文件的...

    某公司培训用的jsp课件

    2. **EntityBean**:持久化对象,映射数据库中的实体记录,主要用于数据存储和检索。 ### **Struts+EJB开发流程** 结合Struts和EJB,通常的开发流程包括: 1. 创建EJB组件来处理业务逻辑。 2. 设计Action和...

    JAVA代码规范

    - 在Eclipse生成的bean类中,手动添加注释以增强代码可读性。 - 类的布尔型判断方法可以使用`is`前缀,或者根据逻辑使用`equal`或`equals`等有意义的单词。 遵循这些规范可以提升代码的统一性和可维护性,尤其...

    Java Web应用开发 JavaWeb应用开发期末试卷A卷.doc

    5. 调用JavaBean的标记:在JSP中调用JavaBean会用到`&lt;jsp:useBean&gt;`, `&lt;jsp:setProperty&gt;`和`&lt;jsp:getProperty&gt;`标记,而`&lt;java:bean&gt;`不是JSP的标准标记。 6. Tomcat默认端口号:Tomcat服务器默认使用的端口号是...

    项目接口规范

    - **工厂模式**:分为数据访问工厂(`IDataFactory`)和实体工厂(`EntityFactory`),用于创建具体的数据访问对象和实体对象。 - **文件目录与文件名规范**: - `images/`:存放图片资源。 - `styles/`:存放...

    JSP期末复习考点.docx

    - HTTP响应结构:响应行、响应头、空行和实体内容。 - 重定向:`sendRedirect(url)`,将请求导向新页面。 - 设置刷新:`Response.setHeader("Refresh","3;url=index.jsp")`,3秒后自动刷新到index.jsp。 10. **...

    JavaEE编程技术复习题

    两层结构包括客户层和服务器层,三层结构则增加了应用服务器层和数据服务器层。 3. Servlet技术: - Servlet是Java EE中的服务器端组件,用于处理HTTP请求。例如,Servlet可以通过`ServletResponse`的`...

    JAVA高级程序员考试题.doc

    16. EJB(Enterprise JavaBeans)相关知识,EJB包含Session Bean、Entity Bean和Message Driven Bean,基于JNDI、RMI、JTA等技术,可以部署在多种应用服务器上,如Tomcat、JBoss、WebLogic,选项A、B和D正确。...

    (部分答案)java web 复习题.pdf

    - 在JSP中,使用`jsp:setProperty`动作来设置Javabean的属性,例如`&lt;jsp:setProperty name="beanName" property="propertyName" value="value"/&gt;`。 10. **访问控制符** - Java中的类及类成员访问控制符包括:...

    xpath解析xml

    - **节点**:XML文档中的每个部分都是一个节点,包括元素、属性、文本、命名空间、处理指令和注释。 - **路径表达式**:XPath通过路径表达式来定位节点,类似于文件系统的路径。 - **轴(Axes)**:定义了节点...

    java规范文档

    布尔属性的存取方法采用`is`或`has`前缀,如`isEmpty()`,其他属性使用`get`和`set`。 - **方法名**:根据功能描述命名,如`add()`, `update()`, `delete()`。动作方法通常由动词和宾语组成,如`queryById()`。 - ...

    Java-EE:Java EE的注释和程序

    4. **JPA(Java Persistence API)**:在处理数据库操作时,`@Entity`, `@Table`, `@Id`等注释用于声明实体类和其映射关系,简化了ORM(对象关系映射)的配置。 5. **CDI(Contexts and Dependency Injection)**:...

Global site tag (gtag.js) - Google Analytics