Mybatis逆向工程
1 逆向工程
    逆向工程(代码生成器)就是根据数据库表生成与表对应的PO类和基于单表的增删改查的DAO(Mapper)类与映射文件(mapper.xml)等。用于提升开发效率。
    MyBatis Generator(MBG)是Mybatis提供的一个逆向工程的实现。最新版本是1.3.7。
运行MBG有五种方式:
2 使用maven插件的方式
MBG重要的有两个:
- 生成代码的过程与规则等配置(一般由XML文件配置,也可以使用java代码配置)
- 实现代码生成(mybatis-generator-core-x.x.x.jar,最新的版本为1.3.7)
3 配置maven插件信息
<!--配置pom文件的全局属性,通过${varName}格式获取属性值-->
<properties>
      <overwrite>true</overwrite>
</properties>
     
<build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <!-- 在maven构建阶段执行代码生成操作-->
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <!--MBG配置属性-->
                <configuration>
                <!--生成代码的规则配置文件路径-->
                    <configurationFile>${basedir}/src/test/resources/generatorConfig.xml</configurationFile>
                   <overwrite>${overwrite}</overwrite>
                    <verbose>true</verbose>
                </configuration>
              <dependencies>
              <!--插件运行需要的依赖,这里必须要配置驱动包的依赖,generatorConfig配置文件中的<classPathEntry> 元素配置对maven插件方式没有效果-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
4 MBG配置属性详解
configurationFile:指定配置文件的名称。默认值:${basedir}/src/main/resources/generatorConfig.xml
contexts:参数值是generatorConfig.xml配置文件中
元素的id属性值(多个用逗号隔开),如果指定了该参数,指定的context才会被激活执行。默认是所有的context都会被激活执行。 sqlScript:要在生成代码之前运行的SQL脚本的位置。(指定了sqlScript参数需要指定jdbcDriver、jdbcURL、jdbcUserId 和 jdbcPassword)。值可以是文件的绝对路径或者是使用"classpath:"开头放在构建的类路径下的路径。
jdbcDriver:JDBC驱动类
jdbcPassword:数据库登录密码
jdbcURL:连接数据库的JDBC URL
jdbcUserId:连接数据库的账户名
outputDirectory:将放置 MBG 所生成文件的目录。这个目录是用于当targetProject在generatorConfig配置文件中设置特殊值的"MAVEN"时作为输出目录使用(大小写敏感),如果不存在则创建,而targetProject在generatorConfig配置文件中设置的值不为"MAVEN"时,则把targetProject设置的目录作为输出目录,而且该目录必须存在。默认值:${project.build.directory}/generated-sources/mybatis-generator。
overwrite:boolean类型参数,默认值为false,该参数的作用是生成的java文件存在已经同名的文件,是否覆盖源文件,如果值为true则会覆盖原文件。如果没有指定该参数或者值为false,MBG会给新生成的代码文件生成一个唯一的名字(例如: MyClass.java.1, MyClass.java.2)。 重要: 生成器一定会自动合并或覆盖已经生成的XML文件。
tableNames:参数的值是generatorConfig.xml配置文件中
<table>元素的tableName属性值(多个用逗号隔开),如果指定了该参数,指定的表才会被激活执行。默认是所有的表都会被激活执行。verbose:boolean类型参数,默认false 执行过程是否输出到控制台
includeCompileDependencies:boolean类型参数,是否将具有范围"compile","provided"和"system"的依赖项添加到生成器的类路径中
includeAllDependencies:boolean类型参数,是否将任何范围的依赖项添加到生成器的类路径中
5 配置生成代码规则文件(generatorConfig.xml)
    配置文件一般命名为generatorConfig.xml。配置文件告诉MBG:
- 怎样连接数据库
- 生成什么对象,以及如何生成它们
- 那些表生成对象
来一个mysql的配置
<generatorConfiguration>
    <context id="MysqlContext" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <property name="javaFileEncoding" value="UTF-8"/>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/smartfsc_company"
                        userId="root"
                        password="123456">
            <property name="serverTimezone" value="Hongkong"/>
            <property name="useUnicode" value="true"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="useSSL" value="true"/>
            <property name="useJDBCCompliantTimezoneShift" value="true"/>
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.test.mybatis.genterator.entity" targetProject="src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.test.mybatis.genterator.mapper" targetProject="src\main\java"/>
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.test.mybatis.genterator.mapper"
                             targetProject="src\main\java"/>
        <table tableName="%"  enableCountByExample="false" enableUpdateByExample="false"
               enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="Mysql"/>
            <domainObjectRenamingRule searchString="^T" replaceString="" />
        </table>
    </context>
