mybatis generator 源码修改
项目中使用mybatis + 通用mapper,用mybatis generator生成代码时有些不方便,参考了网上的一些例子,修改mybatis genrerator的源码。
首先,下载mybatis generator 1.3.6 源码(注意,版本不同代码肯定有比较大的差别),打开之后目录结果如下,所有要修改的代码,都在子项目mybatis-generator-core中

1、禁止生成mybatis自带的example文件及相应的方法,禁止数据库字段名驼峰转换,去掉数据库表名前缀
这些都不需要改源码,只需要在自己写的mybatis generator配置文件中做一下设置,如下图

【注意】第二条,domainObjectRenamingRule,此属性,我印象中在mybatis-generator-1.3.6/1.3.7存在,以前版本好像没有,具体我就不考证了。
2、实体类
2.1 去掉getter,setter方法,使用lombok的@Data注解代替,加入@Table注解,@Id等注解。
在包org.mybatis.generator.plugins下,新建一个继承自PluginAdapter(位于org.mybatis.generator.api下)的类,名字随意,我这里的名字叫LombokPlugin,
在LombokPlugin中覆写PluginAdapter的PluginAdapter.modelSetterMethodGenerated()以及modelGetterMethodGenerated(),令两个方法都返回false

2.2 修改类注解
覆写PluginAdapter.modelBaseRecordClassGenerated()
这里实体类上加入了@Data,@Accessors,@Table,通过参数intrspectedTable获取到数据库表名

2.3 在id字段上加入@Id和@GeneratedValue
覆写PluginAdapter.modelFieldGenerated(),给自增的字段或者名为id的字段增加注解@Id和GeneratedValue,所有字段,都添加@Column

3、禁止生成所有默认的方法,selectByPrimaryKey,updateByPrimaryKey,deleteByPrimaryKey,insert,insertSelective,包括interface和xml文件中
这个只要对以下配置全部置为false就可以,

然而,虽然方法都没有了,可造成两个后果1、实体类、interface、xml文件不生成了;2、即便生成,xml文件缺少<resultMap>元素
对于后果1,修改org.mybatis.generator.config.Context.introspectTables(),把如下位置的continue语句注释掉,这样,在mybatis 配置文件的table元素,当所有enableInsert enableSelectByPrimaryKey等等都为false的情况下,仍然可以生成entity,interface,xml

对于后果2,xml文件缺少<resultMap>,比较麻烦,因为通过代码发现,生成resultMap的代码在org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator.addElements()中,因此enableSelectByPrimaryKey必须为true

这样就必须修改在interface和xml中生成selectByPrimaryKey的方法,
3.1 修改接口方法
修改org.mybatis.generator.codegen.mybatis3.javamapper.elements.SelectByPrimaryKeyMethodGenerator.addInterfaceElements()
注释interfaze.addMethod(method);

3.2 修改生成xml的方法
修改org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator.addElements()
注释parentElement.addElement(answer);

通过以上修改,enableSelectByPrimaryKey=true,也不会在interface和xml中生成selectByPrimaryKey,并且保留xml中的<resultMap>。
4、mapper接口文件添加extends Mapper<实体类>,并且加入import语句
在LombokPlugin中,覆写PluginAdapter.clientGenerated(),
introspectedTable.getBaseRecordType获取实体类名
interfaze.addSuperInterface添加继承类
interfaze.addImportedType添加要import的类型

5、打包
修改了代码,还需要生成jar包,并把jar包更新到本地maven repository中

6、如何使用mybatis generator
当修改了代码的mybatis generator的jar包更新到本地maven仓库中后(上一步),就可以在项目中通过maven命令生成文件,操作方法如下
在项目pom文件中引入mybatis generator

然后,在pom中添加如下内容,其中generatorConfig.xml是你的mybatis generator配置文件,这个文件mybatis generator有模板,这里不做说明

