一个丑丑的代码生成器

一时起兴写的,就是想到什么就写什么,毫无逻辑可言,就是简单的字符串拼接,与文件存取

这个生成器只是一个简易的生成属性定义,构造器,getter and setter方法,还有toString方法,且数据库数据类型和Java数据类型映射远远不完整,只有简单的几个类型,使用的话需要数据库连接配置properties文件,置于src目录下

public class TableToEntity {

	static List<String> classNames = new ArrayList<String>();
	static DatabaseMetaData dmd;
	static Map<String, String> map = new HashMap<String, String>();
	static String path;

	static {
		try {
			dmd = DbUtils.getConn().getMetaData();
			getTableName();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 获取表名称
	private static void getTableName() {
		try {
			String[] str = { "TABLE" };
			ResultSet rs = dmd.getTables(null, null, null, str);
			while (rs.next()) {
				classNames.add(rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 获取表字段
	private static void getTableField(String tname) {
		map.clear();
		try {
			ResultSet rs = dmd.getColumns(null, null, tname, null);
			while (rs.next()) {
				map.put(rs.getString(4), rs.getString(6).toLowerCase());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 转化为java类型
	private static String toJavaType(String sqlType) {
		if (sqlType.contains("int")) {
			return "int";
		} else if (sqlType.contains("char")) {
			return "String";
		} else if (sqlType.contains("timestamp") || sqlType.contains("datetime")) {
			return "Timestamp";
		} else if (sqlType.contains("bit")) {
			return "boolean";
		} else if(sqlType.contains("double")){
			return "double";
		} else {
			return "Object";
		}
	}
	
	// 得到包路径
	private static String getPath(String path){
		String str = null;
		if(path.contains("\\\\")){
			str = path.replaceAll("\\\\", ".");
		}else{
			str = path.replaceAll("/", ".");
			
		}
		str = str.substring(str.lastIndexOf("com"));
		return str;
	}
	// 将首字母变为大写
	private static String firstToUper(String str) {
		char[] c = str.toCharArray();
		c[0] = (char) (c[0] - 32);
		return new String(c);
	}

	// 得到属性定义字符串
	private static String getFieldStr(String className) {
		StringBuffer sb = new StringBuffer();
		Set<String> key = map.keySet();
		sb.append("package " + getPath(path)+";\r\n\r\n");
		Iterator<String> it = key.iterator();
		sb.append("public class " + className + " {\r\n\r\n");
		while (it.hasNext()) {
			String s = it.next();
			sb.append("\tprivate " + toJavaType(map.get(s)) + " " + s + ";\r\n");
		}
		sb.append("\r\n");
		return sb.toString();
	}

	// 得到构造器字符串
	private static String getConstrutorStr(String className) {
		StringBuffer sb = new StringBuffer();
		// 默认构造器
		sb.append("\tpublic " + className + "(){}\r\n");
		// 有参构造器
		sb.append("\tpublic " + className + "(");
		Set<String> key = map.keySet();
		Iterator<String> it = key.iterator();
		String s = null;
		int count = 1;
		int size = map.size();
		while (it.hasNext()) {
			s = it.next();
			if (count != size) {
				sb.append(toJavaType(map.get(s)) + " " + s + ", ");
			} else {
				sb.append(toJavaType(map.get(s)) + " " + s + " ");
			}
			count++;
		}
		sb.append("){\r\n");
		it = key.iterator();
		while (it.hasNext()) {
			s = it.next();
			sb.append("\t\tthis." + s + " = " + s + ";\r\n");
		}
		sb.append("\t}\r\n\r\n");
		return sb.toString();
	}

	// 得到getter,setter字符串
	private static String getAndSetStr() {
		StringBuffer sb = new StringBuffer();
		Set<String> key = map.keySet();
		Iterator<String> it = key.iterator();
		String s = null;
		while (it.hasNext()) {
			s = it.next();
			sb.append("\tpublic " + toJavaType(map.get(s)) + " get" + firstToUper(s) + "(){\r\n");
			sb.append("\t\treturn this." + s + ";\r\n\t}\r\n");
			sb.append("\tpublic void set" + firstToUper(s) + "(" + toJavaType(map.get(s)) + " " + s + "){\r\n");
			sb.append("\t\tthis." + s + " = " + s + ";\r\n\t}\r\n");
		}
		return sb.toString();
	}

	// 得到toString字符串
	private static String getToStringStr(String className) {
		StringBuffer sb = new StringBuffer();
		Set<String> key = map.keySet();
		Iterator<String> it = key.iterator();
		sb.append("\n\tpublic String toString(){\r\n");
		sb.append("\t\treturn \"" + className + " [");
		int size = map.size();
		int count = 1;
		while (it.hasNext()) {
			String s = it.next();
			if (count != size) {
				sb.append(s + "=\" + " + s + " + \", ");
			} else {
				sb.append(s + "=\" + " + s + " + \"]\";\r\n\t}\r\n}");
			}
			count++;
		}
		return sb.toString();
	}

	// 生成单个java文件
	public static void genOneTable(String path, String tableName) {
		TableToEntity.path = path;
		getTableField(tableName);
		File file = new File(path, tableName + ".java");
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new FileWriter(file));
			bw.write(getFieldStr(tableName));
			bw.write(getConstrutorStr(tableName));
			bw.write(getAndSetStr());
			bw.write(getToStringStr(tableName));
			bw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 生成全部指定数据库中的全部表的java文件
	public static void genAllTable(String path) {
		for (String className : classNames) {
			genOneTable(path, firstToUper(className));
		}
	}
}

测试类

public class Test {
	
	public static void main(String[] args) {
		// 获得单独的一张表,将其结果放入指定路径中(路径需为正确的包路径,不然导包会失败,需要手动导包)
		TableToEntity.genOneTable("src/com/helloworld/hrms", "Salary");
		// 获得一个数据库中的全部表格
//		TableToEntity.genAllTable("src/com/helloworld/hrms");
	}
}

properties文件

jdbc.url = jdbc:mysql://127.0.0.1:3306/hrms
jdbc.username = root
jdbc.password = root

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值