MySQL表自动生成Java实体类

       最近项目中同事开发报表到web页面展示,由于数据库中表字段多达50多个,写起来非常费劲,写下这个工具,

       talk is cheap, show the codes..

   

package com.sf.test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.ArrayUtils;
import com.mysql.jdbc.Statement;

/**
 * UTIL 数据库表反转自动生成实体类
 * 
 * @author zy
 */
public class GenEntity {
	
	private static String[] colnames; // 列名数组
	private static String[] colTypes; // 列名类型数组
	private static int[] colSizes; // 列名大小数组
	private static String[] comments;  //列名注释
	private static boolean f_util = false; // 是否需要导入包java.util.*
	private static boolean f_sql = false; // 是否需要导入包java.sql.*

	/*** 数据库连接常量,需优化.每次运行main方法创建连接CPU损耗率高; **/
	private static final String URL = "jdbc:mysql://drds-m.dbsit.sfdc.com.cn/drds?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true";
	private static final String NAME = "drds";
	private static final String PASS = "3bH8X3In6d";
	private static final String DRIVER = "com.mysql.jdbc.Driver";
	
	/**
	 * 获取数据库连接
	 * @return
	 */
	public static Connection getConnection() {
		Connection conn = null;
		try {
			Class.forName(DRIVER);
			conn = DriverManager.getConnection(URL, NAME, PASS);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		return conn;
	}
	
	public static String nowDateString() {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return dateFormat.format(new Date());
	}
	
	/**
	 * 获取数据中所有表名
	 * @param packageName
	 * @return
	 */
	public static List getMysqlTableName(String packageName) {
		    List tableNames = new ArrayList<>() ;
		 	ResultSet rs = null;
	        try {
	            //获取数据库的元数据
	            DatabaseMetaData db = getConnection().getMetaData();
	            //从元数据中获取到所有的表名
	            rs = db.getTables(null, null, null, new String[] { "TABLE" });
	            while(rs.next()) {
	                tableNames.add(rs.getString(3));
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            try {
	                rs.close();
	            } catch (SQLException e) {
	                e.printStackTrace();
	            }
	        }
	        return tableNames;
	}
	
	/**
	 * 自动生成java类
	 * @param packageName
	 */
	public static void autoCreateClass() {
		System.out.println("===========autoCreateClass  start==============");
		String packageName = GenEntity.class.getPackage().getName();
		List tableName= getMysqlTableName(packageName);
		tableName.stream().forEach(str  ->{
			genEntity(packageName , str);
		});
		System.out.println("===========autoCreateClass  end==============");
	}

	/*
	 * 数据库表反转自动生成实体类
	 * packageName :生成实体类放入指定包中
	 * tableName :数据库表名,需要自动生成的表;
	 */
	public static void genEntity(String packageName,String tableName) {
		
		// 查要生成实体类的表
		String sql = "select * from " + tableName;
		try {
			Connection conn = getConnection();
			Statement stmt = (Statement) conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);  
	        ResultSet rs = stmt.executeQuery(sql);  
	        ResultSetMetaData rsmd = rs.getMetaData() ; 
			int size = rsmd.getColumnCount(); // 统计列
			colnames = new String[size];
			colTypes = new String[size];
			colSizes = new int[size];
			comments = new String[size];
			//数据库表结构sql
			String  showTableSql = "show full columns from " + tableName ;
			//获取表中字段注释
			getFieldComments(stmt , showTableSql);
			
			for (int i = 0; i < size; i++) {
				colnames[i] = rsmd.getColumnName(i+1);
				colTypes[i] = rsmd.getColumnTypeName(i + 1);
				if (colTypes[i].equalsIgnoreCase("datetime") || colTypes[i].equalsIgnoreCase("timestamp")) {
					f_util = true;
				}
				if (colTypes[i].equalsIgnoreCase("image")
						|| colTypes[i].equalsIgnoreCase("text")) {
					f_sql = true;
				}
				colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
			}
			colnames  =  formatColNames(colnames);
			String tempArray[] =  formatColNames(tableName);
			String javaClassName = tempArray[0];
			String content = parse(packageName,javaClassName);

			try {
				File directory = new File("");
				String path = GenEntity.class.getResource("").getPath();

				FileWriter fw = new FileWriter(directory.getAbsolutePath()
						+ "/src/"
						+ path.substring(path.lastIndexOf("/com/", path
								.length()), path.length()) + initcap(javaClassName)
						+ ".java");
				PrintWriter pw = new PrintWriter(fw);
				pw.println(content);
				pw.flush();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			
		}
	}
	
	/**
	 * 获取列名字段注释
	 * @param rs
	 */
	private static void getFieldComments(Statement stat , String sql) {
		 try {
			  ResultSet rs = stat.executeQuery(sql);
			  int i = 0;
			  while (rs.next()) {
				  comments[i]  = rs.getString("Comment");
				  i ++;
	          }
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 将数据库字段变为java中驼峰格式(user_name变为userName)
	 * @param dbKeys
	 * @return
	 */
	private static String[] formatColNames(String... dbKeys) {
		String[] newArray = new String[dbKeys.length];
		if(ArrayUtils.isNotEmpty(dbKeys)){
			int i = 0;
            for(String key : dbKeys){
                String[] words = key.split("_");
                String result = toUppercase4FirstLetter(words);
                newArray[i] = result;
                i ++;
            }
        }
		return newArray;
	}
     
    private static String toUppercase4FirstLetter(String... words){
        StringBuilder buffer = new StringBuilder();
        if(words != null && words.length > 0){
            for(int i=0;i= 'a' && ch[0] <= 'z') {
			ch[0] = (char) (ch[0] - 32);
		}

		return new String(ch);
	}

	/**
	 * 功能:获得列的数据类型,转换成java实体类中类型;
	 * @param sqlType
	 * @return
	 */
	private static String sqlType2JavaType(String sqlType) {

		if (sqlType.equalsIgnoreCase("bit")) {
			return "boolean";
		} else if (sqlType.equalsIgnoreCase("tinyint")) {
			return "byte";
		} else if (sqlType.equalsIgnoreCase("smallint")) {
			return "short";
		} else if (sqlType.equalsIgnoreCase("int")
				|| sqlType.equalsIgnoreCase("integer")
				|| sqlType.equalsIgnoreCase("integer unsigned")
				) {
			return "int";
		} else if (sqlType.equalsIgnoreCase("bigint")) {
			return "long";
		} else if (sqlType.equalsIgnoreCase("float")) {
			return "float";
		} else if (sqlType.equalsIgnoreCase("decimal")
				|| sqlType.equalsIgnoreCase("numeric")
				|| sqlType.equalsIgnoreCase("real")
				|| sqlType.equalsIgnoreCase("money")
				|| sqlType.equalsIgnoreCase("smallmoney")) {
			return "double";
		} else if (sqlType.equalsIgnoreCase("varchar")
				|| sqlType.equalsIgnoreCase("char")
				|| sqlType.equalsIgnoreCase("nvarchar")
				|| sqlType.equalsIgnoreCase("nchar")
				|| sqlType.equalsIgnoreCase("text")) {
			return "String";
		} else if (sqlType.equalsIgnoreCase("datetime") 
				  || sqlType.equalsIgnoreCase("timestamp")
				  || sqlType.equalsIgnoreCase("time")
				  || sqlType.equalsIgnoreCase("date")) {
			return "Date";
		} else if (sqlType.equalsIgnoreCase("image")) {
			return "Blod";
		}

		return null;
	}

	/**
	 * 出口 TODO
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		autoCreateClass();
	}

}


你可能感兴趣的:(java语言,开发工具,sql)