欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java代码自动生成数据库表中对应的类文件及操作数据库功能

程序员文章站 2022-03-19 16:11:37
java代码自动生成数据库表中对应的类文件及操作数据库功能1. 创建数据库和数据库表2. 导入mysql jar包(mysql-connector-java-5.1.47)及mchange-commons-java-0.2.10(可选项)3. 导入c3p0的jar包(c3p0-0.9.5.1)和配置文件(xml)并完成配置方法(工具类):MyJDBCutil.autoGenerateAllBeanS(String url);参数:url – 生成class文件的路径作用:自动生成数据库...

java代码自动生成数据库表中对应的类文件及操作数据库功能


1. 创建数据库和数据库表
2. 导入mysql jar包(mysql-connector-java-5.1.47)及mchange-commons-java-0.2.10(可选项)
3. 导入c3p0的jar包(c3p0-0.9.5.1)和配置文件(xml)并完成配置
4. 书写以下java语句(工具类)

所需工具下载链接:https://download.csdn.net/download/weixin_51311218/13971936


方法(工具类):


  • MyJDBCutil.autoGenerateAllBeanS(String url);
  • 参数:url – 生成class文件的路径
  • 作用:自动生成数据库中对应表中的类文件


  • MyJDBCutil.autoGenerateFormatBean(String table,String url);
  • 参数1:数据库中的表名
  • 参数2:生成class文件的路径
  • 作用:自动生成数据库中对应表中的类文件


  • 数据查询DQL(select)
  • Arrlist<E> list = MyJDBCutil.dql(String sql,Class<E> c,Object …obj);
  • 参数1:数据查询的sql语句
  • 参数2:需要查询的表对应的class文件
  • 参数3:sql语句“?”占位符所占位的元素
  • 返回值:对应的集合
  • 作用:查询方法,通过sql语句获取对应的集合


  • 数据操纵DML(delete/update/insert)
  • MyJDBCutil.dml(Connection con,String sql,Object … obj)
  • 参数1:事务的连接
  • 参数2:数据操纵的sql语句
  • 参数3:sql语句“?”占位符所占位的元素
  • 作用:支持事务的数据操纵方法


