一时起兴写的,就是想到什么就写什么,毫无逻辑可言,就是简单的字符串拼接,与文件存取
这个生成器只是一个简易的生成属性定义,构造器,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