非常に単純に言えば、それは大きな感情の高価な上の名前を聞くことです。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