然后,修改mybatis generator 配置文件各个参数,如数据库链接,生成的路径,指定表名或全部生成等参数,
最后,在Maven Projects的如图位置,双击mybatis-generator:generate,即可生成文件。

mybatis generator 源码修改的更多相关文章
- mybatis generator 源码学习
mybatis/generator 源码地址mybatis/parent 源码地址1. 分别点击Download ZIP下载到本地. 2. 解压generator-master.zip中的core到g ...
- 从代码生成说起,带你深入理解 mybatis generator 源码
枯燥的任务 这一切都要从多年前说起. 那时候刚入职一家新公司,项目经理给我分配了一个比较简单的工作,为所有的数据库字段整理一张元数据表. 因为很多接手的项目文档都不全,所以需要统一整理一份基本的字典表 ...
- 【狂神说】JAVA Mybatis 笔记+源码
简介 自学的[狂神JAVA]MyBatis GitHub源码: https://github.com/Donkequan/Mybatis-Study 分享自写源码和笔记 配置用的 jdk13.0.2 ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改
python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...
- Android6.0 源码修改之 Contacts应用
一.Contacts应用的主界面和联系人详情界面增加顶部菜单添加退出按钮 通过Hierarchy View 工具可以发现 主界面对应的类为 PeopleActivity 联系人详情界面对应的类为 Qu ...
- Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...
- Android6.0 源码修改之屏蔽系统短信功能和来电功能
一.屏蔽系统短信功能 1.屏蔽所有短信 android 4.2 短信发送流程分析可参考这篇 戳这 源码位置 vendor\mediatek\proprietary\packages\apps\Mms\ ...
- el-upload源码修改跳坑
之前给element-ui提了一个问题,结果没有鸟我,没办法,只能修改源码来满足需求了 (备注:element-ui2依然没有修改,为了迎合产品还是要改源码) 本文讨论的组件属性仅限于list-typ ...
随机推荐
- C#生成的后台文件 ***.vshost.exe
vshost是visual studio宿主应用程序,vs运行调试时是打开的其实是这个文件,这个程序可以让vs跟踪调试信息.而exe则可以直接打开,vs不会跟踪任何这个文件的运行情况.只要引用的程序集 ...
- Vue学习搭建(基础)
空项目:https://github.com/ElementUI/element-starter.git 参考教程:https://blog.csdn.net/xuehu837769474/artic ...
- HTML中的表格和图像总结
㈠表格 ⑴表格的基本结构 ①表格的基本标签有:table标签(表格),tr标签(行),td标签(单元格).<tr>标签和<td>标签都要在表格的开始标签<table> ...
- Error: Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime (64)
错误提示: Error: Node Sass does not yet support your current environment: Windows 64-bit with Unsupporte ...
- max函数结合lambda使用
说明:d.keys() 以及列表可以看做lambda函数的实参,max的判断对象是key的值.最终返回的是使得key的值最大的那个实参.
- Python3学习笔记(十):赋值语句和布尔值
一.赋值语句 1.序列解包 多个赋值同时进行: >>> x,y,z = 1, 2, 3 >>> print(x, y, z) 1 2 3 变量交换: >> ...
- 图解数据库中的join操作
1.所有的join都从cross join衍生而来 2.所有join图示 转自Say NO to Venn Diagrams When Explaining JOINs
- servlet3.0以后可以不用web.xml配置了
AbstractDispatcherServletInitializer 注意:删除了web.xml会报错,web.xml is missing and <failOnMissingWebXml ...
- Docker安装Zookeeper并进行操作
Docker安装Zookeeper 下载Zookeeper镜像docker pull zookeeper1启动容器并添加映射docker run --privileged=true -d --name ...
- redis扫描特定keys脚本,可避免阻塞,不影响线上业务
#!/bin/sh ## 该脚本用来查询redis集群中,各个实例当中特定前缀的key,对应只需要修改redis的其中一个实例的 host和port## 脚本会自动识别出该集群的所有实例,并查出对应实 ...