bean生成工具

以前用過Eclipse關聯數據庫自動生成bean,但是總是出一些稀奇古怪的問題,所以就上網查一些,寫了一個自己的bean生成工具。


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.ResultSetMetaData;
import java.sql.SQLException;

/**
 * 數據庫錶轉換成javaBean對象小工具(已用了很長時間), 1 bean屬性按原始數據庫字段經過去掉下劃線,並大寫處理首字母等等. 2
 * 生成的bean帶了數據庫的字段說明. 3 各位自己可以修改此工具用到項目中去.
 */
public class MyEntityUtils {
	private String tablename = "";
	private String[] colnames;
	private String[] colTypes;
	private int[] colSizes; // 列名大小
	private int[] colScale; // 列名小數精度
	private boolean importUtil = false;
	private boolean importSql = false;
	private boolean importMath = false;
	private static String url = "";
	private static String user = "";
	private static String password = "";
	private static String rooPath = "C:/Users/wshbo/Workspaces/project1/javaUtils";
	private Connection conn = null;
	private final static MyEntityUtils myEntityUtils = new MyEntityUtils();
    
	private MyEntityUtils() {
	}

	public static MyEntityUtils Instance() {
		return myEntityUtils;
	}

	/**
	 * @param args
	 *            各位按自己的
	 */
	public MyEntityUtils tableToEntity(String tName) {
		tablename = tName;
		// 數據連Connection獲取,自己想辦法就行.
		String strsql = "SELECT * FROM " + tablename;// +" WHERE ROWNUM=1"
														// 讀一行記錄;
		try {
			System.out.println(strsql);
			conn = getConnection();
			PreparedStatement pstmt = conn.prepareStatement(strsql);
			pstmt.executeQuery();
			ResultSetMetaData rsmd = pstmt.getMetaData();
			int size = rsmd.getColumnCount(); // 共有多少列
			colnames = new String[size];
			colTypes = new String[size];
			colSizes = new int[size];
			colScale = new int[size];
			for (int i = 0; i < rsmd.getColumnCount(); i++) {
				rsmd.getCatalogName(i + 1);
				colnames[i] = rsmd.getColumnName(i + 1).toLowerCase();
				colTypes[i] = rsmd.getColumnTypeName(i + 1).toLowerCase();
				colScale[i] = rsmd.getScale(i + 1);
				System.out.println(rsmd.getCatalogName(i + 1));
				if ("datetime".equals(colTypes[i])) {
					importUtil = true;
				}
				if ("image".equals(colTypes[i]) || "text".equals(colTypes[i])) {
					importSql = true;
				}
				if (colScale[i] > 0) {
					importMath = true;
				}
				colSizes[i] = rsmd.getPrecision(i + 1);
			}
			String content = parse(colnames, colTypes, colSizes);
			try {
				FileWriter fw = new FileWriter(rooPath +File.pathSeparator+initcap(tablename) + ".java");
				PrintWriter pw = new PrintWriter(fw);
				pw.println(content);
				pw.flush();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return Instance();
	}

	public Connection getConnection() throws ClassNotFoundException,
			SQLException {
		if (conn == null) {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, user, password);
		}
		return conn;
	}

	/**
	 * 解析處理(生成實體類主體代碼)
	 */
	private String parse(String[] colNames, String[] colTypes, int[] colSizes) {
		StringBuffer sb = new StringBuffer();
		sb.append("\r\nimport java.io.Serializable;\r\n");
		if (importUtil) {
			sb.append("import java.util.Date;\r\n");
		}
		if (importSql) {
			sb.append("import java.sql.*;\r\n\r\n");
		}
		if (importMath) {
			sb.append("import java.math.*;\r\n\r\n");
		}
		// 表註釋
		processColnames(sb);
		sb.append("public class " + initcap(tablename)
				+ " implements Serializable {\r\n");
		processAllAttrs(sb);
		processAllMethod(sb);
		sb.append("}\r\n");
		System.out.println(sb.toString());
		return sb.toString();

	}

	/**
	 * 處理列名,把空格下劃線'_'去掉,同時把下劃線後的首字母大寫 要是整個列在3個字符及以內,則去掉'_'後,不把"_"後首字母大寫.
	 * 同時把數據庫列名,列類型寫到註釋中以便查看,
	 * 
	 * @param sb
	 */
	private void processColnames(StringBuffer sb) {
		sb.append("\r\n/** " + tablename + "\r\n");
		String colsiz = "";
		String colsca = "";
		for (int i = 0; i < colnames.length; i++) {
			colsiz = colSizes[i] <= 0 ? "" : (colScale[i] <= 0 ? "("
					+ colSizes[i] + ")" : "(" + colSizes[i] + "," + colScale[i]
					+ ")");
			sb.append("\t" + colnames[i].toUpperCase() + "    "
					+ colTypes[i].toUpperCase() + colsiz + "\r\n");
			char[] ch = colnames[i].toCharArray();
			char c = 'a';
			if (ch.length > 3) {
				for (int j = 0; j < ch.length; j++) {
					c = ch[j];
					if (c == '_') {
						if (ch[j + 1] >= 'a' && ch[j + 1] <= 'z') {
							ch[j + 1] = (char) (ch[j + 1] - 32);
						}
					}
				}
			}
			String str = new String(ch);
			colnames[i] = str.replaceAll("_", "");
		}
		sb.append("*/\r\n");
	}

	/**
	 * 生成所有的方法
	 * 
	 * @param sb
	 */
	private void processAllMethod(StringBuffer sb) {
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tpublic void set"
					+ initcap(colnames[i])
					+ "("
					+ mySqlType2JavaType(colTypes[i], colScale[i],
							colSizes[i]) + " " + colnames[i] + "){\r\n");
			sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");

			sb.append("\tpublic "
					+ mySqlType2JavaType(colTypes[i], colScale[i],
							colSizes[i]) + " get" + initcap(colnames[i])
					+ "(){\r\n");
			sb.append("\t\treturn " + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");
		}
	}

	/**
	 * 解析輸出屬性
	 * 
	 * @return
	 */
	private void processAllAttrs(StringBuffer sb) {
		sb.append("\tprivate static final long serialVersionUID = 1L;\r\n");
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tprivate "
					+ mySqlType2JavaType(colTypes[i], colScale[i],
							colSizes[i]) + " " + colnames[i] + ";\r\n");
		}
		sb.append("\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);
	}

	/**
	 * Oracle
	 * 
	 * @param sqlType
	 * @param scale
	 * @return
	 */
	private String mySqlType2JavaType(String sqlType, int scale, int size) {
		if (sqlType.equals("integer")) {
			return "Integer";
		} else if (sqlType.equals("long")) {
			return "Long";
		} else if (sqlType.equals("float") || sqlType.equals("float precision")
				|| sqlType.equals("double")
				|| sqlType.equals("double precision")) {
			return "BigDecimal";
		} else if (sqlType.equals("number") || sqlType.equals("decimal")
				|| sqlType.equals("numeric") || sqlType.equals("real")) {
			return scale == 0 ? (size < 10 ? "Integer" : "Long") : "BigDecimal";
		} else if (sqlType.equals("varchar") || sqlType.equals("varchar2")
				|| sqlType.equals("char") || sqlType.equals("nvarchar")
				|| sqlType.equals("nchar")) {
			return "String";
		} else if (sqlType.equals("datetime") || sqlType.equals("date")
				|| sqlType.equals("timestamp")) {
			return "Date";
		}else if (sqlType.equals("bigint")) {
			return "long";
		}
		return null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MyEntityUtils.Instance().tableToEntity("accounts");
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章