java代码实现生成实体类带详细注释

代码是别人写好的,我只是在上面做了些修改,希望能给那些有需要的人带来帮助
DBHelper你们可以用自己的

package test;

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.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Test {
private String packageOutPath;// 指定实体生成所在包的路径
private String authorName;// 作者名字
private String tablename;// 表名
private String databasename;// 数据库名
private List tablenames;// 拿到对应数据库中所有的实体类(实体类需要与其他表明做区分)
private List colnames; // 列名集合
private List colTypes; // 列名类型集合
private boolean f_util = false; // 是否需要导入包java.util.*
private boolean f_sql = false; // 是否需要导入包java.sql.*

/**
 * 构造函数 赋值
 * 
 * @param packageOutPath
 *            要存放的包名
 * @param authorName
 *            作者名字
 * @param tablename
 *            表名
 * @param databasename
 *            数据库名 (表名数据库名只要其中一个就可以)
 */
public Test(String packageOutPath, String authorName, String tablename, String databasename) {
	this.packageOutPath = packageOutPath;
	this.authorName = authorName;
	this.tablename = tablename;
	this.databasename = databasename;
	/*
	 * // 使用properties读取配置文件 Properties prop = new Properties(); try { InputStream
	 * genentity = getClass().getResourceAsStream("/genentity.properties");
	 * prop.load(genentity); if (genentity != null) { genentity.close(); } } catch
	 * (Exception e) { System.out.println("file " + "catalogPath.properties" +
	 * " not found!\n" + e); } this.databasename =
	 * prop.getProperty("databasename").toString(); this.tablename =
	 * prop.getProperty("tablename").toString(); this.packageOutPath =
	 * prop.getProperty("packageOutPath").toString(); this.authorName =
	 * prop.getProperty("authorName").toString();
	 */
}

/**
 * 创建多个实体类
 * 
 * @param tablenames
 *            表名集合
 * @param conn
 *            Connection 连接数据库(已没用)
 */
public void genEntity(List<String> tablenames, Connection conn) {
	// 使用第归生成文件
	for (String tablename : tablenames) {
		this.genEntity(tablename, conn);
	}
}

/**
 * 创建单个实体类
 * 
 * @param tablename
 *            表名
 * @param conn
 *            Connection 连接数据库(已没用)
 */
public void genEntity(String tablename, Connection conn) {
	// SQL语句 查询对应的表
	String sql = "select * from " + tablename;
	Connection con = null;
	PreparedStatement pstmt = null;
	ResultSetMetaData rsmd = null;
	try {
		con = DBHelper.getCon();
		pstmt = con.prepareStatement(sql);
		rsmd = pstmt.getMetaData();
		// 统计有多少列(多少个字段)
		int size = rsmd.getColumnCount();
		// 创建列名集合
		colnames = new ArrayList<String>();
		// 创建列名类型集合
		colTypes = new ArrayList<String>();
		// 有多少列 循环多少次
		for (int i = 0; i < size; i++) {
			// 添加列名到集合中(字段名)
			colnames.add(rsmd.getColumnName(i + 1));
			// 添加列类型到集合中(字段类型)
			colTypes.add(rsmd.getColumnTypeName(i + 1));
			// 如果是时间类型
			if (colTypes.get(i).equalsIgnoreCase("datetime")) {
				// 设置需要导入包java.util.*
				f_util = true;
			}
			// 如果是图片类型 或 文本类型
			if (colTypes.get(i).equalsIgnoreCase("image") || colTypes.get(i).equalsIgnoreCase("text")) {
				// 设置需要导入包java.sql.*
				f_sql = true;
			}
		}
		System.out.println(colnames);
		System.out.println(colTypes);
	} catch (SQLException e1) {
		e1.printStackTrace();
	} finally {
		DBHelper.dbClose(con, pstmt, null);
	}
	// 在内存中生成代码
	String content = parse(tablename);
	// 写入到文件中
	try {
		// 创建文件对象
		File directory = new File("");
		// getAbsolutePath() 返回当前文件的路径
		String outputPath = directory.getAbsolutePath() + "/src/" + this.packageOutPath.replace(".", "/") + "/";
		System.out.println("写出的路径:" + outputPath);
		// 检测路径是否存在,不存在就创建路径
		File path = new File(outputPath);
		// 判断文件是否存在
		if (!path.exists() && !path.isDirectory()) {
			// 如果不存在就新建
			path.mkdir();
			System.out.println(path.exists());
		}
		// 创建文件
		outputPath += initcap(tablename) + ".java";
		File file = new File(outputPath);
		if (!file.exists()) {// 判断文件是否存在
			file.createNewFile();// 如果不存在就创建
		}
		// 写出到硬盘
		FileWriter fw = new FileWriter(file);
		PrintWriter pw = new PrintWriter(fw);
		pw.println(content);
		pw.flush();
		pw.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

public void getAllEntityTable(Connection conn, List<String> tablenames) {
	ResultSet rs = null;
	try {
		DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
		/*
		 * TABLE_CAT String => 表类别(可为 null) TABLE_SCHEM String => 表模式(可为null) TABLE_NAME
		 * String => 表名称 TABLE_TYPE String => 表类型
		 */
		rs = dmd.getTables(null, null, "%", null);// 查询数据库下的所有表
		while (rs.next()) {
			// 添加到集合中
			System.out.println(rs.getString("TABLE_NAME"));
			tablenames.add(rs.getString("TABLE_NAME"));
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

/**
 * 在内存中生成代码
 * 
 * @param tablename
 *            表名
 * @return 返回代码
 */
public String parse(String tablename) {
	StringBuffer sb = new StringBuffer();
	// 判断是否导入工具包
	if (f_util) {
		sb.append("import java.util.Date;\r\n");
	}
	if (f_sql) {
		sb.append("import java.sql.*;\r\n");
	}
	// 导入对应的包(实体类所在的包 src后的包)
	sb.append("package " + this.packageOutPath + ";\r\n");
	sb.append("\r\n");
	// 注释部分
	sb.append(" /**\r\n");
	sb.append(" * " + tablename + " 实体类\r\n");
	// 获取系统时间
	String da = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
	// 时间加作者名
	sb.append(" * " + da + " " + 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方法
	processGz(sb);// 有参构造函数 无参构造函数
	processToString(sb);// toString方法
	sb.append("}\r\n");
	return sb.toString();
}

/**
 * 功能:生成所有属性
 *
 * @param sb
 */
public void processAllAttrs(StringBuffer sb) {
	// 遍历字段集合
	for (int i = 0; i < colnames.size(); i++) {
		// 拼写属性 sqlType2JavaType把数据库字段类型转为java对应的数据类型
		sb.append("\tprivate " + sqlType2JavaType(colTypes.get(i)) + " " + colnames.get(i) + ";\r\n");
	}
}

/**
 * 功能:生成所有方法
 *
 * @param sb
 */
public void processAllMethod(StringBuffer sb) {
	// 遍历字段集合
	for (int i = 0; i < colnames.size(); i++) {
		// 拼写 set方法
		sb.append("\tpublic void set" + initcap(colnames.get(i)) + "(" + sqlType2JavaType(colTypes.get(i)) + " "
				+ colnames.get(i) + "){\r\n");
		sb.append("\t\tthis." + colnames.get(i) + "=" + colnames.get(i) + ";\r\n");
		sb.append("\t}\r\n");

		// 拼写get方法
		sb.append("\tpublic " + sqlType2JavaType(colTypes.get(i)) + " get" + initcap(colnames.get(i)) + "(){\r\n");
		sb.append("\t\treturn " + colnames.get(i) + ";\r\n");
		sb.append("\t}\r\n");
	}
}

/**
 * 生成有参构造函数 无参构造函数
 * 
 * @param sb
 */
public void processGz(StringBuffer sb) {
	// 有参构造函数
	sb.append("\tpublic " + initcap(tablename) + "(");
	// 遍历字段集合
	for (int i = 0; i < colnames.size() - 1; i++) {
		sb.append(sqlType2JavaType(colTypes.get(i)) + " " + colnames.get(i) + ",");
	}
	sb.append(sqlType2JavaType(colTypes.get(colnames.size() - 1)) + " " + colnames.get(colnames.size() - 1)
			+ "){\r\n");
	// 遍历字段集合
	for (int i = 0; i < colnames.size(); i++) {
		sb.append("\t\tthis." + colnames.get(i) + "=" + colnames.get(i) + ";\r\n");
	}
	sb.append("\t}\r\n");

	// 无参构造函数
	sb.append("\tpublic " + initcap(tablename) + "(){\r\n");
	sb.append("\t}\r\n");
}

/**
 * toString方法
 * 
 * @param sb
 */
public void processToString(StringBuffer sb) {
	// toString
	sb.append("\tpublic String toString() {\r\n");
	sb.append("\t\treturn \"Student [");
	// 遍历字段集合
	for (int i = 0; i < colnames.size()-1; i++) {
		sb.append(colnames.get(i) + "=\"+" + colnames.get(i) + "+\",");
	}
	sb.append(colnames.get(colnames.size()-1) + "=\"+" + colnames.get(colnames.size()-1) + "+\"]\";\r\n");
	sb.append("\t}\r\n");
}

/**
 * 功能:将输入字符串的首字母改成大写
 *
 * @param str
 * @return
 */
public String initcap(String str) {
	// 转换为char数组
	char[] ch = str.toCharArray();
	// 如果是小字母
	if (ch[0] >= 'a' && ch[0] <= 'z') {
		// 转换为大写
		ch[0] = (char) (ch[0] - 32);
	}
	return new String(ch);
}

/**
 * 功能:获得列的数据类型
 *
 * @param sqlType
 *            数据库类型名
 * @return 返回java对应的数据类型
 */
public String sqlType2JavaType(String sqlType) {
	if (sqlType.equalsIgnoreCase("bit")) {// 如果是boolean
		return "boolean";
	} else if (sqlType.equalsIgnoreCase("tinyint")) {// 如果是整数
		return "byte";
	} else if (sqlType.equalsIgnoreCase("smallint")) {// 如果是整数
		return "short";
	} else if (sqlType.equalsIgnoreCase("int")) {// 如果是整数
		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) {
	// 包名
	String packageOutPath = "entity";
	// 作者名
	String authorName = "猪";
	// 表名
	String tablename = null;
	// 数据库名
	String databasename = "t222";
	new Test(packageOutPath, authorName, tablename, databasename).start();
}

/**
 * 入口 开始生成实体类
 */
public void start() {
	// 创建连接
	Connection conn = DBHelper.getCon();
	if (databasename != null && !databasename.equals("") && tablename != null && !tablename.equals("")) {
		System.out.println("databasename 和 tablename 不能同时存在");
	} else {
		// 如果配置文件中有数据库名字,则可以拿到其中所有的实体类
		if (databasename != null && !databasename.equals("")) {
			// 获取所有实体表名字
			tablenames = new ArrayList<String>();
			getAllEntityTable(conn, tablenames);
			System.out.println(tablenames);
			// 为每个实体表生成实体类
			genEntity(tablenames, conn);
		} else {
			// 为指定实体表生成实体类
			genEntity(tablename, conn);
		}
		// 关闭数据库连接
		if (conn != null) {
			DBHelper.dbClose(conn, null, null);
		}
	}
}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值