当前位置: 首页 > news >正文

Java数据库表自动转化为PO对象

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

相关文章:

  • 平滑过渡的战争迷雾(一) 原理:Warcraft3地形拼接算法
  • QNAP TS-219P NAS容量扩充
  • jQuery File Upload 判断图片尺寸,限定图片宽高的办法
  • iOS:申请google map key--不要忘了×××
  • shell中检查某个命令是否存在
  • linux apache工作模式:prefork和worker详解
  • Excel中日期相减除去周六周日求算法
  • 基于动态基线的业务运营支撑网异常流量检测研究
  • Python配合SCP实现文件批量下发
  • grep -v、-e、-E
  • 读取配置文件参数
  • 九度oj 题目1087:约数的个数
  • 信号 signal sigaction补充
  • 32. SQL -- 管理数据库和数据库表(1)
  • 连接到 JasperReports Server
  • Akka系列(七):Actor持久化之Akka persistence
  • CSS3 变换
  • es6(二):字符串的扩展
  • Flannel解读
  • HTML-表单
  • JavaScript设计模式系列一:工厂模式
  • js学习笔记
  • Solarized Scheme
  • Vue全家桶实现一个Web App
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 仿天猫超市收藏抛物线动画工具库
  • 后端_ThinkPHP5
  • 经典排序算法及其 Java 实现
  • 区块链分支循环
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 2017年360最后一道编程题
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #、%和$符号在OGNL表达式中经常出现
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • ()、[]、{}、(())、[[]]命令替换
  • (rabbitmq的高级特性)消息可靠性
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)mysql_MYSQL(三)
  • (原)本想说脏话,奈何已放下
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)http-server应用
  • (转)母版页和相对路径
  • ./configure、make、make install 命令
  • .NET CLR基本术语
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NetCore项目nginx发布
  • .net和php怎么连接,php和apache之间如何连接