本程序简单实现了数据库内省,生成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. MySQL中的模糊查询和通配符转义

    MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词). 第一种是标准的SQL模式匹配.它有2 ...

  2. 原创D3D几何实例化的DEMO

    CUBE的几何实例化DEMO 鼠标右键按下并拖动         旋转视角WSAD                         前后左右RF                             ...

  3. mysql命令用法复习笔记

    show DATABASES ; create database nulige character set utf8; use nulige; show tables; #创建表 CREATE TAB ...

  4. C#汉字转拼音,可识别多音字,带声调,提供正向、逆向、双向分词算法的小程序

    用C#写了个汉字转拼音的小工具,和网上大部分工具不同,这个通过分词算法,解决了多音字的问题,并且提供声调,可开可关. 如题,用"银行 行不行 行家说了算"举例,如果转拼音却不能识别 ...

  5. 解决: Connection to https://dl-ssl.google.com refused

    第一步: 在 hosts 中增加以下 地址转义 #Google主页203.208.46.146 www.google.com#这行是为了方便打开Android开发官网 现在好像不FQ也可以打开#74. ...

  6. Java的泛型中,通配符可以设置上限和下限

    上限:<? extends T> ?是T和T的子类 下限:<? super T> ?是T和T的父类 怎么看待这个上限和下限呢 首先应该想 其实对于Java来说 <? ex ...

  7. jmeter-The JVM should have exitted but did not

    修改 jmeterengine.force.system.exit=true

  8. IIS 之 Web 服务器上的 ASP.NET 进程模型设置

    配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置. processModel 节只能在 Machine.config 文件中进行设置, ...

  9. T-SQL 之 自定义函数

    和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且作为一个单元进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数,但不可传出参数.输 ...

  10. ubuntu apache2 虚拟主机服务

    ubuntu apache2 虚拟主机服务 本次配置的是一个 ip 对应多个 虚拟主机 1:先检查 ubuntu server 是否已经安装了 apache2 web服务: apache2 -v 看到 ...