Javaのリバースエンジニアリング(Javaクラスは、データベーステーブルを生成します)

非常に単純に言えば、それは大きな感情の高価な上の名前を聞くことです。MyBatisのは、1つのそのようなツールMyBatisの-genderatorを提供などの方法が、これはとにかく使用されていない、リバースエンジニアリングの多くにありますが、私はただのツールの前に企業が同社の最近のアイドル、自身の退屈されると書かれていることを聞きました手1を書くこと。

私のエンジニアこの春とMyBatisの書かれ、興味を持ってプラス春-MVCに基づいて、ページを追加するには良いです。

実際にリバースエンジニアリングんMyBatisのを使用した、データベースの基盤が良い子供の靴は、クエリ(あなたが事を学ぶことができ、それは問題ではありません覚えていない)の2何であるかを覚えておく必要がありますように、単純に2つの選択クエリ:

  1.クエリデータベースのすべてのテーブル:TABLE_SCHEMA =(選択データベース())INFORMATION_SCHEMA.TABLESから選択*

  2.テーブルのクエリのすべての情報フィールド:TABLE_SCHEMA =(セレクトデータベース())information_schema.COLUMNS SELECT * FROMとTABLE_NAME =#{tableNameの}

最初のSQLクエリそれはライン上に接続されているデータベースの場合は、パラメータを渡す必要はありません。しかし、2番目のSQLは、(理解する)テーブルの名前に渡す必要があります

