目录
一、什么是MyBatis逆向工程?
平时在开发项目的时候,数据持久层经常会用到mybatis框架来操作数据库,sql语句需要程序员自己去编写,这样就浪费了一部分没有必要的时间了。不过mybatis官方是提供逆向工程,简单理解的话就是,mybatis通过mybatis generator插件针对数据库单表生成mybatis执行时所需要的代码,比如:mapper.java、mapper.xml、pojo等,有效的提高了工作效率。
实际的开发中,经常用到的mybatis逆向工程的方式为:由数据库的表生成java代码;之所以强调单表两个字,是因为Mybatis逆向工程生成的Mapper所进行的操作都是针对单表的,也许你可能会觉得那这就有点鸡肋了,但是在大型项目中,很少有复杂的多表关联查询,所以作用还是很大的。
二、mybatis generator插件安装过程
1、在eclipse导航栏选择Help-->Eclipse Marketpalce --> 搜索框搜,输入:mybatis generator;然后出现如下页面:
最后按照步骤说明进行安装即可
2、安装结束以后,选中要生成代码的项目,鼠标右击,选择New–>Other,键入mybatis,可以查看到刚刚安装好的mybatis generator。如下图,说明mybatis generator插件安装成功。
三、配置generatorConfig.xml文件
选择mybatis generator插件,创建一个新的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">
<!-- 配置生成器 -->
<generatorConfiguration>
<!-- 可以用于加载配置项或者配置文件,在整个配置文件中就可以使用${propertyKey}的方式来引用配置项
resource:配置资源加载地址,使用resource,MBG从classpath开始找,比如com/myproject/generatorConfig.properties
url:配置资源加载地质,使用URL的方式,比如file:///C:/myfolder/generatorConfig.properties.
注意,两个属性只能选择一个;
另外,如果使用了mybatis-generator-maven-plugin,那么在pom.xml中定义的properties都可以直接在generatorConfig.xml中使用
<properties resource="" url="" /> -->
<properties resource="mybatis/generator.properties"></properties>
<!-- 连接mysql包,选择自己本地硬盘上面的数据库驱动包 -->
<classPathEntry location="${db.driverLocation}"/>
<!--
context:生成一组对象的环境
id:必选,上下文id,用于在生成错误时提示
defaultModelType:指定生成对象的样式
1,conditional:类似hierarchical;
2,flat:所有内容(主键,blob)等全部生成在一个对象中;
3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他简单属性在一个对象中(record class)
targetRuntime:
1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
introspectedColumnImpl:类全限定名,用于扩展MBG
-->
<context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!-- 自动识别数据库关键字,默认false;一般保留默认值,遇到数据库关键字(Java关键字),使用columnOverride覆盖 -->
<property name="autoDelimitKeywords" value="true"/>
<!-- 生成的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"/>
<!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,比如ORACLE就是双引号,MYSQL默认是`反引号; -->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
<commentGenerator>
<!-- 这个元素用来删除指定生成的注释中是否包含生成的日期 false:表示 生成日期,true:表示不生成日期-->
<!-- 如果生成日期,会造成即使修改一个字段,整个实体类所有属性都会发生变化,不利于版本控制,所以设置为true -->
<property name="suppressDate" value="true" />
<!-- 是否去除自动生成的注释 true:是 ,false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection connectionURL="${db.url}"
driverClass="${db.driverClassName}"
userId="${db.username}"
password="${db.password}">
<!--MySQL 不支持 schema 或者 catalog 所以需要添加这个-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL和 NUMERIC类型解析为 Integer,为 true时把JDBC DECIMAL和NUMERIC类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成pojo实体类
负责:1,key类(见context的defaultModelType);2,java类;3,查询类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="com.you.rabbitmq"
targetProject="rabbitmq-demo/src/main/java">
<!-- 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;如果想在实体类中生成构造函数,则table标签中constructorBased属性也要设置成true -->
<property name="constructorBased" value="false"/>
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
<!-- 是否创建一个不可变的类,如果为true, 那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 -->
<property name="immutable" value="false"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成SQL map的XML文件生成器,注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口,
或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML文件的话,这个元素就必须配置
targetPackage/targetProject:同javaModelGenerator
-->
<sqlMapGenerator targetPackage="mapper"
targetProject="rabbitmq-demo/src/main/resources/">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
</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
-->
<javaClientGenerator targetPackage="com.you.rabbitmq"
type="XMLMAPPER"
targetProject="rabbitmq-demo/src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 要生成哪些表
tableName(必要):要生成对象的表名
可选:
1,schema:数据库的schema;
2,catalog:数据库的catalog
3,alias:为数据表设置的别名,如果设置了alias,那么生成的所有的SELECT SQL语句中,列名会变成:alias_actualColumnName
4,domainObjectName:生成的domain类的名字,如果不设置,直接使用表名作为domain类的名字;可以设置为somepck.domainName,那么会自动把domainName类再放到somepck包里面
5,enableInsert(默认true):指定是否生成insert语句
6,enableSelectByPrimaryKey(默认true):指定是否生成按照主键查询对象的语句(就是getById或get)
7,enableUpdateByPrimaryKey(默认true):指定是否生成按照主键修改对象的语句(即update)
8,enableDeleteByPrimaryKey(默认true):指定是否生成按照主键删除对象的语句(即delete)
9,enableSelectByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询语句
10,enableDeleteByExample(默认true):MyBatis3Simple为false,指定是否生成动态删除语句
11,enableCountByExample(默认true):MyBatis3Simple为false,指定是否生成动态查询总条数语句(用于分页的总条数查询)
12,enableUpdateByExample(默认true):MyBatis3Simple为false,指定是否生成动态修改语句(只修改对象中不为空的属性)
13,modelType:参考context元素的defaultModelType,相当于覆盖
14,delimitIdentifiers:参考tableName的解释,注意,默认的delimitIdentifiers是双引号,如果类似MYSQL这样的数据库,使用的是`(反引号,那么还需要设置context的beginningDelimiter和endingDelimiter属性)
15,delimitAllColumns:设置是否所有生成的SQL中的列名都使用标识符引起来。默认为false,delimitIdentifiers参考context的属性
注意,table里面很多参数都是对javaModelGenerator,context等元素的默认属性的一个复写;
-->
<!--表配置,tableName支持%,表示全部生成-->
<table tableName="userinfo" domainObjectName="UserInfo">
<!-- 参考 javaModelGenerator 的 constructorBased属性-->
<property name="constructorBased" value="false"/>
<!-- 默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema; -->
<property name="ignoreQualifiersAtRuntime" value="false"/>
<!-- 参考 javaModelGenerator 的 immutable 属性 -->
<property name="immutable" value="false"/>
<!-- 指定是否只生成domain类,如果设置为true,只生成domain类,如果还配置了sqlMapGenerator,那么在mapper XML文件中,只生成resultMap元素 -->
<property name="modelOnly" value="false"/>
<!-- 如果设置为true,生成的model类会直接使用column本身的名字,而不会再使用驼峰命名方法,比如BORN_DATE,生成的属性名字就是BORN_DATE,而不会是bornDate -->
<property name="useActualColumnNames" value="false"/>
<!-- 设置是否所有生成的SQL中的列名都使用标识符引起来,默认为false -->
<property name="delimitAllColumns" value="true"/>
<!-- mysql配置 -->
<generatedKey column="user_id" sqlStatement="Mysql" identity="true"/>
<!-- 用来修改表中某个列的属性,MBG会使用修改后的列来生成domain的属性;注意:一个table元素中可以有多个columnOverride元素
column:要重新设置的列名。注意,一个table元素中可以有多个columnOverride元素;
property:该属性来指定要生成实体类domain的属性名称;
javaType:该属性用于指定生成的domain的属性类型,使用类型的全限定名 ;
jdbcType:用于指定该列的JDBC类型 ;
-->
<columnOverride column="user_name" property="jiaName" javaType="java.lang.String"/>
<!-- ignoreColumn设置一个MGB忽略的列,如果设置了改列,那么在生成的domain中,生成的SQL中,都不会有该列出现;注意:一个table元素中可以有多个ignoreColumn元素
column:指定要忽略的列的名字;
delimitedColumnName:参考table元素的delimitAllColumns配置,默认为false;
-->
<ignoreColumn column="user_age" delimitedColumnName="true"/>
</table>
</context>
</generatorConfiguration>
补充generator.properties文件配置:
db.driverLocation=C:/software/maven/maven-repository/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar
db.driverClassName=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
db.username=root
db.password=123456
generatorConfig.xml文件配置好以后,选中generatorConfig.xml文件,鼠标右击选择run as,选择run mybatis generator即可逆向生成相关java代码。上面的配置是在单应用程序中执行的,不过有几点需要注意的地方:
1、generatorConfig.xml文件中标签的顺序不能颠倒,否则执行时会报错;
2、生成文件放置的位置targetProject="rabbitmq-demo/src/main/java",路径前面一定要加行项目名称,否则不能生成文件;网上有些例子说的是不用加项目名称,写成targetProject="src/main/java"就可以生成文件,本人亲测了一下,然而并没有生成相应的文件,可能是和mybatis generator插件的版本有关系,我也搞不明白为啥。
3、在springboot多模块项目中,如何使用mybatis generator插件逆向生成代码,其实就是改一下generatorConfig.xml文件中修改一下文件生成位置的路径即可,其他的不用修改,修改如下:
<!-- 生成pojo实体类
负责:1,key类(见context的defaultModelType);2,java类;3,查询类
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中,如果目录不存在,MBG不会自动建目录
-->
<javaModelGenerator targetPackage="com.you.wstro.bean"
targetProject="wstro-entity/src/main/java">
<!-- 自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;如果想在实体类中生成构造函数,则table标签中constructorBased属性也要设置成true -->
<property name="constructorBased" value="false"/>
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
<!-- 是否创建一个不可变的类,如果为true, 那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类 -->
<property name="immutable" value="false"/>
<!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成SQL map的XML文件生成器,注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口,
或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML文件的话,这个元素就必须配置
targetPackage/targetProject:同javaModelGenerator
-->
<sqlMapGenerator targetPackage="mapper"
targetProject="wstro-dao/src/main/resources/">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
</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
-->
<javaClientGenerator targetPackage="com.you.wstro.mapper"
type="XMLMAPPER"
targetProject="wstro-dao/src/main/java">
<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
我这里是将java实体类放在wstro-entity模块中,将mapper接口以及sql xml文件放在了wstro-到模块中,这样的话就需要修改文件生成的路径,文件生成在哪个模块,就在路径上加上哪个模块的名称即可。网上有的说是用相应模块的结对路径,我尝试了一下文件生成失败。