基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
项目简单说明
mybatis-generator,是根据数据库表、字段反向生成实体类等代码文件。我在国庆时候,没事剖析了mybatis-generator-core源码,写了相当详细的中文注释,可以去看看。目前我剖析修改的是1.3.5版本。
在原版本的基础上,增加批量增加、修改的操作,增加统一模块生成,并且 生成的代码,支持最新的阿里巴巴java规范。
源码剖析说明
1.剖析org.mybatis.generator.plugins.ToStringPlugin源码
2.剖析org.mybatis.generator.plugins.MapperConfigPlugin源码
3.剖析org.mybatis.generator.api.ShellRunner源码,Main入口
3.剖析org.mybatis.generator.config.xml.ConfigurationParser源码,配置解析器,用于对generatorConfig.xml配置文件的解析
4.剖析org.mybatis.generator.config.Context源码,封装元素内容
修改源码说明(原版本没有的功能)
1.数据表的备注信息的添加:在FullyQualifiedTable类中添加remark字段,并在org.mybatis.generator.internal.db.DatabaseIntrospector类calculateIntrospectedTables方法,添加一段获取数据库备注的代码
//设置数据库表的备注信息
//start
Statement stmt = this.databaseMetaData.getConnection().createStatement();
ResultSet rs = stmt.executeQuery(
new StringBuilder()
.append("SHOW TABLE STATUS LIKE '")
.append(atn.getTableName())
.append("'")
.toString());
while (rs.next())
table.setRemark(rs.getString("COMMENT"));
closeResultSet(rs);
stmt.close();
//end
2..非model类Example的注释方法的添加,方法名addExampleClassComment(TopLevelClass topLevelClass)
3.重构部分org.mybatis.generator.codegen.mybatis3.IntrospectedTableMyBatis3Impl包里getGeneratedJavaFiles方法
4.详细中文注释的添加,入口包函数在org.mybatis.generator.api.ShellRunner
5.生成的中文注释信息可在修DefaultCommentGenerator类修改
6.增加MybatisServicePlugin:service层的代码生成,个人觉得不完美,因为业务会变,所以service层也会变,仅供学习参考
7.增加MapperPlugin:Mapper层有大量生成的重复方法,所以增加了统一继承IMapper接口实现
8.为IMapper接口加入批量插入数据的方法
9.删除ibatis2内容,并删除CaseInsensitiveLikePlugin插件(这个插件用来在XXXExample类中生成大小写敏感的LIKE方法插件本身用处不大,但是我们可以通过这个插件学习给XXXExample类添加额外的方法)),因此引用了ibatis2 10.为IMapper接口加入批量更新数据的方法
11.生成的代码符合阿里规范
使用方式
在项目.pom中,添加以下部分,更新maven即可(因为我已经把项目发布到maven中央仓库去了)。
<build>
<defaultGoal>compile</defaultGoal>
<plugins> <!-- 指定java版本-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin> <plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<!-- 指定配置文件的路径,默认是在resources下-->
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>io.github.orange1438</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin> </plugins>
</build>
配置文件
1.generatorConfig.properties
# data base info
jdbc.dataSource.url:jdbc:mysql://localhost:3306/manage_system?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
jdbc.dataSource.driverClassName:com.mysql.jdbc.Driver
jdbc.dataSource.username:root
jdbc.dataSource.password:123456
# Mybatis Generator configuration
# classPath:maven repository path,下载到仓库里,根据仓库路径修改
jdbc.mybatisGenerator.classPath=E:/orange/Documents/IdeaProjects/repository/mysql/mysql-connector-java/5.1.35/mysql-connector-java-5.1.35.jar
# javaModelGenerator
model.path=src/main/resources/test
model.package=orange1438.entity
# javaClientGenerator
mapper.path=src/main/resources/test
mapper.package=orange1438.mappers
# sqlMapGenerator
mapper.xml.path=src/main/resources/test
mapper.xml.package=orange1438.mapper
# service——If configuration
service.path=src/main/resources/test
service.package=orange1438.service
service.package.impl=orange1438.service.impl
2.generatorConfig.xml
<?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"> <!-- 参考官方文档
http://www.mybatis.org/generator/configreference/xmlconfig.html
http://generator.sturgeon.mopaas.com/index.html
http://www.jianshu.com/p/e09d2370b796
http://mbg.cndocs.tk/
-->
<generatorConfiguration> <!-- 引入配置文件 -->
<properties resource="test/generatorConfig.properties"/> <!-- 指定数据连接驱动jar地址 -->
<classPathEntry location="${jdbc.mybatisGenerator.classPath}"/> <!-- 一个数据库一个context -->
<context id="testTables" targetRuntime="MyBatis3">
<!-- 自动识别数据库关键字,默认false,如果设置为true,根据SqlReservedWords中定义的关键字列表;
一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖
-->
<property name="autoDelimitKeywords" value="false"/>
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- 格式化java代码 -->
<property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
<!-- 格式化XML代码 -->
<property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/> <!--开启抑制类型的警告信息-->
<property name="suppressTypeWarnings" value="true"/> <!-- 插件 :其他插件参考http://www.jianshu.com/p/1b826d43dbaf-->
<!--插件 :用来给Java模型生成equals和hashcode方法-->
<!--<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>-->
<!--插件 :用来为生成的Java模型类添加序列化接口-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!--插件 :生成的Java模型创建一个toString方法-->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
<property name="searchString" value="Example$"/>
<property name="replaceString" value="Criteria"/>
</plugin> <!-- 统一Mapper 接口 -->
<plugin type="org.mybatis.generator.plugins.MapperPlugin">
<property name="interfaceName" value="IMapper"/>
<!-- 是否删除Mapper类里的方法,默认删除-->
<property name="deleteMethod" value="true"/>
</plugin> <!-- service层插件 -->
<plugin type="org.mybatis.generator.plugins.MybatisServicePlugin">
<property name="targetPackage" value="${service.package}"/>
<property name="implementationPackage" value="${service.package.impl}"/>
<property name="targetProject" value="${service.path}"/>
<property name="enableInsert" value="true"/>
<property name="enableUpdateByExampleSelective" value="true"/>
<property name="enableInsertSelective" value="true"/>
<property name="enableUpdateByPrimaryKey" value="true"/>
<property name="enableDeleteByPrimaryKey" value="true"/>
<property name="enableDeleteByExample" value="true"/>
<property name="enableUpdateByPrimaryKeySelective" value="true"/>
<property name="enableUpdateByExample" value="true"/>
</plugin> <!-- 注释 -->
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="false"/>
<!-- 是否给实体类生成的备注的注释 true:是 : 默认为false:否 -->
<property name="addRemarkComments" value="true"/>
<!-- 是否去掉注释代时间戳 true:是 : false:否,默认yyyy-MM-dd HH:mm:ss(1.3.5-chinese-annotation修改版)-->
<property name="suppressDate" value="false"/>
<property name="dateFormat" value="yyyy/MM/dd HH:mm"/> <!-- 自己添加的参数属性:数据表字段的get、set方法是否添加final关键字,默认为true -->
<property name="addMethodFinal" value="true"/>
<property name="author" value="orange1438"/>
</commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="${jdbc.dataSource.driverClassName}"
connectionURL="${jdbc.dataSource.url}"
userId="${jdbc.dataSource.username}"
password="${jdbc.dataSource.password}">
</jdbcConnection> <!-- 类型转换 -->
<javaTypeResolver>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver> <!-- 生成实体类的位置 -->
<javaModelGenerator targetPackage="${model.package}"
targetProject="${model.path}">
<!-- for MyBatis3/MyBatis3Simple
自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;
-->
<property name="constructorBased" value="false"/> <!-- 是否在当前路径下新加一层schema,
eg:false路径com.orange1438.entity,
true:com.orange1438.entity.[schemaName]
-->
<property name="enableSubPackages" value="true"/>
<!-- 是否针对string类型的字段在set/get的时候进行trim调用:清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator> <!-- 生成mapper xml文件 -->
<sqlMapGenerator targetPackage="${mapper.xml.package}"
targetProject="${mapper.xml.path}">
<!-- 解释同上:生成实体类的位置 -->
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator> <!-- 对于mybatis来说,即生成Mapper接口,注意,如果没有配置该元素,那么默认不会生成Mapper接口
targetPackage/targetProject:同javaModelGenerator
type:选择怎么生成mapper接口(在MyBatis3/MyBatis3Simple下):
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
-->
<!-- 生成mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="${mapper.package}"
targetProject="${mapper.path}">
<!-- 解释同上:生成实体类的位置 -->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator> <!-- mvn mybatis-generator:generate -->
<!-- 指定生成的数据库表 -->
<!-- domainObjectName:指定生成的实体类的文件名 -->
<!--<table tableName="sys_user" domainObjectName="User"/>-->
<table tableName="test" domainObjectName="Test"/> <!-- 其他需求:有些表的字段需要指定java类型 -->
<!--<table schema="management_system" tableName="s_user"-->
<!--domainObjectName="UserEntity" enableCountByExample="false"-->
<!--enableDeleteByExample="false" enableSelectByExample="false"-->
<!--enableUpdateByExample="false">-->
<!--<!– schema即为数据库名 tableName为对应的数据库表 domainObjectName是要生成的实体类 enable*ByExample-->
<!--是否生成 example类 –>-->
<!--<!– 忽略列,不生成bean 字段 –>-->
<!--<ignoreColumn column="FRED" />-->
<!--<!– 指定列的java数据类型 –>-->
<!--<columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />-->
<!--</table>--> </context> </generatorConfiguration>
源码地址:
https://github.com/orange1438/mybatis-generator-core-chinese-annotation-1.3.5
基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析的更多相关文章
- 一个Python开源项目-哈勃沙箱源码剖析(下)
前言 在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程.本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility.volatility的介 ...
- Mybatis架构原理(二)-二级缓存源码剖析
Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...
- 一个Python开源项目-腾讯哈勃沙箱源码剖析(上)
前言 2019年来了,2020年还会远吗? 请把下一年的年终奖发一下,谢谢... 回顾逝去的2018年,最大的改变是从一名学生变成了一位工作者,不敢说自己多么的职业化,但是正在努力往那个方向走. 以前 ...
- 把项目通过maven生产源码包和文档包并发布到自己的私服上
<!-- 把项目通过maven生产源码包和文档包并发布到自己的私服上 执行maven命令,mvn clean package,执行完成后 命令:mvn deploy 就可以发布到你自己的私服上了 ...
- 基于Asp.Net Core的简单社区项目源代码开源
2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...
- Asp.net core 项目实战 新闻网站+后台 源码、设计原理 、视频教程
首先说明,视频教程.源码并非本人原创 本人将项目分割开,并写了一些说明. 该视频教程 地址 https://study.163.com/course/courseMain.htm?courseId= ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- HoloToolkit项目源码剖析 - Spatial Mapping功能实现
就像我之前所描述的,HoloToolkit项目是微软基于Unity内置的底层API封装的一套工具集合,帮助我们快速使用Unity集成开发HoloLens应用. 本文主要通过源码研究其中Spatial ...
- 基于tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
基于tensorflow的‘端到端’的字符型验证码识别 1 Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展 ...
随机推荐
- JMeter--二、在Windows环境上搭建wordpress
为了学习使用JMeter,在Windows环境上搭建了wordpress. 使用JMeter录制或是编写登录worepress.编辑文章.删除文章的脚本. 首先了解一下wordpress是什么? Wo ...
- let命令
基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 上面代码在代码块之中,分别用let和var声明了两个变量.然后在代码块之外调 ...
- MySQL 查看表结构简单命令
一.简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键. 例如:desc table_name 二.查询表中列的注释信息 select ...
- 自用迷你版的Deferred
啥也不说贴代码,项目用 /** * 迷你版的deferred */ function Deferred(func) { if (this instanceof Deferred === false) ...
- MVVM框架下 WPF隐藏DataGrid一列
最近的一个项目,需要在部分用户登录的时候,隐藏DataGrid中的一列,但是常规的绑定不好使,在下面举个例子. XAML部分代码 <Window x:Class="DataGridCo ...
- WPF datagrid 加入图片
<DataGridTemplateColumn Header="图像" Width="SizeToCells"> <DataGridTempl ...
- lintcode 落单的数(位操作)
题目1 落单的数 给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字. 链接:http://www.lintcode.com/zh-cn/problem/single ...
- Create Volume 操作(Part II) - 每天5分钟玩转 OpenStack(51)
上一节我们讨论了 Cinder 创建 Volume 的第一部分,cinder-api 的操作,本节继续第二部分,cinder-scheduler 调度工作. cinder-scheduler 执行调度 ...
- 哪些HTML5特性值得期待
首先大家可以看一下<HTML5程序设计(第二版)>最后一章关于HTML5未来展望.地址:http://www.ituring.com.cn/article/1690?q=html5%E6% ...
- js操作label,给label赋值,和取label的值
取值:var Label_text=document.getElementById('test_label').innerHTML; 赋值:document.getElementById('test_ ...