私たちは、4つの大規模なデータベースを接続する必要がある重要なパラメータであり、これらのもの必要があるのすべてを結ぶデータベース(ここでは、この文は、私が使用するものであるMySQLをプロフィール上の他の事は私が多くを言うことはありません。今日、焦点はここではありません

次単に通常、非常に単純なDAO、サービス層、およびウェブ構造を掲示すること。

サービス層

サービス実装クラス

そして、今日の焦点はそこにあります。実際には、非常にシンプルな、多くの人が考えを持っていることが、我々は、テーブルのフィールド情報を取得する必要があり、その後、我々はそれだけではないことができ、ファイルのストリームを必要としますか?(ああ、はい、兄は、とにかく、私はちょうど書きました)

実際に、私はStringBufferのが最初の文字列の中にスプライシングされ、その後、ファイルストリームに書き込まれた主を中心に、この非常に単純なを持っています。私はコードの私の一番下に貼り付けます。

パッケージcom.ml.code.one.codegenerator.util。

輸入com.ml.code.one.codegenerator.myservice.MyCodeService。
輸入org.springframework.beans.factory.annotation.Autowired;
輸入org.springframework.stereotype.Component。

インポートのjava.io.File;
輸入java.io.FileWriter;
インポートにjava.io.IOException;
インポートするjava.util.Iterator;
輸入はjava.util.List;
輸入java.util.Map; 

@Component 
パブリック クラスCodeGenerator { 
    @Autowired 
    プライベート  MyCodeServiceサービス。

    公共 のボイドcodeGenerator(文字列tableNameの文字列パス){ 
        リスト <地図>列= service.listColumn(tableNameの)。// 查询所有的表字段信息 
        文字クラス名= getClassNameメソッド(tableNameの)。
        StringBufferのSB = 新しいStringBufferを(); 
        sb.append( "パッケージ"+ getPackageName(パス)+"; \ n" ); 
        sb.append( "インポートしたjava.io.Serializable;" + "\ n"は); 
        sb.append( "輸入java.utilの。*; \ N" ); 
        sb.append( "インポートされるjava.lang。*; \ N" ); 
        sb.append( "輸入lombok.Data; \ N" ); 
        SB。"輸入lombok.ToString; \ N \ N" ); 
        sb.append( "@Data \ n個の@のToStringメソッドの\ nを" ); 
        sb.append( "パブリッククラス"+クラス名+"は、シリアライズ{\ nを実装します" )。
        sb.append( "\のtprivate静的最終長いのserialVersionUID = 1L; \ n \ n" );
        // 获取字段信息 
        イテレータ<地図>イテレータ= columns.iterator();
        一方、(iterator.hasNext()){ 
            地図次 = iterator.next()。
            オブジェクトデータ型 = next.get( "DATA_TYPE")。// 获取数据类型 
            文字列型= classCast(のdataType)。
            Next.getプロパティ=オブジェクト( "COLUMN_NAME"); // 取得するフィールド名の 
            文字列propertity = getPropertity(プロパティ); // プロパティ名 
            オブジェクトの注釈= next.get( "COLUMN_COMMENT"); // コメント 
            sb.append(「\ tprivate "+型+" "+ propertity +"; "+" // "+(文字列)注釈+" \ N-」); 
        } 
        sb.append( "}" );
         // スプライシングされた端

        // makefileを
        試し{
             // 発生をjavaファイル
            はgetFile(クラス名、sb.toString()、パス);
             // 生成マッパー。
XML //             getMapperFile(クラス名、パス);
        } キャッチ(IOExceptionをE){ 
            e.printStackTrace(); 
        } 
    } 

    / ** 
     *生成されたクラス名
     * @paramのtableNameの表
     * @return 
     * / 
    プライベート文字getClassNameメソッド(文字列tableNameの){ 
        文字列newClassName = "" ;
         INT I = tableName.indexOf( "_" );
         IF(I <0){ // 下線を付していない 
            newClassName tableName.substring =(0 ,. 1).toUpperCase()tableName.substring + + "PO"(1); 
        }  { / / 下線
            文字列[] STRS = tableName.split( "_" )。
            StringBufferのSB = 新しいStringBufferを();
            INT m = 0であり、m <strs.lengthあり; m ++ ){ 
                sb.append(STRS [M] .substring( 0、1).toUpperCase()+ STRS [M] .substring(1 ))。
            } 
            newClassName = sb.toString()+ "PO" 
        } 
        戻りnewClassNameと、
    } 
    // 生成属性のJava类型
    プライベートストリングclassCast(オブジェクトobj){ 
        文字列型 = "" ; 
        文字列str =(String)をOBJ。
        もし(str.equals( "VARCHAR")|| str.equals( "CHAR")|| str.equals( "テキスト" )){ 
            タイプ = "文字列" 
        } そう であれば(str.equals( "INT" )){ 
            タイプ = "整数" 
        } そう であれば(str.equals( "BIGINT" )){ 
            タイプ = "長いです" 
        } そう であれば(str.equals( "ダブル")|| str.equals( "フロート" )){ 
            タイプ = "ダブル" 
        } それ以外の 場合(str.equals( "DATE")|| str.equals( "日時")|| str.equals( "タイムスタンプ" )){ 
            タイプ = "日" ; 
        } { 
            タイプ = "文字列" ; 
        } 
        戻り値のタイプ; 
    } 
    // データベースフィールド名名は、Java転送属性
    プライベート  ストリングgetPropertity(オブジェクトobj){ 
        文字列プロ = "" ; 
        文字列Colum = (文字列)OBJ;
         int型のインデックス= colum.indexOf( "_")を; //はそこに下線が引かれているか否かを判断します
        IF(インデックス<0){ // なし下線
            = colum.substringプロ(0,1).toLowerCase()colum.substring +(1); // 最初の文字を小文字 
        }  { // 下線付き 
            のStringBuilder SB = 新しい新規のStringBuilderを(); 
            文字列[] colums = colum.split ( "_" のためのINT I = 0;私はcolums.lengthを<; I ++は){
                 IF(I == 0 ){ 
                    sb.append(colums [I]が.substring( 0,1).toLowerCase()+ colums [I])を(1).substring; // 最初のスプライシング、および最初の文字を小文字 
                } { 
                    sb.append(colums [I]が.substring(0,1).toUpperCase()+ colums [I]が(.substring 1)); // 最初の大文字であろう以外
                } 
            } 
            プロ = sb.toString(); 
        } 

        戻りのPro; 
    } 

    / ** 
     *パッケージ名を生成する
     * / 
    プライベート  文字getPackageName(文字列のパス){
         int型のインデックス= path.indexOf( "Javaの\\" ); 
        文字列newpackage = "" ;
         IF(指数> 0 ){ 
            文字ストリング = path.substring(インデックス+ 5。); 
            newpackage = substring.replace( "\\"、 "" ); 
        }
        リターンnewpackage; 
    } 

    / ** 
     *メイク
     * @paramのfileNameにファイル名
     * @paramの書面によるインフォするコンテンツ
     * @throws IOExceptionが
      * / 
    プライベート  空間をはgetFile(ファイル名を文字列、文字列情報、文字列のパス)がスローにIOException {
         // 生成をファイル 
        ファイルファイル= 新しい新しいファイル(パス+ "\\" + fileNameには+の"Java"。);
         IF(!File.Exists()){ 
            file.createNewFile(); 
        } 
        てFileWriterライター = 新しい新てFileWriter(ファイル);
        writer.write(情報)。
        writer.flush(); 
        writer.close(); 
    } 

    / ** 
     *生成Mapper.xml 
     * @param poName
      * / 
    プライベート ボイド getMapperFile(文字列poName、文字列のパス)がスローにIOException {
         // 获取文件名 
        のStringBuilder fileNameに= 新規のStringBuilderを();
        int型のインデックス= poName.indexOf( "ポー" );
        もし(指数<0){ // 没有ポー后缀时 
            fileName.append(poName + "マッパ" )。
        }  { //POプレゼンス接尾 
            文字poName.substringサブ=(0、インデックス); //は、所望の部分傍受 
            fileName.append(サブ+ "マッパー" ); 
        } 
        // パス取得 
        のStringBuilder NEWPATH = 新しい新;のStringBuilder()
         INTメインパス=を。 indexOf( "メイン\\" );
         IF(メイン> 0 ){ 
            文字ストリング = path.substring(0、+メイン5。); 
            newPath.append(サブストリング).append( "マッパー\\ \\ \\リソース" ) ; 
        } 

        ファイルファイル = 新しい新ファイル(NEWPATH fileName.toString +()+ "XML" );
        StringBuilderのxmlInfo = 新しいStringBuilderの(); 
        xmlInfo.append( "\ nを"<?XMLバージョン= \" 1.0 "エンコード= \" UTF-8 \ \>" ); 
        xmlInfo.append( "<!DOCTYPEマッパーPUBLIC \" - // mybatis.org//DTDマッパー3.0 // EN \ "\ n"は+ 
                "\" http://mybatis.org/dtd/mybatis-3-mapper .DTD \ "> \ nを" ); 
        xmlInfo.append( "<マッパーネームスペース= \" \ ">の\ n" ); 
        xmlInfo.append( "\ n個の\ nを" ); 
        xmlInfo.append( "</マッパー>" ); 
        FileWriter FW = 新しいてFileWriter(ファイル); 
        fw.write(xmlInfo.toString())。
        fw.flush();
        fw.close();
    } 
}

ここで私は私が内蔵され、[OK]を実行しているテスト・ツールを使用してブートを実行するように選択したとき(、書き込みにブートプロジェクトを使用して起動クラスヨ上のDAO層をパックプラススキャンすることを忘れないでください

ここでは、このシンプルなリバースエンジニアリングを行うにはこれは、指定したファイルに直接生成することができますちなみに、またしてもMapper.xml生成され、オーバーです。ギャングスターはスプレーしないでください。

そこ(ネットワークディスクの一部のみが、しかし、リバースエンジニアリングの部分、あなたはそれ自体で補う他のニーズは、難しいことではありません)、ネットワークディスク獲得の源であることが必要 

リンクします。https://pan.baidu.com/s/1KW7h9vro2U199hsL85Q38w
抽出コード:OBPF

 

おすすめ

転載: www.cnblogs.com/Tiandaochouqin1/p/11075363.html