1.创建配置文件jdbc.properties
jdbc.driver = com.mysql.cj.jdbc.Driver
jdbc.user = root
jdbc.password = 1234
jdbc.url = jdbc:mysql://localhost:3306/jiabin?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&allowPublicKeyRetrieval=true
#数据库名
jdbc.database = jiabin
#要创建的包路径
jdbc.packageName = src.main.java.com.hsn.test
#导包路径
jdbc.package = com.hsn.test
2.生成javaBean
public class TableToBean {
public static void main(String[] args) throws Exception {
// 1.数据库连接 Class.forName(Util.getPropertyValue("jdbc.driver"));
Connection connection = DriverManager.getConnection(Util.getPropertyValue("jdbc.url"), Util.getPropertyValue("jdbc.user"), Util.getPropertyValue("jdbc.password"));
DatabaseMetaData metaData = connection.getMetaData(); // 获取数据库的原信息
ResultSet tables = metaData.getTables(Util.getPropertyValue("jdbc.database"), null, null, null);
// 2.创建包
String packageName = Util.getPropertyValue("jdbc.packageName");
String dir = Util.createDir(packageName); // 创建相应的文件目录
// 3.创建javaBean
Util.createJavaBean(metaData, tables, dir);
}
}
3.工具类
public class Util { public final static Map<String, String> SQL_TYPE2JAVA_TYPE = new HashMap<>();
public final static Map<String, String> IMPORT_PACK_MAP = new HashMap<>();
// 需要维护字段数据类型对应java数据类型
static { SQL_TYPE2JAVA_TYPE.put("INT UNSIGNED", "Integer");
SQL_TYPE2JAVA_TYPE.put("VARCHAR", "String");
SQL_TYPE2JAVA_TYPE.put("TIMESTAMP", "Date");
SQL_TYPE2JAVA_TYPE.put("INT", "Integer");
SQL_TYPE2JAVA_TYPE.put("TINYINT", "Byte");
SQL_TYPE2JAVA_TYPE.put("DATETIME", "Date");
SQL_TYPE2JAVA_TYPE.put("CHAR", "String");
SQL_TYPE2JAVA_TYPE.put("TEXT","String");
SQL_TYPE2JAVA_TYPE.put("LONGTEXT","String");
IMPORT_PACK_MAP.put("DATETIME", "import java.util.Date;");
IMPORT_PACK_MAP.put("TIMESTAMP", "import java.util.Date;");
}
/** * 获取配置文件值 * * @param key * @return * @throws IOException */
public static String getPropertyValue(String key) throws IOException {
InputStream in = TableToBean.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties p = new Properties();
p.load(in);
return p.getProperty(key);
}
/** * 创建包 * * @param packageName * @return */
public static String createDir(String packageName) {
String path = null;
try {
StringBuilder rootPath = new StringBuilder(new File("").getCanonicalPath() + File.separator);
String[] fileNames = packageName.split("\\.");
for (String string : fileNames) {
rootPath.append(File.separator).append(string);
}
File file = new File(rootPath.toString());
file.mkdirs(); // 创建多层目录
path = file.getCanonicalPath();
System.out.println("生成路径成功");
} catch (Exception e) {
e.printStackTrace();
System.err.println("生成失败");
}
return path;
}
/** * 根据数据表名替换成类名 * * @param className * @return */
public static String generateClassName(String className) {
StringBuilder stringBuilder = new StringBuilder();
String[] s = className.split("_");
for (String value : s) {
stringBuilder.append(value.substring(0, 1).toUpperCase()).append(value.substring(1));
}
return stringBuilder.toString();
}
/** * 根据数据表名替换成字段名 * * @param columName * @return */
public static String generateColumName(String columName) {
StringBuilder stringBuilder = new StringBuilder();
String[] s = columName.split("_");
for (int i = 0; i < s.length; i++) {
if (i == 0) {
stringBuilder.append(s[i].substring(i, i + 1).toLowerCase()).append(s[i].substring(i + 1)); } else { stringBuilder.append(s[i].substring(0, 1).toUpperCase()).append(s[i].substring(1));
}
}
return stringBuilder.toString();
}
/** * 将生成的PO写到类路径下 * * @param path * @param clazzContent */
public static void writeClazz(String path, String clazzContent) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(new File(path));
fileOutputStream.write(clazzContent.getBytes());
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/** * 创建javaBean * * @param metaData * @param tables * @param dir * @throws Exception */
public static void createJavaBean(DatabaseMetaData metaData, ResultSet tables, String dir) throws Exception {
while (tables.next()) { // System.out.println(tables.getString(1)); // 库名
// System.out.println(tables.getString(2)); // null String tableName = tables.getString(3);// 表名
ResultSet columns = metaData.getColumns(Util.getPropertyValue("jdbc.database"), null, tableName, null);
Map<String, String> dataMap = new HashMap<>();
while (columns.next()) {
String column_name = columns.getString("COLUMN_NAME");// 字段名
String type_name = columns.getString("TYPE_NAME");// 字段类型
dataMap.put(column_name, type_name);
}
// 4.构建类:a、导包 b、构建类信息c、构建属性 d、封装属性 e、创建包 f、创建 JAVA BEAN
StringBuilder clazz = new StringBuilder();
clazz.append("package ").append(Util.getPropertyValue("jdbc.package")).append(";").append("\n");
Set<Map.Entry<String, String>> entries = dataMap.entrySet();
// 导包 for (Map.Entry<String, String> entry : entries) {
String dataType = Util.IMPORT_PACK_MAP.get(entry.getValue());
if (dataType != null && !clazz.toString().contains("import java.util.Date;")) {
clazz.append(dataType).append("\n\n");
}
}
clazz.append("public class ").append(Util.generateClassName(tableName)).append(" {").append("\n\n"); // 构建字段属性
for (Map.Entry<String, String> entry : entries) { String dataType = Util.SQL_TYPE2JAVA_TYPE.get(entry.getValue());
if (dataType != null) { clazz.append("\t").append("private ").append(dataType).append(" ").append(Util.generateColumName(entry.getKey())).append(";" + "\n\n");
}
}
// getter 与 setter
for (Map.Entry<String, String> entry : entries) {
clazz.append("\t" + "public void set").append(Util.generateClassName(entry.getKey())).append("(").append(Util.SQL_TYPE2JAVA_TYPE.get(entry.getValue())).append(" ").append(Util.generateColumName(entry.getKey())).append(") {").append("\n").append("\t\t").append("this.").append(Util.generateColumName(entry.getKey())).append(" ").append("= ").append(Util.generateColumName(entry.getKey())).append(";").append("\n").append("\t").append("}").append("\n\n");
}
for (Map.Entry<String, String> entry : entries) {
clazz.append("\t" + "private ").append(Util.SQL_TYPE2JAVA_TYPE.get(entry.getValue())).append(" get").append(Util.generateClassName(entry.getKey())).append("() {").append("\n").append("\t\t").append("return ").append(Util.generateColumName(entry.getKey())).append(";").append("\n").append("\t").append("}").append("\n\n");
}
clazz.append("}");
Util.writeClazz(dir + File.separator + Util.generateClassName(tableName) + ".java", clazz.toString());
}
}
}
4.注意事项
工具类里有需要维护字段数据类型对应java数据类型的静态代码块,没有兼顾到所有数据库的数据类型,有需要的可以自己手动完善
5.效果展示
感兴趣的小伙伴可以动手试一试呀