本程序简单实现了数据库内省,生成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();
}
}

Java数据库表自动转化为PO对象的更多相关文章

  1. 通过数据库表自动生成POJO(JavaBean)对象

    主类: package bqw.tool; import java.util.ResourceBundle;import java.sql.DriverManager;import java.sql. ...

  2. java中将jsonObject字符串转化为Map对象

    java中将jsonObject字符串转化为Map对象 1.我们这里使用json-lib包进行转换,可在http://json-lib.sourceforge.net/下载依赖于下面的jar包: ja ...

  3. 吴裕雄--天生自然JAVA数据库编程:处理大数据对象

    import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import j ...

  4. 第二篇 Springboot mybatis generate根据数据库表自动生成实体类、Mapper和Mapper.xml

    源码链接:https://pan.baidu.com/s/1iP4UguBufHbcIEv4Ux4wDw 提取码:j6z9 目录结构如下:只需增加一个generatorConfig.xml文件和在po ...

  5. idea 根据数据库表自动创建持久化类

    一.点击最右边的Database: 二.点击,再点DataSource选择数据库类型,配置数据库信息: 三.打开项目结构,选择,找到你的项目,点击,添加hibernate: 四.如果有现成的cfg.x ...

  6. 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆

    我这里使用的数据库是mysql5.0 数据是上课用的.这些都不是重点,重要的是学会这个方法: 创建好数据库: create database jboadefault character set utf ...

  7. Activiti 数据库表自动生成策略

    Activiti 引擎启动时默认会检测数据库版本与程序版本是否相符,不相符就会抛出异常停止引擎的初始化. 这一策略可以通过引擎的初始化配置参数databaseSchemaUpdate来控制, 如下图的 ...

  8. 根据数据库表自动生成实体类、xml和dao---mybatis

    网盘链接: https://pan.baidu.com/s/1AVGz0bDa_Y5zjk7vXa2eHw 提取码: 2gr6 1.记事本打开generatorConfig.xml文件 2(1,2,3 ...

  9. 使用mybatis-generator-core-1.3.2.jar根据数据库表自动生成实体

    1 导入mybatis-generator-core-1.3.2.jar 2配置mbg.xml <?xml version="1.0" encoding="UTF- ...

随机推荐

  1. Leader之重

    1:合理安排每个CASE并检查每个人每天的工作进度和质量: 这会让一个庞大的工作,或者看上不可能完成的任务,变成可完成的.   2:警惕对立情绪,并寻找交接者: 永远无法控制所有成员对你或者对团队对公 ...

  2. PyCharm中Python代码提示:Shadows name from outer scope

    函数内部的变量,如果和函数被调用的外部的变量一样的话,就被PyCharm中叫做shadows name 这样的话,容易引发不容易觉察到的,由于函数内部和外部的变量名一致而引发的一些问题: 比如:内部函 ...

  3. Asp.Net Core App 部署故障示例 2

    相关阅读:Windows + IIS 环境部署Asp.Net Core App 1.  HTTP Error 502.5 – Process Failure 环境 Windows Server 201 ...

  4. 字符串转换成JSON的三种方式

    采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON ).ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中J ...

  5. 第八章 JVM性能监控与故障处理工具(2)

    注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...

  6. go语言之进阶篇成员操作

    1.成员操作 示例: package main import "fmt" type Person struct { name string //名字 sex byte //性别, ...

  7. 第2章 排序 | 第10节 计数排序练习题 && 基数排序

    对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 计数排序 ...

  8. MyBatis两张表字段名相同产生的问题

    MyBatis两张表字段名相同, 会导致bean属性都映射为第一个表的列, 解决方法: 通过设置别名的方式让其产生区别,如 <select id="queryBySekillId&qu ...

  9. Java基础(六):继承

    1.继承的概念: 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具 ...

  10. Android -- ShortCut

    添加 添加快捷方式是向桌面应用(launcher)发送相关action的广播: public static final String ACTION_ADD_SHORTCUT = "com.a ...