1. 程式人生 > >讀取.sql檔案,轉化為javabean

讀取.sql檔案,轉化為javabean

.sql檔案裡面的資料眾多,如何找出表名和欄位名,然後生成具有get和set屬性的javabean呢?其實很簡單,利用輸入和輸出流就可以完成。

1.實驗描述:

2.需要讀取的.sql檔案:

/*

MySQL Data Transfer
Source Host: localhost
Source Database: myDatabase
Target Host: localhost
Target Database: myDatabase
Date: 2010-1-30 1:08:21
*/

SET FOREIGN_KEY_CHECKS=0;

– Table structure for account

DROP TABLE IF EXISTS account;
CREATE TABLE account (
account varchar(60) NOT NULL default ” COMMENT ‘使用者賬戶’,
password varchar(60) NOT NULL default ‘default’ COMMENT ‘使用者密碼’,
number varchar(10) default NULL COMMENT ‘使用者號碼’,
name varchar(60) default NULL COMMENT ‘使用者名稱稱’,
title varchar(100) default NULL COMMENT ‘職稱’,
job

varchar(100) default NULL COMMENT ‘職位’,
department varchar(255) default NULL COMMENT ‘工作部門’,
PRIMARY KEY (account)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

– Table structure for authority

DROP TABLE IF EXISTS authority;
CREATE TABLE authority (
authority int(11) NOT NULL auto_increment COMMENT ‘許可權編號’,
name

varchar(60) default NULL COMMENT ‘許可權名稱’,
describes varchar(255) default NULL COMMENT ‘許可權描述’,
PRIMARY KEY (authority)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

– Records

3.思路:

利用輸入流逐個讀取.sql檔案中的字元,用空格或者‘;’作為劃分各個單詞的依據。當遇到CREATE TABLE時候,那麼接下來的單詞就要儲存起來作為表名。遇到varchar或者int等關鍵字,那麼前面的單詞就要作為欄位名。最後,把找出的關鍵詞寫入檔案。

4.程式碼:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
//InputStream和Reader是所有輸入流的基類。
//區別:InputStream面向位元組,而Reader面向字元
public class MyTest {

     public static void main(String[] args) {   
         //list儲存讀取的所有單詞
         List<String> list = new ArrayList<String>();
         //listBean儲存讀取的所有資料表名和資料欄位
         List<String> listBean = new ArrayList<String>();
        //listBean1儲存讀取的資料表1資訊
         List<String> listBean1 = new ArrayList<String>();
        //listBean2儲存讀取的資料表2資訊
         List<String> listBean2 = new ArrayList<String>();
           try {
               String encoding = "utf-8";
               File sourceFile = new File("E:\\BY\\myapproval.sql");
               FileInputStream fileInputStream = new FileInputStream(sourceFile);
               //InputStreamReader是轉換流,將位元組流轉化為字元流
               InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, encoding);                         
               int cc;
               //strWord用來儲存讀取的單詞
               String strWord="";
               //int佔4個位元組,char佔2個位元組
               //inputStreamReader是字元流,呼叫read()每次讀取的單位是字元
               while ((cc = inputStreamReader.read()) > 0) {
                 if(!((char) cc==' ')&&!((char) cc==';')){
                     String strWordTemp=(char) cc+"";  //(char) cc+""代表char型別轉化為string型別
                     strWord=strWord+strWordTemp;
                 }else{
                     list.add(strWord);
                     strWord="";
                 }
               }
               inputStreamReader.close();
               fileInputStream.close();

               String filePath1="";
               String filePath2="";
               for(int i=0;i<list.size();i++){
                   if(list.get(i).contains("CREATE")&&list.
                           get(i+1).contains("TABLE")){
                      //這裡把資料表的表名存進去,以#作為標識
                      listBean.add(reMoveVar(list.get(i+2))+"#");        

                   }
                   if(list.get(i).contains("varchar")||list.get(i).contains("int")){
                     //這裡把資料表的欄位名存進去
                      listBean.add(reMoveVar(list.get(i-1)));
                   }
               }    
               //下面的程式碼是把listBean中資料分別存入listBean1和listBean2
               int Tab=1;//標記
               for(int i=0;i<listBean.size();i++){  
                   if(listBean.get(i).contains("#")){
                       if(Tab==1){
                           listBean1.add(listBean.get(i));
                           String tem=listBean.get(i);
                           //去掉tem最後那個字元#
                           tem=tem.substring(0, tem.length()-1);                          
                           filePath1=  writeFileName(tem);  
                           Tab=2;
                       }else{                          
                           listBean2.add(listBean.get(i));
                           String tem=listBean.get(i);
                           tem=tem.substring(0, tem.length()-1);                          
                           filePath2=  writeFileName(tem);  
                           Tab=3;
                       }

                   }else{
                       if(Tab==2){
                           listBean1.add(listBean.get(i));
                       }else{
                           listBean2.add(listBean.get(i));
                       }

                   }

               }
              //獲得檔案輸出流 假設目標檔名為resutl.txt 追加方式
               FileOutputStream fileOutputStream= new FileOutputStream("E:\\BY\\"+filePath1+".java",true);
               OutputStreamWriter outputStreamWriter= new OutputStreamWriter(fileOutputStream);
               //普通的Writer寫入內容不太方便,包裝成BufferedWriter
               BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

               String temp_var="";//存變數
               String temp_fun="";//存函式
               String temp_funG="";//存建構函式
               for(int i=0;i<listBean1.size();i++){
                   System.out.println(">>"+listBean1.get(i));
                   if(listBean1.get(i).contains("#")){
                       String tem=listBean1.get(i);
                       tem=tem.substring(0, tem.length()-1);    
                       bufferedWriter.write(writeClassName(tem));
                       temp_funG=writeFun(tem);
                   }else{
                       temp_var=temp_var+writeVar(listBean1.get(i));
                       temp_fun=temp_fun+writeSetFunction(listBean1.get(i));
                   }

               }
               bufferedWriter.write(temp_var);
               bufferedWriter.write(temp_funG);
               bufferedWriter.write(temp_fun);
               bufferedWriter.write("}");
               bufferedWriter.close();
               temp_var="";//存變數
               temp_fun="";//存函式
               temp_funG="";//存建構函式

               fileOutputStream= new FileOutputStream("E:\\BY\\"+filePath2+".java",true);
               outputStreamWriter= new OutputStreamWriter(fileOutputStream);
               bufferedWriter = new BufferedWriter(outputStreamWriter);

               for(int i=0;i<listBean2.size();i++){
                   System.out.println("listBean2>>"+listBean2.get(i));
                   if(listBean2.get(i).contains("#")){
                       String tem=listBean2.get(i);
                       tem=tem.substring(0, tem.length()-1);    
                       bufferedWriter.write(writeClassName(tem));
                       temp_funG=writeFun(tem);
                   }else{
                       System.out.println("temp_var>>"+temp_var);
                       temp_var=temp_var+writeVar(listBean2.get(i));
                       temp_fun=temp_fun+writeSetFunction(listBean2.get(i));
                   }

               }

               bufferedWriter.write(temp_var);
               bufferedWriter.write(temp_funG);
               bufferedWriter.write(temp_fun);
               bufferedWriter.write("}");           
               bufferedWriter.close();


              System.out.println(writeSetFunction("name"));
              System.out.println(writeVar("name"));
              System.out.println(writeFun("name"));
              System.out.println(reMoveVar("'name'"));
              System.out.println(writeFileName("nameee"));


           } catch (Exception e) {
               System.out.println(e);
               e.getStackTrace();
           }
        }

     /***
      * 
      * 寫函式
      * @param str
      * @return
      */
     public static String writeSetFunction(String str){
         String tem=str.charAt(0)+"";
         tem=str.replace(str.charAt(0), tem.toUpperCase().charAt(0));
         System.out.println(str.replace(str.charAt(0), tem.toUpperCase().charAt(0)));

         String s1="public void set"+tem+"(String " +str+"){"+
                 "\r\n"+"\t  this."+str+"="+str+";\r\n"
                 +"}"+"\r\n";

         String s2="public String get"+tem+"(" +"){"+
         "\r\n"+"\treturn this."+str+";\r\n"
         +"}"+"\r\n";

         return s1+s2;       
     }

     /***
      * 
      * 寫變數
      * @param str
      * @return
      */
     public static String writeVar(String str){
         String s1="private String "+str+"=\"\";\r\n";
         return s1;
     }
     /***
      * 
      * 寫建構函式
      * @param str
      * @return
      */
     public static String writeFun(String str){
         String tem=str.charAt(0)+"";
         tem=str.replace(str.charAt(0), tem.toUpperCase().charAt(0));
         String s1="public "+tem+""+"Model(){\r\n" +
            "}\r\n";
         return s1;
     }
     /***
      * 
      * 寫類名和相關部分
      * @param str
      * @return
      */
     public static String writeClassName(String str){
         String tem=str.charAt(0)+"";
         tem=str.replace(str.charAt(0), tem.toUpperCase().charAt(0));
         String s1="public class"+tem+""+"Model(){\r\n" +
                 "\r\n";
         return s1;
     }
     /***
      * 
      * 寫函式名
      * @param str
      * @return  StrModel
      */
     public static String writeFileName(String str){
         String tem=str.charAt(0)+"";
         tem=str.replace(str.charAt(0), tem.toUpperCase().charAt(0));
         String s1=tem+""+"Model";
         return s1;
     }
     /***
      * 
      * 去掉第一個和最後一個多餘字元
      * @param str
      * @return
      */
     public static String reMoveVar(String str){            
         return str.substring(1, str.length()-1);
     }

     /***
      * 
      * 第一個大寫和最後一個去掉
      * @param str
      * @return
      */
     public static String reMoveLastAndReplaceFirst(String str){  
         String tem=str.charAt(0)+"";
         tem=str.replace(str.charAt(0), tem.toUpperCase().charAt(0));
         return tem.substring(0, str.length()-1);
     }     

}