根據表信息生成JavaVO

例子採用MySQL數據庫

 

代碼:

package com.ustcsoft.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;

/**
 * 類:DBToVO
 * 功能:根據數據庫表生成VO--Value Object
 * @author sam
 * @e-mail:[email protected]
 */
public class DBToJavaVO {
	private static final String TARGET_DIR="C:/tempVO/";							//類文件存放的路徑
	private static final String DIVER_NAME="org.gjt.mm.mysql.Driver";
	private static final String URL="jdbc:mysql://localhost:3306/bms"; 
	private static final String USERNAME="root";
	private static final String PASSWORD="root";
	private static final String DATABASE_NAME="BMS";								//數據庫名稱
	private static final String AUTHOR="sam";										//作者
	private static final String E_MAIL="[email protected]";					//作者郵箱
	private static final String PACKAGE_NAME="com.ustcsoft.vo";						//包名
	private Connection conn;
	private Statement stmt;
	private String sql;
	private ResultSet rs;
	private String[] fields;	//屬性
	private String[] dataTypes;	//數據類型
	private String[] comments;	//屬性的註釋
	/**
	 * 方法:根據數據庫表生成VO--Value Object
	 * @param tableName
	 */
	private void tableToVo(){
		
		String tableName;
		String className;
		try {
			InputStreamReader reader = new InputStreamReader(System.in);
			BufferedReader bf = new BufferedReader(reader);
			System.out.println("輸入要轉換成VO的表名稱:");
			tableName = bf.readLine().trim();
			System.out.println("輸入生成的類名,不輸入的時候默認跟表名相同:");
			className = bf.readLine().trim();
			Class.forName(DIVER_NAME);
			conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
			stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);	//創建可滾動的,只讀的結果集
			sql = "SELECT COLUMN_NAME, DATA_TYPE, COLUMN_COMMENT"+
				  " FROM INFORMATION_SCHEMA.COLUMNS"+
				  " WHERE table_name = '"+tableName.toUpperCase()+"'"+		//表名
				  " AND table_schema = '"+DATABASE_NAME+"'";				//數據庫名
			System.out.println(sql);
			rs = stmt.executeQuery(sql);
			rs.last();										//把指針指向結果集的最後
			int fieldNum = rs.getRow();						//取得最後一條結果的行號,作爲類的屬性個數
			int n = fieldNum;
			if(n>0){									//判斷數據表中是否存在字段
				fields = new String[n];
				dataTypes = new String[n];
				comments = new String[n];
				fields[--n] = rs.getString(1);
				dataTypes[n] = rs.getString(2);
				comments[n] = rs.getString(3);
				while(rs.previous()){
					fields[--n]=rs.getString(1);			//取得結果集的第一列數據,對應的列名:Field
					dataTypes[n] = rs.getString(2);
					comments[n] = rs.getString(3);
				}
				//打印相關信息
				System.out.println("你要轉換的表是:"+tableName);
				System.out.println("該表中共有"+fieldNum+"個字段,信息如下:");
				for(int i=0,j=fields.length;i<j;i++){
					System.out.println("----------------------------------------");
					String field = fields[i];
					System.out.println("字段名稱:"+field);
					//把字段名稱格式化成java命名規則形式
					field=formatField(field);
					fields[i]=field;						//把格式化後的字段放入屬性數組中
					System.out.println("數據類型:"+dataTypes[i]);
					//把數據庫字段類型轉換成java數據類型
					String dataType = dataTypes[i].toLowerCase();
					dataType = formatDataType(dataType);
					dataTypes[i] = dataType;
					
					System.out.println("字段註釋:"+comments[i]);
					if("".equals(comments[i])||comments[i]==null){
						comments[i]=fields[i];
					}
					System.out.println("----------------------------------------");
				}
				//格式化類名稱
				foramtClassName(className,tableName);
				//生成類文件,寫入到磁盤中
				writeObjectToFile(className);
			}else{
				System.out.println("該表不存在或者表中沒有字段");
			}	
		} catch (ClassNotFoundException e) {
			System.out.println("未找到數據庫驅動");
			System.out.println(e.getMessage());
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			//e.printStackTrace();
		} catch (IOException e) {
			System.out.println(e.getMessage());
			//e.printStackTrace();
		}finally{
			try {
				if(stmt!=null){
					if(!stmt.isClosed()){
						stmt.close();
						stmt=null;
						System.gc();
					}
				}
				if(conn!=null){
					if(!conn.isClosed()){
						conn.close();
						conn=null;
						System.gc();
					}
				}
			} catch (SQLException e) {
				System.out.println(e.getMessage());
			}
		}
	}
	
	/**
	 * 把數據庫字段格式成java變量名
	 * @param field
	 * @return
	 */
	private String formatField(String field){
		String[] strs = field.split("_");
		field="";
		for(int m = 0,length=strs.length;m<length;m++){
			if(m>0){
				String tempStr = strs[m].toLowerCase();
				tempStr = tempStr.substring(0, 1).toUpperCase()+tempStr.substring(1, tempStr.length());
				field += tempStr;
			}else{
				field += strs[m].toLowerCase();
			}
		}
		return field;
	}
	
	private String formatDataType(String dataType){
		if(dataType.contains("char")){
			dataType="java.lang.String";
		}else if(dataType.contains("int")){
			dataType="java.lang.Integer";
		}else if(dataType.contains("float")){
			dataType="java.lang.Float";
		}else if(dataType.contains("double")){
			dataType="java.lang.Double";
		}else if(dataType.contains("number")||dataType.contains("decimal")){
			dataType="java.math.BigDecimal";
		}else if(dataType.contains("date")){
			dataType="java.sql.Date";
		}else if(dataType.contains("time")){
			dataType="java.sql.Timestamp";
		}else if(dataType.contains("clob")){
			dataType="java.sql.Clob";
		}else{
			dataType="java.lang.Object";
		}
		return dataType;
	}
	/**
	 * 格式化類名
	 * @param className
	 * @param tableName
	 * @return
	 */
	private String foramtClassName(String className,String tableName){
		//如果類名不是自己定義的,那麼根據表名格式化類名
		if("".equals(className)||className==null){
			className="";
			String[] tempArr = tableName.split("_");
			for(int m=0,length=tempArr.length;m<length;m++){		
				className += tempArr[m].substring(0,1).toUpperCase()+tempArr[m].substring(1,tempArr[m].length()).toLowerCase();
			}
		}else{
			//如果類名已經輸入,那麼不管三七二十一就把類名的第一個字母大寫
			className = className.substring(0,1).toUpperCase()+className.substring(1,className.length());
		}
		return className;
	}
	
	/**
	 * 生成類並寫到文件
	 * @param className
	 */
	@SuppressWarnings("deprecation")
	private void writeObjectToFile(String className){
		PrintWriter writer = null;
		try {
			 File dir = new File(TARGET_DIR);
			 if(!dir.exists()){
				 dir.mkdirs();
			 }
			 File file = new File(TARGET_DIR+className+".java");
			 if(!file.exists()){
				 file.createNewFile();
			 }
			 writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));
			 
			 //拼文件內容
			 StringBuffer content = new StringBuffer();
			 content.append("package "+PACKAGE_NAME+";\n\n");
			 content.append("/**\n");
			 content.append(" *@類:"+className+"\n");
			 content.append(" *@作者:"+AUTHOR+"\n");
			 content.append(" *@E-mail:"+E_MAIL+"\n");
			 content.append(" *@日期:"+new Date().toLocaleString().substring(0,10)+"\n");
			 content.append(" */\n\n");
			 content.append("public class "+className+"{\n\n");
			 for(int i=0,j=fields.length;i<j;i++){
				 content.append("	/**"+comments[i]+"*/\n");
				 content.append("	private "+dataTypes[i]+" "+fields[i]+";\n\n");
			 }
			 //get set 方法
			 for(int i=0,j=fields.length;i<j;i++){
				 content.append("	/**\n");
				 content.append("	 *方法: 取得"+fields[i]+"\n");
				 content.append("	 *@return: "+dataTypes[i]+"  "+fields[i]+"\n");
				 content.append("	 */\n");
				 content.append("	public "+dataTypes[i]+" get"+fields[i].substring(0,1).toUpperCase()+fields[i].substring(1,fields[i].length())+"(){\n");
				 content.append("		return this."+fields[i]+";\n");
				 content.append("	}\n\n");
				 content.append("	/**\n");
				 content.append("	 *方法: 設置"+fields[i]+"\n");
				 content.append("	 *@param: "+dataTypes[i]+"  "+fields[i]+"\n");
				 content.append("	 */\n");
				 content.append("	public void set"+fields[i].substring(0,1).toUpperCase()+fields[i].substring(1,fields[i].length())+"("+dataTypes[i]+" "+fields[i]+"){\n");
				 content.append("		this."+fields[i]+" = "+fields[i]+";\n");
				 content.append("	}\n\n");
			 }
			 content.append("}");
			 writer.write(content.toString());
			 writer.flush();
			 System.out.println("類生成成功,存放路徑:"+TARGET_DIR);
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(writer!=null){
				writer.close();
			}
		}
	}
	
	public static void main(String[] args) {
		try {
			new DBToJavaVO().tableToVo();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章