</generatorConfiguration>
6 配置文件详解
6.1 <generatorConfiguration> 元素
    <generatorConfiguration> 元素是MyBatis Generator配置文件的根元素,这个配置文件必须包含下面的 DOCTYPE:
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration> 元素没有属性,它有三个子元素:
- <properties>(0 or 1)
- <classPathEntry>(0..N)
- <context>(1..N)
6.2 <properties> 元素
    <properties> 元素是 <generatorConfiguration> 元素的子元素。用于指定一个需要在MBG配置中解析使用的外部属性文件(.properties)。属性配置文中的属性通过 ${varName}取值。可以有0或者1个
6.2.1 属性
<properties> 元素有两个必选属性(二选一),没有可选属性和子元素。必选属性为:
- resource:属性文件的全限定名称。当指定了resource属性,将会从classpath下面搜索属性文件
- url:属性文件的URL值
6.3 <classPathEntry> 元素
     
6.3.1 属性
<classPathEntry>元素有一个必选属性,没有可选属性和子元素。必选属性为:
- location:要添加到类路径中的JAR/ZIP文件的完整路径
6.4 <context> 元素
    <context> 元素用于指定生成一组对象的环境(包括连接数据库,生成代码的规则之类的)。可以有1个或者多个,多个 <context> 元素表示可以在同一个MyBatis Generator (MBG)从不同的数据库或者使用不同的生成器生成对象。这个元素很重要。
6.4.1 属性
<context> 元素有一个必选属性和三个可选属性。
6.4.1.1 必选属性
必选属性为:
- id:是<context>元素的唯一标识。
6.4.1.2 可选属性
可选属性:
- defaultModelType: 这个属性用来定义了MBG如何生成实体类,有3个值:
| 描述 | 
|---|
| conditional(默认值): 如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。 | 
| flat: 每一张表只生成一个实体类。这个实体类包含表中的所有字段。 | 
| hierarchical: 如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。MBG会在所有生成的实体类之间维护一个继承关系(BLOB类继承其他字段类继承主键类)。 | 
- targetRuntime: 用于指定生成的代码的代码生成器。有4个值:
| 描述 | 
|---|
| MyBatis3(默认值): 会生成兼容MyBatis 3.0或更高版本,兼容JSE 5.0或更高版本的PO类对并且支持JavaSE 5.0特性(包含泛型和注解)。会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。 | 
| MyBatis3Simple: 上面的MyBatis3值类似,但是不会有*Example.java文件,只有少量的动态SQL。 | 
| Ibatis2Java2: 会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3),还有Java2的所有特性的对象。 会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。但是对象不能100%和原生的Abator或其他的代码生成器兼容。 | 
| Ibatis2Java5: 会生成兼容iBATIS 2.2.0或更高版本(除了iBATIS 3),还有Java5或更高版本的对象并支持java5的特性(泛型、注解)。会生成一些*Example.java,而且mapper映射文件也会生成一些复杂的SQL。但是对象不能100%和原生的Abator或其他的代码生成器兼容。 | 
| MBG还支持自定义代码生成器,(继承org.mybatis.generator.api.IntrospectedTable类)然后插入到代码生成器引擎中。 查阅扩展 MyBatis Generator页面获取更多信息。 | 
- introspectedColumnImpl: 通过这个值指定一个继承org.mybatis.generator.api.IntrospectedColumn类的全类名, 可以修改代码生成器生成列信息的行为。 查阅扩展 MyBatis Generator页面获取更多信息。
6.4.2 子元素
     <context> 元素有10个子元素:
