上一篇文章主要是講了mybatis-generator-core-1.3.2.jar的使用,這一篇我要介紹的是,修改jar包代碼,實現生成自定義模板。 1.我們從這裡可以下載mybatis-generator-core-1.3.2.jar項目源碼 http://maven.outofmemory.c ...
上一篇文章主要是講了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 extends AbstractJavaMapperMethodGenerator { public UpdateByPrimaryKeyWithoutBLOBsMethodGenerator() { super(); } @Override public void addInterfaceElements(Interface interfaze) { Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>(); FullyQualifiedJavaType parameterType = new FullyQualifiedJavaType( introspectedTable.getBaseRecordType()); importedTypes.add(parameterType); //新增一個方法 Method method = new Method(); //添加方法修飾符PUBLIC method.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 extends AbstractXmlElementGenerator { //private boolean isSimple; public UpdateByPrimaryKeyWithoutBLOBsElementGenerator(boolean isSimple) { super(); //this.isSimple = isSimple; } @Override public 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 Team 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. --> <!-- 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 file for use by the systests projects - so we can gather consolidated 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>cobertura-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> <goal>jar</goal> </goals> </execution> </executions> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix></classpathPrefix> <mainClass>org.mybatis.generator.api.ShellRunner</mainClass> </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</artifactId> <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> </build> <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jdepend-maven-plugin</artifactId> <version>2.0-beta-2</version>