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> 元素

     的子元素,主要用于将外部的文件(JDBC驱动包)添加到classpath中。可以有0或者多个。

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=""/>

```

我在mysql中autoDelimitKeywordsbeginningDelimiterendingDelimiter这三个属性没有体现出效果。

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属性生成表的中文注释乱码的原因:

  1. 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的问题,关机重启机器即可。

  1. 没有设置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"/>属性

转载于:https://www.cnblogs.com/heavenbird/articles/9586153.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值