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

转载于:https://www.cnblogs.com/weiyinfu/p/6488913.html

Java数据库表自动转化为PO对象相关推荐

  1. flyway数据库表自动同步更新

    官方文档:Documentation - Flyway by Redgate • Database Migrations Made Easy.https://flywaydb.org/document ...

  2. golang实现将数据库表自动转为结构体的小工具(学习笔记)

    golang实现将数据库表自动转为结构体的小工具 必备条件 代码结构如下 代码详情 config.go init.go tool.go main.go config.json[运行man.go文件的时 ...

  3. Springboot 根据数据库表自动生成实体类和Mapper,只需三步

    前言 大家看看下面这个对话: ps:你...不会就是诡计多端的吴工吧? 如果恰好是,也没事. 看完这一篇,学习只有先知和后知,你看完学会了知道了,就行. 本篇内容: 根据数据库的表 自动生成 代码: ...

  4. idea mysql 创建表_idea 根据数据库表自动创建持久化类

    TODO:Go语言goroutine和channel使用 TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管 ...

  5. IDEA怎么从数据库表自动生成映射Model

    一.绑定数据源 点击右侧 DataBase -> DataSource -> MySQL 填写用户名.密码即可 二.生成 Model 类 右键你要生成 Model 的表 -> Scr ...

  6. java DTO对象与PO对象的相互转换

    2018-09-27 10:27:50 前言: 在实际开发中往往需要DTO对象与PO对象的相互转换: 先说说什么是DTO对象吧,个人觉得DTO就是PO的扩展而已,PO专门指向数据库,DTO作扩展(字段 ...

  7. 人员考勤,MySQL数据库一个表自动生成3表筛选人员迟到早退缺勤

    人员考勤,MySQL数据库一个表自动生成3表筛选人员迟到早退缺勤 </h1><div class="clear"></div><div c ...

  8. JAVA毕业设计国产精品动漫网站计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计国产精品动漫网站计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计国产精品动漫网站计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语 ...

  9. java毕业设计基于动漫电影网站Mybatis+系统+数据库+调试部署

    java毕业设计基于动漫电影网站Mybatis+系统+数据库+调试部署 java毕业设计基于动漫电影网站Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Java ...

最新文章

  1. iota和左移右移的用法
  2. 他们爬了7000家创业公司数据,发现这些领域没那么容易应用AI
  3. 运算方法和运算部件三
  4. [HNOI2017]礼物
  5. linux宝塔类似工具,有没有比宝塔面板更好的linux运维工具?
  6. echo(),print(),print_r(),var_dump()的区别
  7. 阐述oracle的体系结构,Oracle数据库逻辑体系结构详解
  8. Spring Boot基础学习笔记17:Spring Boot默认缓存
  9. 《Reids 设计与实现》第一章 简单动态字符串和链表
  10. 从入门到入土:nmap出击:使用nmap扫描某台靶机,给出并解读靶机环境的配置情况
  11. 算法-粒子群算法-Matlab实现
  12. UVA10880 Colin and Ryan【整除】
  13. [转]android MapView 定位与Overlay onTap事件处理
  14. 计算机测试穿越,计算机的迷雾,如何穿越?
  15. 如何批量清理DWG文件?DWG文件清理教程
  16. matlab fvtool 滤波器频响
  17. An illegal reflective access operation has occurred警告
  18. php 原生session,$_SESSION
  19. winform 窗体无法显示报错“未声明或从未赋值“解决办法
  20. c# 调用c++ lib静态库

热门文章

  1. 代码精进之路读后感(三)
  2. DateTimeFormat注解
  3. 我认为测试应该掌握的SQL语句
  4. 效仿盖茨:PPstream创始人的心路历程
  5. 【实验】修改数据文件名字的三种途径
  6. SQL Server 日期转换格式
  7. 二维数组转datatable的代码
  8. go解析多个html,解析html-Go语言中文社区
  9. 财务报表“难看”,怎么解决?
  10. python学习——正则表达项目