- <property> (0..N)
- <plugin> (0..N)
- <commentGenerator> (0 or 1)
- <connectionFactory> (connectionFactory和jdbcConnection 二选一)
- <jdbcConnection> (connectionFactory和jdbcConnection 二选一)
- <javaTypeResolver> (0 or 1)
- <javaModelGenerator> (1 Required)
- <sqlMapGenerator> (0 or 1)
- <javaClientGenerator> (0 or 1)
- <table> (1..N)
6.5 <property> 元素
    
6.5.1 属性
    
6.5.1.1 必选属性
- name: 属性的名称(区分大小写)
- value:属性的值(通常是不区分大小写)
6.5.2  元素支持的属性 
- autoDelimitKeywords: boolean类型,设置MBG是否需要给把数据库关键字作为名称的数据库表或者列加上分隔符。默认值是false
- beginningDelimiter: 设置起始分隔符的值,默认是双引号(")。MBG会自动分割包含空格的和<table>元素或<columnOverride>元素中配置的标识符。
- endingDelimiter: 设置结束分隔符的值,默认是双引号(")。MBG会自动分割包含空格的和<table>元素或<columnOverride>元素中配置的标识符。
- javaFileEncoding: 设置生成的Java文件的编码,默认使用当前平台的编码
- javaFormatter: 自定义java文件格式化的规则,需要继承org.mybatis.generator.api.JavaFormatter且必须有一个默认(不含参数)的构造方法。默认使用MBG的格式化规则。
- xmlFormatter: 自定义xml文件格式化的规则,需要继承org.mybatis.generator.api.XmlFormatter且必须有一个默认(不含参数)的构造方法。默认使用MBG的格式化规则。
由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`),配置如下:
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
我在mysql中autoDelimitKeywords、beginningDelimiter、endingDelimiter这三个属性没有体现出效果。
6.6  元素 
    <plugin> 元素用来定义一个插件。插件用于扩展或修改通过MBG代码生成器生成的代码。是 <context> 的子元素,可以定义任意个插件。插件按照配置中配置的顺序执行。
自己开发插件
MBG已有的插件介绍
6.6.1 属性
    <plugin> 元素有一个必选属性,无可选属性,有一个子元素。
6.6.1.1 必选属性
必选属性为:
- type:实现插件接口org.mybatis.generator.api.Plugin的自定义插件类的全限定名。该实现类必须具有公共的默认构造函数。推荐扩展适配器类org.mybatis.generator.api.PluginAdapter,这个适配器类比继承接口更容易扩展
6.6.1.2 子元素
子元素为 <property>
使用maven插件集成MBG的问题汇总
使用MBGsqlScript属性生成表的中文注释乱码
    使用MBGsqlScript属性生成表的中文注释乱码的原因:
- mybatis-generator插件输出文件使用的是maven的默认编码,而maven的默认编码又是使用的是jdk,jdk又是根据操作系统(windows)的是GBK,而项目工程是utf-8。
解决方法:
- 在每次运行mvn mybatis-generator:generate前先运行set MAVEN_OPTS="-Dfile.encoding=UTF-8"
- 设置maven的默认编码:想一劳永逸可以配置环境变量MAVEN_OPTS / -Dfile.encoding=UTF-8
- 设置JDK的默认编码:配置环境变量JAVA_TOOL_OPTIONS / -Dfile.encoding=UTF-8
配置完环境变量之后遇到docs命令显示的maven编码为UTF-8,而IDEA的命令行编码还是为GBK的问题,关机重启机器即可。
- 没有设置UTF-8编码 
解决方法:<jdbcURL>jdbc:mysql://127.0.0.1:3306/testsqlscript?characterEncoding=UTF-8</jdbcURL>
maven插件方式集成MBG<classPathEntry> 元素引入驱动包无效
解决方式:在pom文件中使用插件依赖引入的方式引入数据库驱动包
<build>
    <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.7</version>
        <configuration>
          <configurationFile>${basedir}/src/test/resources/generatorConfig.xml</configurationFile>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>com.genterator</groupId>
            <artifactId>commentplugin</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>E:/commentplugin-1.0.jar</systemPath>
          </dependency>
         <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
maven插件方式生成java文件的中文注释乱码
原因和问题1一样,maven编码问题
解决方法除了问题1的解决方法外还可以在generatorConfig.xml的<context> 元素加上<property name="javaFileEncoding" value="UTF-8"/>属性
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号