1. 程式人生 > >根據表生成實體類的工具類

根據表生成實體類的工具類

package com.zsf.shenzhou.customer.po;



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.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.RowId;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
public class util {
	private String authorName = "史先鋒";//作者名字
	private String[] colnames; // 列名陣列
	private String[] colTypes; //列名型別陣列
	private String[] colComment; //列名註釋陣列
	private int[] colSizes; //列名大小陣列
	private boolean f_util = false; // 是否需要匯入包java.util.*
	private boolean f_sql = false; // 是否需要匯入包java.sql.*
	public static List<String> TBlist() throws SQLException { 
	    List list = null; 
	    Connection  con = JDBCUtils.getConnection();
		String sql="select table_name from information_schema.tables where table_schema='xianfengdb'";
		PreparedStatement ps = con.prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
		   if (rs != null) {
		      list = new ArrayList();
		    }
		    while (rs.next())
		    {
		      String tableName = rs.getString("table_name");
		      list.add(tableName);
		    }
		    JDBCUtils.colseResource(con, ps, rs);
	    return list;
	}
	/*
	 * 建構函式
	 */
	public void GenEntityMysql(String tablename,String packageOutPath) throws SQLException{
		
    	//建立連線
    	Connection  con = JDBCUtils.getConnection();
		//查要生成實體類的表
    	String sql = "SELECT COLUMN_NAME,COLUMN_TYPE,column_comment FROM INFORMATION_SCHEMA.Columns WHERE table_name=" + "'"+tablename+"'";
    	PreparedStatement ps = con.prepareStatement(sql);	
		ResultSet rs = ps.executeQuery();
		int size = getColumnSize(tablename);
		colnames = new String[size];
		colTypes = new String[size];
		colSizes = new int[size];
		colComment= new String[size];
		int i=0;	 
		while (rs.next())
		    {
		      String column_name = rs.getString("column_name");
		      colnames[i]=column_name;
		      String column_type = rs.getString("column_type");
		      System.out.println("+----"+column_type);
		      colTypes[i]=column_type;
		      if(colTypes[i].equalsIgnoreCase("datetime")){
					f_util = true;
				}
		      if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){
					f_sql = true;
				}
		      String column_comment = rs.getString("column_comment");
		      colComment[i]=column_comment;
		     System.out.println("+----"+column_comment);
		      colSizes[i]=1;
		      i++;		      
		    }
		JDBCUtils.colseResource(con, ps, rs);
		String tableComment= getTableCommentByTName(tablename);
		String content = parse(tableComment,colnames,colTypes,colSizes,tablename,packageOutPath);
			try {
				File directory = new File("");
				
				String path=this.getClass().getResource("").getPath();
				System.out.println(path);
				System.out.println("src/?/"+path.substring(path.lastIndexOf("/com/", path.length())) );
//				String outputPath = directory.getAbsolutePath()+ "/src/"+path.substring(path.lastIndexOf("/com/", path.length()), path.length()) + initcap(tablename) + ".java";
				String outputPath = directory.getAbsolutePath()+ "/src/main/java/"+packageOutPath.replace(".", "/")+"/"+initcap(tablename) + ".java";
				FileWriter fw = new FileWriter(outputPath);
				PrintWriter pw = new PrintWriter(fw);
				pw.println(content);
				pw.flush();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
    }
 
	/**
	 * 功能:生成實體類主體程式碼
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @return
	 */
	private String parse(String tablecomment,String[] colnames, String[] colTypes, int[] colSizes,String tablename,String packageOutPath) {
		StringBuffer sb = new StringBuffer();
		
		//判斷是否匯入工具包
		if(f_util){
			sb.append("import java.util.Date;\r\n");
		}
		if(f_sql){
			sb.append("import java.sql.*;\r\n");
		}
		sb.append("package " + packageOutPath + ";\r\n");
		sb.append("\r\n");
		//註釋部分
		sb.append("   /**\r\n");
		sb.append("    * "+tablename+ "("+tablecomment+"-->) 實體類\r\n");
		sb.append("    * "+date2String(new Date())+" By "+this.authorName+"\r\n");
		sb.append("    */ \r\n");
		//實體部分
		sb.append("\r\npublic class " + initcap(tablename) + "{\r\n");
		processAllAttrs(sb);//屬性
		processAllMethod(sb);//get set方法
		sb.append("}\r\n");
		
    	//System.out.println(sb.toString());
		return sb.toString();
	}
	
	/**
	 * 功能:生成所有屬性
	 * @param sb
	 */
	private void processAllAttrs(StringBuffer sb) {
		
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + colnames[i] +";  //"+colComment[i]+ "\r\n");
		}
		
	}
 
	/**
	 * 功能:生成所有方法
	 * @param sb
	 */
	private void processAllMethod(StringBuffer sb) {
		
		for (int i = 0; i < colnames.length; i++) {
			sb.append("\t/**\r\n\t\t*設定"+colComment[i]+"的方法\r\n\t\t*@param  型別 "+sqlType2JavaType(colTypes[i])+"\r\n\t*/\r\n");
			sb.append("\tpublic void set" + initcap(colnames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + 
					colnames[i] + "){\r\n");
			sb.append("\t\tthis." + colnames[i] + "=" + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");
			sb.append("\t/**\r\n\t\t*返回"+colComment[i]+"的方法\r\n\t\t*返回型別"+sqlType2JavaType(colTypes[i])+"\r\n\t*/\r\n");
			sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(colnames[i]) + "(){\r\n");
			sb.append("\t\treturn " + colnames[i] + ";\r\n");
			sb.append("\t}\r\n");
		}
		
	}
	
	/**
	 * 功能:將輸入字串的首字母改成大寫
	 * @param str
	 * @return
	 */
	private String initcap(String str) {
		
		char[] ch = str.toCharArray();
		if(ch[0] >= 'a' && ch[0] <= 'z'){
			ch[0] = (char)(ch[0] - 32);
		}
		
		return new String(ch);
	}
 
	/**
	 * 功能:獲得列的資料型別
	 * @param sqlType
	 * @return
	 */
	private String sqlType2JavaType(String sqlType) {
		
		if(sqlType.contains("bit")){
			return "boolean";
		}else if(sqlType.contains("byte")){
			return "byte";
		}else if(sqlType.contains("smallint")){
			return "short";
		}else if(sqlType.contains("int")){
			return "int";
		}else if(sqlType.contains("bigint")){
			return "long";
		}else if(sqlType.contains("float")){
			return "float";
		}else if(sqlType.contains("decimal") || sqlType.contains("numeric") 
				|| sqlType.contains("real") || sqlType.contains("money") 
				|| sqlType.contains("smallmoney")){
			return "double";
		}else if(sqlType.contains("varchar") || sqlType.contains("char") 
				|| sqlType.contains("nvarchar") || sqlType.contains("nchar") 
				|| sqlType.contains("text")){
			return "String";
		}else if(sqlType.contains("datetime")){
			return "Date";
		}else if(sqlType.contains("image")){
			return "Blod";
		}
		
		return null;
	}
	public int getColumnSize(String tablename) throws SQLException{
		//建立連線
		Connection  con = JDBCUtils.getConnection();
		//查要生成實體類的表
    	String sql = "select COLUMN_NAME,count(*) total from  INFORMATION_SCHEMA.Columns WHERE table_name=" + "'"+tablename+"'";
    	PreparedStatement ps = con.prepareStatement(sql);	
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			return rs.getInt("total");			
		}	
		JDBCUtils.colseResource(con, ps, rs);
    	return 1;
	}
	/**
	 * 根據表名獲取註釋
	 * @throws SQLException 
	 */
	public String getTableCommentByTName(String tablename) throws SQLException{
		//建立連線
		Connection  con = JDBCUtils.getConnection();
		//查要生成實體類的表
    	String sql = "SELECT TABLE_NAME,TABLE_COMMENT FROM information_schema.TABLES where TABLE_NAME= " + "'"+tablename+"'";
    	PreparedStatement ps = con.prepareStatement(sql);	
		ResultSet rs = ps.executeQuery();
		while(rs.next()){
			return rs.getString("table_comment");			
		}
		 JDBCUtils.colseResource(con, ps, rs);
		return null;
	}
	public static  String date2String(Date date){
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String formatDate = simpleDateFormat.format(date);
		return formatDate;
	}
	
	/**
	 * 出口
	 * TODO
	 * @param args
	 * @throws SQLException 
	 */
	public static void main(String[] args) throws SQLException {
		//Customer customer=new Customer();
	    List<String> tBlist = TBlist();
	    for(String tablename:tBlist){
	    	new util().GenEntityMysql(tablename,"com.zsf.shenzhou.customer.po");;
	    }
		System.out.println();
			
	}
 
}
package com.zsf.shenzhou.customer.po;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class JDBCUtils {
    private static String driver="com.mysql.jdbc.Driver";
    private static String url="jdbc:mysql://54.222.250.141:3306/xianfengDB?useUnicode=true&characterEncoding=UTF-8";
    private static String user="root";
    private static String password="123456";
    
    private JDBCUtils(){}
    
    static {
        /**
         * 驅動註冊
         */
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
        
    }
    
    /**
     * 獲取 Connetion
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection(url, user, password);
    }
    
    /**
     * 釋放資源
     * @param conn
     * @param st
     * @param rs
     */
    public static void colseResource(Connection conn,PreparedStatement ps,ResultSet rs) {
        closeResultSet(rs);
        closePreparedStatement(ps);
        closeConnection(conn);
    }
    
    /**
     * 釋放連線 Connection
     * @param conn
     */
    public static void closeConnection(Connection conn) {
        if(conn !=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        conn = null;
    }
    
    /**
     * 釋放語句執行者 Statement
     * @param st
     */
    public static void closePreparedStatement(PreparedStatement ps) {
        if(ps !=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        ps = null;
    }
    
    /**
     * 釋放結果集 ResultSet
     * @param rs
     */
    public static void closeResultSet(ResultSet rs) {
        if(rs !=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //等待垃圾回收
        rs = null;
    }
}