java代码自动生成数据库表中对应的类文件及操作数据库功能
发布日期:2021-05-16 08:06:02 浏览次数:24 分类:精选文章

本文共 7017 字,大约阅读时间需要 23 分钟。

Java代码自动生成数据库表中对应的类文件及操作数据库功能(工具类)

一、项目背景

在软件开发过程中,常常需要根据数据库表结构自动生成相应的Java类文件,并对数据库进行 CRUD(Create, Read, Update, Delete)操作。手动编写这些代码不仅繁琐,而且容易出现错误。本文将介绍一种基于 JDBC 的工具类,能够自动化完成上述任务。


二、工具类功能概述

1. 创建数据库和数据库表

  • 使用 MySQL 数据库创建数据库和表结构。
  • 建议使用 InnoDB 存储引擎。

2. 导入依赖库

  • MySQL JDBC 驱动:mysql-connector-java-5.1.47.jar
  • c3p0 连接池:c3p0-0.9.5.1.jar
  • 可选:mchange-commons-java-0.2.10.jar

3. 工具类配置

  • 配置数据库连接池信息,通过 XML 文件完成数据库配置。
  • 确保数据库驱动加载正确。

4. 工具类功能

1. 自动生成数据库表对应的Java类文件

  • autoGenerateAllBean(String url):根据指定路径生成所有数据库表对应的Java类文件。
  • autoGenerateFormatBean(String table, String url):根据指定表名生成对应的Java类文件。

2. 数据查询功能

  • dql(String sql, Class<E> c, Object... obj):执行数据查询,返回结果集合。
  • 支持参数化查询,通过 ? 占位符传递参数值。

3. 数据操作功能

  • dml(Connection con, String sql, Object... obj):执行数据操作(插入、更新、删除),支持事务管理。
  • dml(String sql, Object... obj):不支持事务的数据操作方法。

三、工具类核心实现

1. 连接池配置

ComboPooledDataSource dpds = new ComboPooledDataSource();try {    dpds.setDriverClassName("com.mysql.jdbc.Driver");    // 读取数据库配置文件    dpds.setDataSourceClassName("com.mchange.v2.c3p0 ComboPooledDataSource");    dpds.setProperty("driverClassName", "com.mysql.jdbc.Driver");    dpds.setProperty("databaseUrl", "jdbc:mysql://localhost:3306/test");    dpds.setProperty("username", "root");    dpds.setProperty("password", "root");} catch (Exception e) {    e.printStackTrace();}

2. Java类自动生成

public class MyJDBCutil {    private static ComboPooledDataSource dpds;    static {        dpds = new ComboPooledDataSource();    }    public static Connection getCon() {        Connection con = null;        try {            con = dpds.getConnection();        } catch (Exception e) {            e.printStackTrace();        }        return con;    }    // 生成Java类文件    public static void autoGenerateAllBean(String url) {        Connection con = getCon();        try {            Statement statement = con.createStatement();            ResultSet rs = statement.executeQuery("select * from test");            while (rs.next()) {                autoGenerateFormatBean(rs.getString(1), url);            }            rs.close();            statement.close();            con.close();        } catch (Exception e) {            e.printStackTrace();        }    }    // 生成单个Java类文件    public static void autoGenerateFormatBean(String table, String url) {        Connection con = getCon();        try {            Statement statement = con.createStatement();            ResultSet rs = statement.executeQuery("select * from " + table);            while (rs.next()) {                String className = table.substring(1).replace(".", "");                File file = new File(new File(url), className + ".java");                FileWriter fw = new FileWriter(file);                BufferedWriter bw = new BufferedWriter(fw);                bw.write("package " + url + ";");                bw.newLine();                // 写入字段信息                HashMap
names = new HashMap<>(); ArrayList
nameList = new ArrayList<>(); ResultSetMetaData meta = rs.getMetaData(); for (int i = 0; i < meta.getColumnCount(); i++) { String columnLabel = meta.getColumnLabel(i + 1); String columnTypeName = meta.getColumnTypeName(i + 1); names.put(columnLabel, dbTOJava(columnTypeName)); nameList.add(columnLabel); } // 写入类体 bw.write("public class " + className + " {"); bw.newLine(); // 写入字段 for (String key : nameList) { String value = names.get(key); bw.write(" private " + value + " " + key + ";"); bw.newLine(); } bw.newLine(); // 写入无参构造函数 bw.write(" public " + className + "() {"); bw.newLine(); bw.write(" super();"); bw.newLine(); bw.write(" }"); bw.newLine(); // 写入全参构造函数 bw.write(" public " + className + "("); for (int i = 0; i < nameList.size(); i++) { String key = nameList.get(i); if (i != nameList.size() - 1) { bw.write(names.get(key) + " " + key + ","); } else { bw.write(names.get(key) + " " + key); } } bw.write(") {"); bw.newLine(); for (String key : nameList) { bw.write(" this." + key + " = " + key + ";"); bw.newLine(); } bw.write(" }"); bw.newLine(); // 写入 getter 和 setter 方法 for (String key : nameList) { String value = names.get(key); bw.write(" public " + value + " get" + key.toUpperCase().charAt(0) + key.substring(1) + "() {"); bw.newLine(); bw.write(" return this." + key + ";"); bw.newLine(); bw.write(" }"); bw.newLine(); bw.write(" public void set" + key.toUpperCase().charAt(0) + key.substring(1) + "(" + value + " " + key + ") {"); bw.newLine(); bw.write(" this." + key + " = " + key + ";"); bw.newLine(); bw.write(" }"); bw.newLine(); } // 写入 toString 方法 bw.write(" @Override"); bw.newLine(); bw.write(" public String toString() {"); bw.newLine(); bw.write(" return \"" + className + " " + nameList.toString() + "\";"); bw.newLine(); bw.write(" }"); bw.write("}"); bw.flush(); bw.close(); } rs.close(); statement.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } // 数据库类型转换 private static String dbTOJava(String type) { if (type.equals("INT")) { return "int"; } else if (type.equals("VARCHAR") || type.equals("CHAR")) { return "String"; } else if (type.equals("DOUBLE")) { return "double"; } else if (type.equals("FLOAT")) { return "float"; } else if (type.equals("TIMESTAMP") || type.equals("DATETIME") || type.equals("DATE") || type.equals("TIME")) { return "Timestamp"; } else { return "Object"; } }}

3. 使用说明

  • 调用 autoGenerateAllBean(String url),将 url 参数设置为生成Java类文件的路径。
  • 调用 autoGenerateFormatBean(String table, String url),指定数据库表名和生成文件路径。
  • 数据查询方法 dql(String sql, Class<E> c, Object... obj),支持参数化查询。
  • 数据操作方法 dml(Connection con, String sql, Object... obj),支持事务管理。

四、工具类优势

  • 自动化生成:通过工具类即可快速生成Java类文件,减少手动编码工作量。
  • 高效管理:支持事务管理和参数化查询,提高数据库操作效率。
  • 灵活配置:可根据需求配置数据库连接池和生成文件路径。
  • 通过以上工具类,可以快速完成数据库表结构与Java类文件的映射,并对数据库进行基本操作,简化开发流程。

    上一篇:html 使用js中dom对象完成复选框的 全选,取消全选和反选
    下一篇:mysql数据库 二十一练习题 及答案 (mysql练习题)

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年05月01日 22时37分08秒