java中的接口是类吗
208
2023-07-15
Mybatis逆工程jar包的修改和打包
上一篇文章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://blogjava.net/bolo/archive/2015/03/20/423683.html
首先,我们先修改逆工程要生成的接口文件mapping的代码,默认情况下有增删改查,我们讲其中一个改方法update吧
比如 我要让生成的mapping中有这样的一个方法 void update(Map
就修改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://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 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://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 Attrhttp://ibute("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
//迭代
java.util.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/ 目录下
connectionURL="jdbc:mysql://localhost:3306/login?characterEncoding=UTF-8" userId="root" password="root" /> targetProject="mybatis3" > targetProject="mybatis3" > targetProject="mybatis3"> http:// domainObjectName="Login" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false">
connectionURL="jdbc:mysql://localhost:3306/login?characterEncoding=UTF-8" userId="root"
password="root" />
targetProject="mybatis3" >
targetProject="mybatis3" >
targetProject="mybatis3" >
targetProject="mybatis3" >
targetProject="mybatis3">
targetProject="mybatis3">
http://
domainObjectName="Login" enableCountByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
enableUpdateByExample="false">
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
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文件代码
然后是修改src/main/assembly/src.xml代码
xmlns:xsi="http://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">
xmlns:xsi="http://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">
接下来,在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包的修改和打包的相关知识,希望对大家有所帮助!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~