- MyJDBCutil.dml(String sql,Object ... obj) - 参数1:数据操纵的sql语句 - 参数2:sql语句“?”占位符所占位的元素 - 作用:不支持事务的数据操纵方法
package com.yunhe.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
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;
    }

    //更新方法
    public static int dml(String sql,Object ... obj)  {
        Connection con = getCon();//获取连接
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            for (int i=0;i<obj.length;i++){
                ps.setObject(i+1,obj[i]);
            }
            return ps.executeUpdate();
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }finally {
            close(con);
        }
    }

    //支持事务的更新方法
    public static int dml(Connection con,String sql,Object ... obj) throws SQLException {
        con.setAutoCommit(false);
            PreparedStatement ps = con.prepareStatement(sql);
            for (int i=0;i<obj.length;i++){
                ps.setObject(i+1,obj[i]);
            }
            return ps.executeUpdate();
    }

    //查询方法
    public static <E> ArrayList<E> dql(String sql,Class<E> c, Object ...obj)  {
        Connection con = getCon();//获取连接
        ArrayList<E> list=new ArrayList<>();
        ResultSet rs=null;
        try {
            PreparedStatement ps = con.prepareStatement(sql);
            for (int i=0;i<obj.length;i++){
                ps.setObject(i+1,obj[i]);
            }
            ResultSetMetaData metaData = ps.getMetaData();//获取查询元数据
            //元数据中包含所有关于本次sql查询的数据(不包含结果数据)
            //获取查询结果返回数据列的数目
            int columnCount = metaData.getColumnCount();
            //创建对应长度的数组用于保存相应的列名
            String [] colimNameArr=new String[columnCount];
            //循环获取指定列名名存储至数组中
            for (int i=0;i<colimNameArr.length;i++){
                //  colimNameArr[i]=metaData.getColumnName(i+1);
                colimNameArr[i]=metaData.getColumnLabel(i+1);
            }
             rs = ps.executeQuery();
            while(rs.next()){
                //使用反射调用泛型类的无参构造方法创建对象
                E e= c.newInstance();
                //数组循环获取对应列的数据
                for (String colName:colimNameArr) {
                    Object value = rs.getObject(colName);//获取指定列的数据
                    //使用反射获取指定属性
                    //获取代表当前列  指定类的属性类型
                    //获取指定名称的代表指定属性的类型对象
                    Field declaredField = c.getDeclaredField(colName);
                    //为指定属性的类型对象授权 (私有属性必须授权后才能使用)
                    declaredField.setAccessible(true);
                    //为指定对象 对应属性赋值
                    declaredField.set(e,value);
                }
                list.add(e);
            }
            return list;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }finally {
            close(rs,con);
        }
    }


    //关闭方法
    public static void close(Connection con){
        try {
            con.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    public static void close(ResultSet rs,Connection con){
        try {
            rs.close();
            con.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    // 自动生成当前连接数据库所有bean对象保存至指定包下
    public static void autoGenerateAllBeanS(String beanUrl) {
        try {
            Connection con = getCon();
            String sql = "show tables";
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                autoGenerateFormatBean(rs.getString(1), beanUrl);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void autoGenerateFormatBean(String tables, String beanUrl) {
        String sql = "select * from " + tables;

        try {
            File directory = new File("");// 参数为空
            String courseFile = directory.getCanonicalPath();// 获取当前项目路径
            String replace = "src/" + beanUrl.replace(".", "/");
            String beanNane = tables.toUpperCase().charAt(0) + tables.substring(1);// 当前类名
            File file = new File(courseFile, replace + "/" + beanNane + ".java");// 当前类的文件对象
            file.createNewFile();
            Connection con = getCon();
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSetMetaData metaData = ps.getMetaData();
            // 创建map集合 key为列名 value为对应的java类型
            HashMap<String, String> names = new HashMap<>();
            // 创建list集合存储所有的属性(顺序)
            ArrayList<String> nameList = new ArrayList<>();

            for (int i = 0; i < metaData.getColumnCount(); i++) {
                String columnLabel = metaData.getColumnLabel(i + 1);// 获取指定列名
                String columnTypeName = metaData.getColumnTypeName(i + 1);// 获取列类型
                names.put(columnLabel, dbTOjava(columnTypeName));
                nameList.add(columnLabel);
            }

            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            // 书写包
            bw.write("package " + beanUrl + ";");
            bw.newLine();
            bw.newLine();
            // 书写导入包
            bw.write("import java.sql.*;");
            bw.newLine();
            bw.newLine();
            // 书写类名
            bw.write("public class " + beanNane + " {");
            bw.newLine();
            // 生成全部属性
            for (String key : nameList) {
                String value = names.get(key);
                bw.write("	private " + value + " " + key + ";");
                bw.newLine();
            }
            bw.newLine();
            // 生成无参构造方法
            bw.write("	public " + beanNane + "() {");
            bw.newLine();
            bw.write("		super();");
            bw.newLine();
            bw.write("	}");
            bw.newLine();
            bw.newLine();
            // 生成全参构造方法
            bw.write("	public " + beanNane + "(");
            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();
            bw.write("		super();");
            bw.newLine();

            for (String key : nameList) {
                bw.write("		this." + key + " = " + key + ";");
                bw.newLine();
            }
            bw.write("	}");
            bw.newLine();
            bw.newLine();
            // 生成全部属性对应getset方法
            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.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();
                bw.newLine();
            }

            for (int i = 0; i < nameList.size(); i++) {
                String string = nameList.get(i);

                nameList.set(i, string + "= \"+ " + string + " + \"");
            }
            // 生成toString方法
            bw.write("	@Override");
            bw.newLine();
            bw.write("	public String toString() {");
            bw.newLine();
            bw.write("		return \"" + beanNane + " ");
            bw.write(nameList.toString());
            bw.write("\";");
            bw.newLine();
            bw.write("	}");
            bw.newLine();
            bw.write("}");
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 转换方法 将数据库列对象转换为指定java类型字符串
    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";
        }
    }
}

本文地址:https://blog.csdn.net/weixin_51311218/article/details/111872320

相关标签: java