本程序简单实现了数据库内省,生成PO对象。

数据库内省有如下两种实现方式:

  • 通过mysql元表
  • 通过desc table,show tables等命令
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.*;
import java.util.ArrayList;
import java.util.List; public class Generator {
class Table {
String name;
List<String> fieldList = new ArrayList<>();
List<String> typeList = new ArrayList<>();
} final static String database = "valley";
final static String url = "jdbc:mysql://localhost:3306/" + database + "?serverTimezone=Asia/Shanghai";
final static String user = "root", password = "123";
final static String targetFolder = "src/main/java/valley/po";
final static String packageName="valley.po";
final static String tab = " ";
final static List<Table> tables = new ArrayList<>(); String convertType(String sqlType) {
if (sqlType.startsWith("varchar")) return "String";
if (sqlType.startsWith("bigint")) return "Long";
if (sqlType.startsWith("int")) return "Integer";
if (sqlType.startsWith("smallint")) return "Short";
if (sqlType.startsWith("tinyint")) return "Byte";
if(sqlType.startsWith("double"))return "Double";
return null;
} String convertField(String field) {
return field;
} //表名中只允许字母和下划线,并且下划线不能连续两道
String convertTableName(String name) {
StringBuilder builder = new StringBuilder();
if (name.charAt(0) != '_') builder.append(Character.toUpperCase(name.charAt(0)));
for (int i = 1; i < name.length(); i++) {
if (name.charAt(i) == '_') continue;
if (name.charAt(i - 1) == '_') {
builder.append(Character.toUpperCase(name.charAt(i)));
} else {
builder.append(name.charAt(i));
}
}
builder.append("Po");
return builder.toString();
} String uppercaseFirstLetter(String s) {
return Character.toUpperCase(s.charAt(0)) + s.substring(1);
} void writeTableToFile(Table table, PrintWriter writer) {
StringBuilder fields = new StringBuilder();
StringBuilder gettersAndSetters = new StringBuilder();
for (int i = 0; i < table.fieldList.size(); i++) {
String field = table.fieldList.get(i), type = table.typeList.get(i);
fields.append(String.format("\t%s %s;\n", type, field));
String uppercase = uppercaseFirstLetter(field);
gettersAndSetters.append(String.format("\t%s get%s(){\n\t\treturn %s;\n\t}\n", type, uppercase, field));
gettersAndSetters.append(String.format("\tvoid set%s(%s a%s){\n\t\t%s=a%s;\n\t}\n", uppercase, type, uppercase, field, uppercase));
}
String ans = String.format("package %s;\n\nclass %s{\n%s\n%s\n}",packageName, table.name, fields, gettersAndSetters);
ans = ans.replace("\t", tab);
writer.printf(ans);
writer.close();
} void output() throws IOException {
Path folder = Paths.get(targetFolder);
if (Files.exists(folder) == false) {
Files.createDirectory(folder);
}
for (Table i : tables) {
Path file = folder.resolve(i.name + ".java");
writeTableToFile(i, new PrintWriter(Files.newBufferedWriter(file)));
}
} void init() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(url, user, password);
Statement showTablesStatement = connection.createStatement();
ResultSet showTablesResultSet = showTablesStatement.executeQuery("show tables");
while (showTablesResultSet.next()) {
Table t = new Table();
t.name = convertTableName(showTablesResultSet.getString(1));
Statement descTableStatement = connection.createStatement();
ResultSet descTableResult = descTableStatement.executeQuery("desc " + showTablesResultSet.getString(1));
while (descTableResult.next()) {
t.fieldList.add(convertField(descTableResult.getString(1)));
t.typeList.add(convertType(descTableResult.getString(2)));
}
tables.add(t);
descTableResult.close();
descTableStatement.close();
}
showTablesResultSet.close();
showTablesStatement.close();
connection.close();
} Generator() throws Exception {
init();
output();
} public static void main(String[] args) throws Exception {
new Generator();
}
}

最新文章

  1. 单台机器配置redis多实例
  2. Python终端如何输出彩色字体
  3. [蟒蛇菜谱]Python函数参数传递最佳实践
  4. Codeforces 552C Vanya and Scales(思路)
  5. CDOJ 435 (SCOI 2011) 糖果 Label:差分约束系统
  6. IS上部署MVC网站,打开后ExtensionlessUrlHandler-
  7. hdu 2091 空心三角形
  8. [iOS基础控件 - 6.0] UITableView
  9. java下io文件切割合并功能加配置文件
  10. Keil伪指令
  11. Html 加载音乐代码mp3
  12. VM 443端口冲突解决办法
  13. 【SQL】T-SQL基本语法复习
  14. 如何参与flink开源项目
  15. windows 下 修改jmeter ServerAgent端口
  16. 基于MFC的socket编程
  17. jenkins 通过shell启动tomcat会随着job完成而被自动关闭的解决方法
  18. Office Online Server2016安装手册
  19. C++设计模式 之 “对象性能” 模式:Singleton、Flyweight
  20. NOIP 2002提高组 选数 dfs/暴力

热门文章

  1. Flask 学习(三)模板
  2. mac下virtualbox安装win7系统
  3. 洛谷P1772 [ZJOI2006]物流运输 题解
  4. 学习笔记:A*算法
  5. SVN使用小结
  6. go语言之进阶篇成员操作
  7. 【Other】最近在研究的, Java/Springboot/RPC/JPA等
  8. Java--解压缩zip包
  9. WordPress 无法使用the_content()方法输出内容
  10. [INS-30131]执行安装程序验证所需的初始设置失败(原因:无法访问临时位置)