Mybatis Generator自动生成代码

MyBatis Generato是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的持久化对象(PO)、用于操作数据库的接口(DAO)以及跟 DAO 所绑定的对应 XML。支持基本的增删改查,以及QBC(Query By Criteria)风格的条件查询。但是表连接、存储过程等这些复杂sql的定义需要我们手工编写。

 

文档地址: http://www.mybatis.org/generator/

官方工程地址: https://github.com/mybatis/generator/releases

 

配置数据库连接信息

在pom中引入连接mysql数据库的jar包

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

 

在配置文件application.properties中添加连接mysql数据库的信息(此配置跟generator工具无关,用于api连接数据库):

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf8
spring.datasource.username=******
spring.datasource.password=******

 

com.mysql.jdbc.Driver对应低版本msyql、也就是mysql-connector-java 5中的。

com.mysql.cj.jdbc.Driver 对应高版本mysql、也就是 mysql-connector-java 6及以上。

配置自动生成代码插件

MyBatis Generator插件需要根据一个配置文件来具体运行,在pom中引Generator插件的同时指定配置文件的路径。

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.2</version>
    <configuration>
        <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
        <overwrite>true</overwrite>
        <verbose>true</verbose>
    </configuration>
</plugin>

添加mybatis generator core依赖

添加生成xml,mapper和持久化对象代码时使用的jar包

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.2</version>
</dependency>

generatorConfig.xml配置

generatorConfig.xml配置文件是运行逆向工程的主程序。在运行程序之前,需要在generatorConfig.xml配置文件中配置数据库连接信息、配置POJO类、Mapper接口和Mapper映射文件生成的位置以及指定数据表。

 

<?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" >

<!-- mybatis生成配置 -->

<generatorConfiguration>

    <!-- 数据库连接jar路径 -->

    <classPathEntry location="E:/mysql-connector-java-5.1.16-bin.jar"/>

    <!--

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

 

        <!-- beginningDelimiter和endingDelimiter:指明数据库的用于标记数据库对象名的符号,

        比如ORACLE就是双引号,MYSQL默认是`反引号; -->

        <!-- <property name="beginningDelimiter" value="`"/>

        <property name="endingDelimiter" value="`"/> -->

 

        <!-- 注释信息 -->

        <commentGenerator>

            <property name="suppressDate" value="true"/>

            <property name="suppressAllComments" value="false"/>

        </commentGenerator> 

 

        <!-- 数据库连接设置,设置url,用户名密码 -->

        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/xex" userId="root" password="1qaz2wsx">

        </jdbcConnection> 

 

        <!-- java类型处理器

        用于处理DB中的类型到Java中的类型,默认使用JavaTypeResolverDefaultImpl;

        注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和 NUMERIC数据类型;

        -->

        <javaTypeResolver type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">

            <!--

                true:使用BigDecimal对应DECIMAL和 NUMERIC数据类型

                false:默认,

                    scale>0;length>18:使用BigDecimal;

                    scale=0;length[10,18]:使用Long;

                    scale=0;length[5,9]:使用Integer;

                    scale=0;length<5:使用Short;

             -->

            <property name="forceBigDecimals" value="false"/>

        </javaTypeResolver>

 

        <!-- 构建实体类 -->

        <!-- java模型创建器,是必须要的元素

            负责:1,key类(见context的defaultModelType);2,java类;3,查询类

            targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;

            targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中

         -->

        <javaModelGenerator targetPackage="test.entity" targetProject="springMvcModelForTestGenerator">

            <!--  for MyBatis3/MyBatis3Simple

                自动为每一个生成的类创建一个构造方法,构造方法包含了所有的field;而不是使用setter;

             -->

            <property name="constructorBased" value="false"/>

 

            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->

            <property name="enableSubPackages" value="false"/>

 

            <!-- for MyBatis3 / MyBatis3Simple

                是否创建一个不可变的类,如果为true,

                那么MBG会创建一个没有setter方法的类,取而代之的是类似constructorBased的类

             -->

            <property name="immutable" value="false"/>

 

            <!-- 设置一个根对象,

                如果设置了这个根对象,那么生成的keyClass或者recordClass会继承这个类;在Table的rootClass属性中可以覆盖该选项

                注意:如果在key class或者record class中有root class相同的属性,MBG就不会重新生成这些属性了,包括:

                    1,属性名相同,类型相同,有相同的getter/setter方法;

             -->

            <!-- <property name="rootClass" test.entity.BaseDomain"/> -->

 

            <!-- 设置是否在getter方法中,对String类型字段调用trim()方法 -->

            <property name="trimStrings" value="true"/>

        </javaModelGenerator>

 

        <!-- 生成SQL map的XML文件生成器,

            注意,在Mybatis3之后,我们可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),

                或者只使用Mapper接口+Annotation,所以,如果 javaClientGenerator配置中配置了需要生成XML的话,这个元素就必须配置

            targetPackage/targetProject:同javaModelGenerator

         -->

        <sqlMapGenerator targetPackage="test.mapping" targetProject="springMvcModelForTestGenerator">

            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->

            <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

        -->

        <javaClientGenerator targetPackage="test.dao" type="XMLMAPPER" targetProject="springMvcModelForTestGenerator">

            <!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->

            <property name="enableSubPackages" value="true"/>

 

            <!-- 可以为所有生成的接口添加一个父接口,但是MBG只负责生成,不负责检查

            <property name="rootInterface" value=""/>

             -->

        </javaClientGenerator>

 

        <table tableName="user_tbl" domainObjectName="UserEntity" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>

 

    </context>

</generatorConfiguration>

运行

第一种方式是图形化运行:

双击maven窗口Plugins插件的mybatis-generator:generate

 

第二种方式是命令行运行:

Cd 项目根目录

运行mvn mybatis-generator:generate

 

遇到的报错

[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.4.2:generate (default-cli) on project spring-boot-web: The server time zone value '?й???????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specific time zone value if you want to utilize time zone support. -> [Help 1]

 

在connectionURL添加时区配置

connectionURL="jdbc:mysql://127.0.0.1:3306/goods-dev?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8"

注意

  1. 重新运行插件xml里面的内容会加倍。
  2. 在配置文件中加了覆盖配置<overwrite>true</overwrite>,如果新加表重新运行,在配置文件generatorConfig.xml中移除掉不需要更新的表,否则不需要更新的表mapper原内容会被覆盖

在配置文件中将覆盖配置设为false, 重新运行时会重新生成DAO层和mapper层的代码

 

3.如果不在context设置如何生成实体类,一个表有可能生成多个实体类

 

defaultModelType:这个属性很重要,这个属性定义了MBG如何生成实体类。

这个属性有以下可选值:

1)conditional:*这是默认值*,这个模型和下面的hierarchical类似,除了如果那个单独的类将只包含一个字段,将不会生成一个单独的类。 因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实体类中。

2)flat:该模型为每一张表只生成一个实体类。这个实体类包含表中的所有字段。**这种模型最简单,推荐使用。**

3)hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段, 则会为表生成一个包含所有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MBG会在所有生成的实体类之间维护一个继承关系。

 

参考:

https://blog.csdn.net/hancc_824/article/details/119716348

 

https://www.shuzhiduo.com/A/kPzOYn8x5x/

 

https://blog.csdn.net/lovoo/article/details/78359107

 

posted @ 2023-03-12 16:42  梦可园  阅读(471)  评论(0)    收藏  举报