JDBC根据数据库生成POJO

本文介绍了一个使用 Java 编写的 POJO 自动生成工具,该工具能够从数据库表结构中读取信息,并根据指定的包名和输出目录生成对应的 Java POJO 类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.环境

JDK6

 

2.代码



import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.yuan.common.file.FileUtil;
import com.yuan.common.util.ReflectUtil;

public class POJOGenerator {

   
   
    public static List<String> getTableNameList(Connection conn)throws SQLException{
        List<String> list = new ArrayList<String>();
        DatabaseMetaData dmd = conn.getMetaData();
        ResultSet tables = dmd.getTables(null, dmd.getUserName(), null, new String[]{"TABLE"});
        while(tables.next()){
            list.add(tables.getString("TABLE_NAME"));
        }
       
        return list;
    }
    public static void generatPOJO(Connection conn, String tableName, String packageName, String outputDir)throws SQLException, ClassNotFoundException, IOException{
        DatabaseMetaData dmd = conn.getMetaData();
        ResultSet columns = dmd.getColumns(null, dmd.getUserName(), tableName, null);
        StringBuilder classBuilder = new StringBuilder();
        classBuilder.append("package ").append(packageName).append(";").append("\n\n");
        classBuilder.append("public class ").append(buildClassName(tableName)).append("{").append("\n\n");
        Map<String, String> fieldMap = new LinkedHashMap<String, String>();
        while(columns.next()){
//            System.out.println(columns.getString("COLUMN_NAME") + ", " + columns.getInt("DATA_TYPE") + ", " + columns.getString("TYPE_NAME"));
            fieldMap.put(columns.getString("COLUMN_NAME"), getClassNameForJavaType(columns.getInt("DATA_TYPE")));
        }
        Set<String> fieldNameSet = fieldMap.keySet();
        for(String fieldName : fieldNameSet){
            classBuilder.append("\tprivate ").append(fieldMap.get(fieldName)).append(" ").append(buildPropertyName(fieldName)).append(";\n");
        }
        classBuilder.append("\n");
        for(String fieldName : fieldNameSet){
            String propertyName = buildPropertyName(fieldName);
            Class<?> fieldType = String.class;
            if(fieldMap.get(fieldName).equals("Boolean")){
                fieldType = Boolean.class;
            }
            classBuilder.append("\tpublic ").append(fieldMap.get(fieldName)).append(" ").append(ReflectUtil.generatReadMethodName(propertyName, fieldType));
            classBuilder.append("(){\n");
            classBuilder.append("\t\t return this.").append(propertyName).append(";\n\t}\n");
            classBuilder.append("\n");
            classBuilder.append("\tpublic void ").append(ReflectUtil.generatWriteMethodName(propertyName)).append("(").append(fieldMap.get(fieldName)).append(" ").append(propertyName).append("){\n");
            classBuilder.append("\t\tthis.").append(propertyName).append(" = ").append(propertyName).append(";\n\t}\n");
            classBuilder.append("\n");
        }
        classBuilder.append("}");
       
        FileUtil.writeToFile(classBuilder.toString(), new File(new File(outputDir), buildClassName(tableName) + ".java").getAbsolutePath());
    }
    private static String buildClassName(String tableName){
        String[] tableNameSections = tableName.split("_");
        StringBuilder tb = new StringBuilder();
        for(String tableNameSection : tableNameSections){
            String tmp = tableNameSection.toLowerCase();
            tb.append(Character.toUpperCase(tmp.charAt(0))).append(tmp.substring(1));
        }
        return tb.toString();
    }
    private static String buildPropertyName(String fieldName){
        String[] fieldNameSections = fieldName.split("_");
        StringBuilder tb = new StringBuilder();
        for(int i=0; i<fieldNameSections.length; i++){
            String tableNameSection = fieldNameSections[i];
            String tmp = tableNameSection.toLowerCase();
            if(i == 0){
                tb.append(tmp);
            }else{
                tb.append(Character.toUpperCase(tmp.charAt(0))).append(tmp.substring(1));
            }
        }
       
        if(tb.toString().equals("class")){
            return "className";
        }
        return tb.toString();
    }
    public static void printInfo(ResultSet rs)throws SQLException{
        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        for(int i=1; i<=numberOfColumns; i++){
            System.out.println("rsmd.getColumnName(i) = " + rsmd.getColumnName(i));
        }
//        while(rs.next()){
//            System.out.println(rs.getString("TABLE_NAME"));
//        }
//        System.out.println("numberOfColumns = " + numberOfColumns);
//        System.out.println("rsmd.getColumnName(1) = " + rsmd.getColumnName(1));
//        System.out.println("rsmd.getColumnLabel(1) = " + rsmd.getColumnLabel(1));
//        System.out.println("rsmd.getColumnType(1) = " + rsmd.getColumnType(1));
        System.out.println("rsmd.getColumnClassName(1) = " + rsmd.getColumnClassName(1));
    }
   
    static String getClassNameForJavaType(int javaType)
    /*     */   {
    /* 730 */     switch (javaType)
    /*     */     {
    /*     */     case -7:
    /*     */     case 16:
    /* 733 */       return "Boolean";
    /*     */     case -6:
    /* 741 */       return "Integer";
    /*     */     case 5:
    /* 749 */       return "Integer";
    /*     */     case 4:
    /* 758 */       return "Long";
    /*     */     case -5:
    /* 763 */         return "Long";
    /*     */
    /*     */     case 2:
    /*     */     case 3:
    /* 770 */       return "java.math.BigDecimal";
    /*     */     case 7:
    /* 773 */       return "Float";
    /*     */     case 6:
    /*     */     case 8:
    /* 777 */       return "Double";
    /*     */     case -1:
    /*     */     case 1:
    /*     */     case 12:
    /* 783 */         return "String";
    /*     */     case -4:
    /*     */     case -3:
    /*     */     case -2:
    /* 795 */        return "byte[]";
    /*     */     case 91:
    /* 801 */       return "java.sql.Date";
    /*     */     case 92:
    /* 804 */       return "java.sql.Time";
    /*     */     case 93:
    /* 807 */       return "java.sql.Timestamp";
    /*     */     }
    /*     */
    /* 810 */     return "Object";
    /*     */   }

}

3. 测试

 

public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.5.29/test?user=root&password=123456");
            List<String> tableNameList = POJOGenerator.getTableNameList(conn);
            for(String tableName : tableNameList){
                POJOGenerator.generatPOJO(conn, tableName, "test", "d:/test/test");
            }
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值