上一篇文章Mybatis逆工程的使用主要是講了mybatis-generator-core-1.3.2.jar的使用,這一篇我要介紹的是,修改jar包代碼,實現生成自定義模板。
1.我們從這裡可以下載mybatis-generator-core-1.3.2.jar項目源碼
http://maven.outofmemory.cn/org.mybatis.generator/mybatis-generator-core/1.3.2/
2.在eclipse下導入存在的maven項目,File->Import
選擇項目源碼位置,點finish完成導入。
項目目錄結構大概這樣子。
3.下面我逆工程要生成的mapping和xml格式。
4.開始修改,首先說明一下各目錄
最底邊的tse包是我自定義的包,裡面是個主類,測試生成的代碼是否達到預期標準。
由於這個架包是老外寫的,生成的代碼風格和我們不大一一樣,如果你想修改代碼格式,建議你看一下菠蘿大象的文章,我這裡就不講代碼格式了。
http://www.blogjava.net/bolo/archive/2015/03/20/423683.html
首先,我們先修改逆工程要生成的接口文件mapping的代碼,默認情況下有增刪改查,我們講其中一個改方法update吧
比如我要讓生成的mapping中有這樣的一個方法void update(Map<String, Object> dataMap);
就修改org.mybatis.generator.codegen.mybatis3.javamapper.elements包下的UpdateByPrimaryKeyWithoutBLOBsMethodGenerator類,如下:
/** Copyright 2009 The Apache Software Foundation** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.mybatis.generator.codegen.mybatis3.javamapper.elements;import java.util.Set;import java.util.TreeSet;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;import org.mybatis.generator.api.dom.java.Interface;import org.mybatis.generator.api.dom.java.JavaVisibility;import org.mybatis.generator.api.dom.java.Method;import org.mybatis.generator.api.dom.java.Parameter;/*** * @author Jeff Butler* */public class UpdateByPrimaryKeyWithoutBLOBsMethodGenerator extendsAbstractJavaMapperMethodGenerator {public UpdateByPrimaryKeyWithoutBLOBsMethodGenerator() {super();}@Overridepublic void addInterfaceElements(Interface interfaze) {Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();FullyQualifiedJavaType parameterType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());importedTypes.add(parameterType);//新增一個方法Method method = new Method();//添加方法修飾符PUBLICmethod.setVisibility(JavaVisibility.PUBLIC);//設置返回值,這裡我用的是自定義的void,無返回值方法getVoidInstance()//FullyQualifiedJavaType類中可以自定義返回值方法,大家可以自己進去添加//不想那麼麻煩的話,可以new FullyQualifiedJavaType("void") , 構造函數寫上返回類型就行了method.setReturnType(FullyQualifiedJavaType.getVoidInstance());//設置方法名,同樣可以自己進去看method.setName(introspectedTable.getUpdateByPrimaryKeyStatementId());//method.addParameter(new Parameter(parameterType, "record")); //$NON-NLS-1$FullyQualifiedJavaType mapType=FullyQualifiedJavaType.getMyMapInstance();//方法的參數,這裡是Map類型的dateMap參數Parameter parameter = new Parameter(mapType, "dataMap");method.addParameter(parameter);context.getCommentGenerator().addGeneralMethodComment(method,introspectedTable);addMapperAnnotations(interfaze, method);if (context.getPlugins().clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(method,interfaze, introspectedTable)) {interfaze.addImportedTypes(importedTypes);interfaze.addMethod(method);}}public void addMapperAnnotations(Interface interfaze, Method method) {return;}}大家可以根據註釋來修改。
接下來修改mapping對應的xml中的代碼,同樣的,這裡我只介紹修改update方法,相信看完你就能自己修改其它方法。
就修改org.mybatis.generator.codegen.mybatis3.xmlmapper.elements包下的UpdateByPrimaryKeyWithoutBLOBsElementGenerator類,如下:
/** Copyright 2009 The Apache Software Foundation** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.mybatis.generator.codegen.mybatis3.xmlmapper.elements;import java.util.Iterator;import java.util.List;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.dom.OutputUtilities;import org.mybatis.generator.api.dom.xml.Attribute;import org.mybatis.generator.api.dom.xml.TextElement;import org.mybatis.generator.api.dom.xml.XmlElement;import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;/*** * @author Jeff Butler* */public class UpdateByPrimaryKeyWithoutBLOBsElementGenerator extendsAbstractXmlElementGenerator {//private boolean isSimple;public UpdateByPrimaryKeyWithoutBLOBsElementGenerator(boolean isSimple) {super();//this.isSimple = isSimple;}@Overridepublic void addElements(XmlElement parentElement) {//update標籤(方法最外層)XmlElement answer = new XmlElement("update"); //$NON-NLS-1$//update標籤的屬性answer.addAttribute(new Attribute("id", introspectedTable.getUpdateByPrimaryKeyStatementId())); //$NON-NLS-1$answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$"Map"));//把標籤加進去context.getCommentGenerator().addComment(answer);StringBuilder sb = new StringBuilder();sb.append("update "); //$NON-NLS-1$sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());//標籤內容,即文本元素answer.addElement(new TextElement(sb.toString()));sb.setLength(0);//set標籤XmlElement setElement = new XmlElement("set"); //$NON-NLS-1$//獲取數據庫表中的所有字段List <IntrospectedColumn> cols=introspectedTable.getAllColumns();//迭代java.util.Iterator<IntrospectedColumn> iter =cols.iterator();while (iter.hasNext()) {//迭代//迭代到某一字段IntrospectedColumn introspectedColumn = iter.next();//if標籤XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$//字段名String str=MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn);//if標籤添加屬性test,值為字段!=null and 字段!=''ifElement.addAttribute(new Attribute("test",str+" != null and "+str+"!='' "));//if標籤內容,文本元素,給字段賦予即將修改的值sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));sb.append(" = "); //$NON-NLS-1$sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));if (iter.hasNext()) {sb.append(',');}//if標籤添加上面的文本元素ifElement.addElement(new TextElement(sb.toString()));if (iter.hasNext()) {sb.setLength(0);OutputUtilities.xmlIndent(sb, 1);}setElement.addElement(ifElement);}//where元素(修改的字段前提條件)XmlElement whereElement =new XmlElement("where");for (IntrospectedColumn introspectedColumn : introspectedTable.getPrimaryKeyColumns()) {//遍歷表中字段進行判斷sb.setLength(0);sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));sb.append(" = "); //$NON-NLS-1$sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));whereElement.addElement(new TextElement(sb.toString()));}//方法中最外層xml元素update元素添加set元素和where元素answer.addElement(setElement);answer.addElement(whereElement);if (context.getPlugins().sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(answer,introspectedTable)) {parentElement.addElement(answer);}}}其它方法大家可以根據這個update方法改。
如果要添加新方法的話參考下面這個帖子
http://m.blog.csdn.net/article/details?id=35985705
下面我來驗證修改成果
generatorConfig.xml //先配置xml 放在src/main/resources/ 目錄下<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!-- 引入配置文件--> <!-- 指定數據連接驅動jar地址--> <classPathEntry location="E:/eclipse_workspace/testMybatis/mysql-connector-java-5.1.13-bin.jar" /> <!-- 一個數據庫一個context --> <context id="infoGuardian" targetRuntime="MyBatis3"> <!-- 註釋--> <commentGenerator > <property name="suppressAllComments" value="true"/><!-- 是否取消註釋--> <property name="suppressDate" value="true" /> <!-- 是否生成註釋代時間戳--> </commentGenerator> <!-- jdbc連接--> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/login?characterEncoding=UTF-8" userId="root" password="root" /> <!-- 類型轉換--> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自動轉化以下類型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成實體類地址--> <javaModelGenerator targetPackage="pojo" targetProject="mybatis3" > <!-- 是否在當前路徑下新加一層schema,eg:fase路徑cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="true"/> <!-- 是否針對string類型的字段在set的時候進行trim調用--> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成mapxml文件--> <sqlMapGenerator targetPackage="mapper" targetProject="mybatis3" > <!-- 是否在當前路徑下新加一層schema,eg:fase路徑cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 生成mapxml對應client,也就是接口dao --> <javaClientGenerator type="XMLMAPPER" targetPackage="mapper" targetProject="mybatis3"> <!-- 是否在當前路徑下新加一層schema,eg:fase路徑cn.ffcs.test.domain", true:cn.ffcs.test.domain".[schemaName] --> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- 配置表信息,這裡沒生成一張表,這裡需要改變一次對應表名--> <table tableName="login" domainObjectName="Login" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> </table> </context> </generatorConfiguration>
StartUp.java//驗證的主程序
package tse;import static org.junit.Assert.assertEquals;import java.io.File;import java.util.ArrayList;import java.util.List;import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;public class StartUp {public static void main(String []args)throws Exception{List<String> warnings = new ArrayList<String>();File configFile=new File(StartUp.class.getResource("/generatorConfig.xml").toURI());ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback shellCallback = new DefaultShellCallback(true);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings);myBatisGenerator.generate(null);System.out.println(warnings);}}好了,運行StartUp.java
就根據generatorConfig.xml的配置在目標目錄生成對應文件。
OK,和我預期結果一樣。
5.上面修改完了,我們開始打包。
由於是個maven項目,我用的是maven3.3.9,大家也可以用eclipse內置的maven,反正我是不喜歡。
下面是我maven項目的pom.xml文件代碼
<?xml version="1.0" encoding="UTF-8"?><!--Copyright 2009-2011 The MyBatis TeamLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><!--version: $Id: pom.xml 4114 2011-11-27 19:03:32Z simone.tripodi $--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator</artifactId><version>1.3.2</version></parent><artifactId>mybatis-generator-core</artifactId><packaging>jar</packaging><name>MyBatis Generator Core</name><build><!-- this build creates and installs an instrumented JAR filefor use by the systests projects - so we can gatherconsolidated coverage information--><plugins><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-site-plugin</artifactId><executions><execution><phase>prepare-package</phase><goals><goal>site</goal></goals></execution></executions></plugin> --><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><executions><execution><phase>prepare-package</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin> --><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.2.1</version><executions><execution><id>attach-sources</id><goals><goal>jar</goal></goals><configuration><includes><include>**/org/**</include></includes></configuration></execution></executions></plugin> --><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><executions><execution><phase>prepare-package</phase><goals><goal>jar</goal></goals></execution></executions></plugin> --><plugin><groupId>org.codehaus.mojo</groupId><artifactId>cobertura-maven-plugin</artifactId><executions><execution><id>cobertura-instrument</id><phase>pre-integration-test</phase><goals><goal>instrument</goal></goals></execution></executions> </plugin><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><mainClass>org.mybatis.generator.api.ShellRunner</mainClass></manifest></archive></configuration><executions><execution><id>cober tura-jar</id><phase>integration-test</phase><goals><goal>jar</goal></goals><configuration><classifier>cobertura</classifier><classesDirectory>${basedir}/target/generated-classes/cobertura</classesDirectory></configuration></execution></executions></plugin> --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version><executions><execution><id>attach-jar</id><phase>integration-test</phase><goals><goa l>jar</goal></goals></execution></executions><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix></classpathPrefix><mainClass>org.mybatis.generator.api.ShellRunner</main Class></manifest></archive><includes><include>**/org/**</include></includes></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-install-plugin</artifactId><executions><execution><id>cobertura-install</id><phase>integration-test</phase><goals><goal>install</goal></goals><configuration><classifier>cobertura</classifier></configuration></execution></executions> </plugin><!-- <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><descriptor>${basedir}/src/main/assembly/src.xml</descriptor></descriptors></configuration> <executions><execution><id>bundle</id><goals><goal>single</goal></goals><phase>package</phase></execution></executions></plugin> --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><appendAssemblyId>false</appendAssemblyId><descriptors><descriptor>${basedir}/src/main/assembly/src.xml</descriptor></descriptors></configuration> <executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin><plugin><groupId>com.googlecode.maven-gcu-plugin</groupId><artifactId>maven-gcu-plugin</ar tifactId><executions><execution><phase>deploy</phase><goals><goal>upload</goal></goals><configuration><uploads><upload><file>${project.build.directory}/${project.artifactId}-${project.version}-bundle.zip</file><summary>MyBatis Generator ${project.version}</summary><labels><label>Featured</label><label>Type-Archive</label><label>Product-Generator</label><label>Version-${project.version}</label></labels></upload></uploads></configuration></execution ></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-release-plugin</artifactId><configuration><arguments>-Prelease,gupload</arguments></configuration></plugin></plugins></bui ld><reporting><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>jdepend-maven-plugin</artifactId><version>2.0-beta-2</version></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>cobertur a-maven-plugin</artifactId></plugin></plugins></reporting><dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><scope>provided</scope></dependency><dependency><groupId>org.apache.ant</gro upId><artifactId>ant</artifactId><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>org.hsqldb</groupId><artif actId>hsqldb</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12</version></dependency></dependencies><scm> <url>https://mybatis.googlecode.com/svn/sub-projects/generator/tags/mybatis-generator-1.3.2/mybatis-generator-core</url><connection>scm:svn:https://mybatis.googlecode.com/svn/sub-projects/generator/tags/mybatis-gen erator-1.3.2/mybatis-generator-core</connection><developerConnection>scm:svn:https://mybatis.googlecode.com/svn/sub-projects/generator/tags/mybatis-generator-1.3.2/mybatis-generator-core</developerConnection></scm> </project>然後是修改src/main/assembly/src.xml代碼
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"><id>bundle</id><formats><format>zip</format></formats><fileSets><fileSet><directory>src/main/resources</directory><outputDirectory>/</outputDirectory><includes><include>generat orConfig.xml</include></includes><excludes><exclude>log4j.properties</exclude><exclude>src.xml</exclude></excludes></fileSet><fileSet><directory>src/main/scripts</directory><outputDirectory>/</outputDirectory><includes><incl ude>run.bat</include></includes></fileSet><fileSet><directory>${project.build.directory}</directory><outputDirectory>/</outputDirectory><includes><include>${project.artifactId}-${project.version}.jar</include></includes></fi leSet><fileSet><directory>${project.build.directory}</directory><outputDirectory>/</outputDirectory><includes><include>${project.artifactId}-${project.version}-sources.jar</include></includes></fileSet></fileSets></assembly>接下來,在src/main/ 下面新建scripts文件夾,在scripts文件夾新建txt文本文檔,輸入以下代碼
java -jar mybatis-generator-1.3.2.jar -configfile generatorConfig.xml overwrite
pause
改文件名為run.bat
至此,打包配置完畢。
大家可以在項目下右鍵Run as->maven build 在goal裡輸入package。或者命令行cmd中進入項目的目錄,運行mvn package,這裡第一次運行會等待很久,因為maven會下載依賴的jar包,請耐心等待。
打包完畢,就會在項目根目錄下的target目錄生成如下結構
從上圖中我們可以看到mybatis-generator-core-1.3.2.jar包已經生成。接下來我們可以用它加上generatorConfig.xml來生成自己想要的代碼。
如果修改代碼過程中有什麼不懂的,請多看源代碼。
OK,曬下成果圖
本文就講到這裡!
以上所述是小編給大家介紹的Mybatis逆工程jar包的修改和打包的相關知識,希望對大家有所幫助!