Mybatis代码生成器Generator

  • A+
所属分类:Java Mybatis Spring 数据库

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。我们最常使用xml文件进行sql的映射,但是xml初期繁杂的、重复性编码让人烦恼,所以MyBatis官方提供了代码的自动生成器,配合maven插件完成了代码的初始化工作。

1.在mavan中引入Generator插件

  • 引入mybatis-generator插件
        <build>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.7</version>
                    <configuration>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.3.7</version>
                        </dependency>
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <version>8.0.18</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    
  • 在mavan插件中使用了<dependencies>,声明此插件依赖代码生成器核心包以及连接mysql的驱动包,我们在依赖中设置了这些,则在配置文件中就不需要额外指定本地数据库驱动包了。
  • 引入插件后在我们的idea中,可见如下命令选项
    Mybatis代码生成器Generator

2.Generator配置文件位置

  • Generator插件默认加载的配置文件地址是src/main/resources/generatorConfig.xml,在plugin.xml中可见如下默认配置
      <configurationFile implementation="java.io.File" default-value="{project.basedir}/src/main/resources/generatorConfig.xml">{mybatis.generator.configurationFile}</configurationFile>
    
  • 当然我们可以自定义配置文件的位置,如下
     <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <configurationFile>src/main/resources/config/userGeneratorConfig.xml</configurationFile>
            </configuration>
         ....
    

3.generatorConfig配置文件范例

  • generatorConfig.xml中
    
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <!--指定加载本地文件,一般加载jdbc驱动,若在pom.xml中配置了依赖则可不用添加-->
        <!--<classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->
    
        <!--指定properties位置,将变量配置到generator.properties中-->
        <properties resource="generator.properties"/>
    
        <context id="DB2Tables" targetRuntime="MyBatis3">
            <!--可以使用一系列的内部差价,例如实体生成序列化,.EqualsHashCode,toString方法等-->
            <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
            <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
            <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
            <!--自定义注释,suppressAllComments关闭所有注释,关闭创建时间的注释-->
            <commentGenerator >
                <property name="suppressDate" value="true"/>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
            <!--设置数据库连接信息-->
            <jdbcConnection driverClass="{jdbc.driverClass}"                         connectionURL="{jdbc.connectionURL}" userId="{jdbc.userId}"                         password="{jdbc.password}"/>
    
            <!--指定数据库类型对应java实体类的转换方式,一般保证默认值就可以-->
            <javaTypeResolver >
                <!--对DECIMAL和NUMERIC列不使用java.math.BigDecimal类型-->
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!--实体类生成配置-->
            <!--targetProject相对于项目目录地址,若此值为MAVEN则默认在\target\generated-sources包下生成数据;targetPackage放置到包路径下-->
            <!--enableSubPackages是否可以自动生成子包,trimStrings为数据库返回值自动修剪空串-->
            <javaModelGenerator targetPackage="{entityPath}" targetProject="{basePath}">
                <property name="enableSubPackages" value="true" />
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
            <!--生成sql映射文件配置-->
            <sqlMapGenerator targetPackage="{packagePath}"  targetProject="{basePath}">
                <property name="enableSubPackages" value="true" />
            </sqlMapGenerator>
            <!--java接口生成器-->
            <!--type配置是否带有xml配置文件的dao接口,还有生成xml和注解混用,或者单注解的dao;type="XMLMAPPER"只生成对应xml类型的dao接口-->
            <javaClientGenerator type="XMLMAPPER" targetPackage="{packagePath}"  targetProject="{basePath}">
                <property name="enableSubPackages" value="true" />
            </javaClientGenerator>
    
            <!--表映射配置  tableName表名,domainObjectName生成实体名-->
            <!--*ByExample,设置为false将不会生成范例-->
            <table  tableName="{table.name}" domainObjectName="{domain.name}" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"/>
        </context>
    </generatorConfiguration>
    
  • generator.properties中
    jdbc.driverClass=com.mysql.cj.jdbc.Driver
    jdbc.connectionURL=jdbc:mysql://localhost:3306/${database}?useSSL=false&serverTimezone=UTC
    jdbc.userId=root
    jdbc.password=higuys
    
    # 数据库名称
    database=mybatis
    
    #表名
    table.name=mybatis_generator
    #实体名称
    domain.name=MybatisGenerator
    
    #xml映射目录
    entityPath=org.friends.mybatisgenerator.generator
    
    # mapper文件目录
    packagePath=org.friends.mybatisgenerator.generator
    
    #相对于项目目录地址
    basePath=src/main/java
    
  • 配置完成,点击mybatis-generator:generate,src路径下生成文件
    org.friends.mybatisgenerator.generator//在此包下
        - MybatisGenerator
        - MybatisGeneratorMapper
        - MybatisGeneratorMapper.xml
    

4.问题处理

  • 错误点:
    1. 生成的 mapper.xml 文件中,有多个 id="BaseResultMap"的映射节点(其它节点也都是多份),导致项目启动的时候报错;
    2. 生成的 pojo 类字段还是之前我在老数据库中定义的同名表的字段(新库中同名表我添加了一些字段);
  • 问题原因:
    1. 在数据库服务器上,不同的数据库中表名相同的表多张。(有几个同名的表,就会生成几次)
    2. mysql驱动升级到8.x,造成设置schema无效。
  • 解决问题:jdbc连接新增nullCatalogMeansCurrent属性:
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                            connectionURL="jdbc:mysql://xxx?useUnicode=true"
                            userId="username"
                            password="password">
        <property name="nullCatalogMeansCurrent" value="true" />
    </jdbcConnection>
    

5.总结

zhangfeng

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: