一步一步学SpringBoot(二)---SpringBoot使用MybatisGenerator插件生成代码

本文详述了MyBatis代码生成器的配置流程,包括依赖添加、pom.xml配置、generatorConfig.xml详解,以及如何运行插件生成代码。涵盖了实体类、mapper文件、DAO类的自动生成,适用于快速搭建基于MyBatis的项目。

在pom.xml增加以下依赖

<!-- 以下这些可以新建项目的时候依赖,没有引入版本号是因为parent节点可以控制版本 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 以上这些可以新建项目的时候依赖 -->

<!-- Mybatis 代码生成 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>

<!-- 接下来引入生成代码插件 -->
<build>
    <!-- plugins 存放插件依赖 -->
    <plugins>
       <!-- 下面这个插件是用来运行SpringBoot的,有两种方式运行SpringBoot,一种是直接运行main方法,一种就是通过插件来运行
            一旦需要访问资源的时候就要使用插件来运行,否则无法访问到资源 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <!-- 使用Mybatis generator生成entity类、mapper文件以及dao类 -->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.5</version>
            <executions>
               <execution>
                    <id>Generate Mybatis Artifacts</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <!-- generator 配置文件的位置 -->
                <configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

在pom中需要修改的只是generator配置文件的位置

配置application.properties

# JDBC配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF8&useSSL=false
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver

修改为你的数据库及用户名和密码
注意:暂时生成插件不支持driver为com.mysql.cj.jdbc.Driver,可以生成之后把driver再改回来

配置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">
<!--MyBatis Generator 简称MBG-->
<!-- 根节点 没有属性 有三个子元素:
-子元素 >> 1.<properties> (0个或者1个):用于指定一个需要在配置中解析使用的外部属性文件
-       2.<classPathEntry> (0个或者多个):最常见的用法是通过这个属性指定驱动的路径
-       3.<context>(1个或者多个):用于指定生成一组对象的环境。例如指定要连接的数据库,要生成对象的类型和要处理的数据库中的表。运行
-               MyBatis Generator的时候还可以指定要运行的<context>
-->
<generatorConfiguration>

    <!--properties 引入属性文件,引入后可以在配置中使用 ${property}这种形式的引用属性文件中的属性值-->
    <!--属性 >> 1.resource:用于指定classpath下的属性文件的路径,即相对路径(com.example.cxp.XXX.xxx)
    -       2.url:用于指定系统上的特定路径,即绝对路径(file:///C:/Users/CXP/XXX.xxx)
    -       如果使用了mybatis-generator-maven-plugin,那么在pom.xml中定义的properties可以直接在generatorConfig.xml中使用
    -->
    <properties resource="./application.properties"/>

    <!--指定mysql驱动-->
    <!--classPathEntry只在下面这两种情况下才有效:
    -1.当加载JDBC驱动连接数据库时
    -2.当加载根类中的JavaModelGenerator检查重写的方法时
    -如果你需要加载其他用途的jar包,classPathEntry起不到作用,不能这么写,解决的办法就是将你用的jar包添加到类路径中,在Eclipse等IDE中运行
    的时候添加jar包比较容易。当从命令行执行的时候,需要用java -cp xx.jar,xx2.jar xxxMainClass这种方式,在-cp后面指定来使用(注意-jar会
    导致-cp无效)
    -->
    <!--属性 >> location:指明加载jar/zip包的全路径-->
    <classPathEntry location="C:\Program Files\MySQL\mysql-connector-java-5.1.46-bin.jar"/>
    <!--F:\Maven\repository\mysql\mysql-connector-java\8.0.15\mysql-connector-java-8.0.15.jar-->
    <!-- 必须指定一组生成对象的环境 -->
    <!--子元素 >> 1.<property> (0个或多个):用于指定许多其他元素的属性。支持property元素的每个元素的文档页面列出了有效的不同值。此元素还可
    -               用于将属性传递给您实现的任何自定义代码生成器
    -       2.<plugin> (0个或多个):用来定义一个插件。插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码,将按配置中列出
    -               的顺序调用插件。
    -       3.<commentGenerator> (0个或1个):用于定义Comment Generator的属性。Comment Generator用于为MyBatis Generator(MBG)
    -               生成的各种元素生成注释(Java字段,Java方法,XML元素等).默认的Comment Generator将JavaDoc注释添加到所有生成的Java元
    -               素,以在Eclipse插件中启用Java合并功能。 此外,还会为每个生成的XML元素添加注释。 注释的目的还在于告知用户元素是生成的
    -               并且可以再生(即:它们不应被更改),默认实现是org.mybatis.generator.internal.DefaultCommentGenerator。 如果您只
    -               想修改某些行为,则默认实现是为可扩展性而设计的。
    -       4.<connectionFactory>:用于指定连接工厂,以获取内省表所需的数据库连接。 MyBatis Generator使用JDBC的DatabaseMetaData类来
    -               发现您在配置中指定的表的属性。 每个<context>元素都需要一个<connectionFactory>或<jdbcConnection>元素。
    -       5.<jdbcConnection> (1个):用于指定内省表所需的数据库连接的属性。 MyBatis Generator使用JDBC的DatabaseMetaData类来发现您
    -               在配置中指定的表的属性。 每个<context>元素都需要一个<connectionFactory>或<jdbcConnection>元素。
    -       6.<javaTypeResolver> (0个或1个):用来指定JDBC类型和Java类型如何转换
    -       7.<javaModelGenerator> (1个):用来控制生成的实体类,根据<context>中配置的defaultModelType,一个表可能会对应生成多个不同
    -               的实体类,一个表对应多个类实际上并不方便,所以前面也推荐使用flat,这种情况下一个表对应一个实体类。
    -       8.<sqlMapGenerator> (0个或1个):用于定义SQL映射生成器的属性。SQL Map Generator为每个内省表构建一个MyBatis/iBATIS格式的
    -               SQL映射XML文件。
    -               该元素可选,最多配置一个。但是有如下两种必选的特殊情况:
    -                       1.如果targetRuntime目标是iBATIS2,该元素必须配置一个.
    -                       2.如果targetRuntime目标是MyBatis3,只有当<javaClientGenerator>需要XML时,该元素必须配置一个.
    -                       如果没有配置<javaClientGenerator>,则使用以下的规则:
    -                               如果指定了一个<sqlMapGenerator>,那么MBG将只生成XML的SQL映射文件和实体类。
    -                               如果没有指定<sqlMapGenerator>,那么MBG将只生成实体类。
    -       9.<javaClientGenerator> (0个或1个):如果不配置该元素,就不会生成Mapper接口
    -       10.<table> (1个或多个):
    -       注意:子元素需要按照此顺序来配置,否则<context>会提示顺序错误
    -->
    <!--必选属性 >> id:用来唯一确定一个<context>元素
    -可选属性 >> targetRuntime:此属性用于指定生成的代码的运行时环境
    -               可选值 >> MyBatis3(默认值):使用该值,MBG将生成与MyBatis 3.0及更高版本以及JSE 5.0及更高版本兼容的对象(例如,Java
    -                               模型和映射器接口将使用泛型类型)。 这些生成的对象中的“by example”方法支持几乎所有的动态where子句。
    -                               此外,使用这些生成器生成的Java对象支持许多JSE 5.0功能,包括参数化类型和注释。
    -                       MyBatis3Simple:使用该值,MBG将生成与MyBatis 3.0及更高版本以及JSE 5.0及更高版本兼容的对象(例如,Java模
    -                               型和映射器接口将使用泛型类型)。 使用此目标运行时生成的映射器是非常基本的CRUD操作,只是没有
    -                               “by example”方法和非常少的动态SQL。 使用这些生成器生成的Java对象支持许多JSE 5.0功能,包括参数化
    -                               类型和注释
    -                       MyBatis3DynamicSql:使用该值,MBG将生成与MyBatis版本3.4.2及更高版本以及Java 8及更高版本兼容的对象
    -                               (例如,Java模型和映射器接口将使用泛型类型和其他Java 8功能,如接口中的默认方法)
    -                               要点:使用此目标运行时生成的Java代码依赖于“MyBatis Dynamic SQL”支持库。
    -                               其他重要信息:
    -                               无论为“defaultModelType”指定什么,模型对象都以“FLAT”样式生成。 这也意味着没有“with BLOBs”和
    -                               “without BLOBs”方法。
    -                               无论为<javaClientGenerator>的“type”指定什么,映射器都作为带注释的映射器生成。不会生成XML。
    -                               <sqlMapGenerator>不是必需的,如果指定将被忽略。MyBatis Dynamic SQL以“per query”的方式支持
    -                               表别名,而不是其他运行时的“all or nothing”方式。 因此,将忽略已配置的表别名。
    -                       Ibatis2Java2:使用此值,MBG将生成与iBATIS版本2.2.0及更高版本(但不是iBATIS 3)以及所有级别的Java 2兼容
    -                               的对象。这些生成对象中的“by example”方法支持几乎所有的动态where子句。 使用这组生成器生成的对象与
    -                               使用原始版本的Abator或其他一组代码生成器生成的对象不是100%兼容
    -                       Ibatis2Java5:使用该值,MBG将生成与iBATIS版本2.2.0及更高版本(但不是iBATIS 3)兼容的对象,以及JSE 5.0及
    -                               更高版本(例如,Java模型和DAO类将使用泛型类型)。 这些生成的对象中的“by example”方法支持几乎所有
    -                               的动态where子句。 此外,使用这些生成器生成的Java对象支持许多JSE 5.0功能,包括参数化类型和注释。使
    -                               用这组生成器生成的对象与使用原始版本的Abator或其他一组代码生成器生成的对象不是100%兼容。
    -       defaultModelType:这个属性定义了MyBatis Generator如何生成实体类
    -               可选值 >> conditional(默认值):这个模型和下面的hierarchical类似,除了如果那个单独的类只包含一个字段,将不会生成一个
    -                               单独的类。因此,如果一个表的主键只有一个字段,那么不会为该字段生成单独的实体类,会将该字段合并到基本实
    -                               体类中
    -                       flat:该模型为每一张表只生成一个实体类,这个实体类包含表中的所有字段,这种模型最简单,推荐使用
    -                       hierarchical:如果表有主键,那么该模型会产生一个单独的主键实体类,如果表还有BLOB字段,则会为表生成一个包含所
    -                               有BLOB字段的单独的实体类,然后为所有其他的字段生成一个单独的实体类。 MyBatis Generator会在所有生
    -                               成的实体类之间维护一个继承关系
    -       introspectedColumnImpl:该参数可以指定扩展org.mybatis.generator.api.IntrospectedColumn该类的实现类。
    -                               如果要在计算列信息时更改代码生成器的行为,则使用此方法。即该属性的作用为扩展MyBatis Generator
    -->
    <context id="default" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 分隔符 -->
        <!--在讲解<property>属性前,我们先看看什么是分隔符,这里通过一个例子说明。
        -假设在Mysql数据库中有一个表名为user info,你没有看错,中间是一个空格,这种情况下如果写出
        -select * from user info这样的语句,肯定是要报错的,在Mysql中的时候我们一般会写成如下的样子:
        -select * from `user info`
        -这里的使用的反单引号(`)就是分隔符,分隔符可以用于表名或者列名。
        -->
        <!--属性 >> name:属性的名称(区分大小写)
        -               可选值 >> autoDelimitKeywords:当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段
        -                               名添加分隔符
        -                       beginningDelimiter:默认值为双引号("),在Mysql中不能这么写,所以要将这个默认值改为反单引号(`)
        -                       endingDelimiter:默认值为双引号("),在Mysql中不能这么写,所以要将这个默认值改为反单引号(`)
        -                       javaFileEncoding:设置要使用的Java文件的编码,默认使用当前平台的编码
        -                       javaFormatter:属性可能会很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定
        -                               该属性和xmlFormatter的值来实现。
        -                       xmlFormatter:属性可能会很有用,如果你想使用模板来定制生成的java文件和xml文件的样式,你可以通过指定
        -                               该属性和JavaFormatter的值来实现。
        -       value:属性的值(通常不区分大小写)
        -->
        <property name="autoDelimitKeywords" value="true"/><!--自动分隔关键词-->
        <property name="beginningDelimiter" value="`"/><!--开始分隔符-->
        <property name="endingDelimiter" value="`"/><!--结尾分隔符-->

        <!--用来定义一个插件,插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码,将按配置中列出的顺序调用插件-->
        <!--属性 >> type:实现插件的类的完全限定名称。该类必须实现接口org.mybatis.generator.api.Plugin,并且必须具有公共默认构造函数,
        -               请注意,扩展适配器类org.mybatis.generator.api.PluginAdapter比实现整个接口要容易得多。
        -->
        <!-- 生成的entity将implements Serializable-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!--注释规则-->
        <!--可选属性 >> type:可以指定用户的实现类,该类需要实现org.mybatis.generator.api.CommentGenerator接口。而且必有一个默认的构
        -               造方法。这个属性默认的特殊值DEFAULT,会使用默认的实现类
        -               org.mybatis.generator.internal.DefaultCommentGenerator,
        -               默认的实现类中提供了两个可选属性,需要通过<property>属性进行配置
        -                       suppressAllComments:阻止生成注释,默认为false
        -                       suppressDate:阻止生成的注释包含时间戳,默认为false
        -               一般情况下由于MBG生成的注释信息没有任何价值,而且有时间戳的情况下每次生成的注释都不一样,使用版本控制的时候每次都会
        -               提交,因而一般情况下我们都会屏蔽注释信息
        -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!--true为取消所有注释 false为生成所有注释-->
            <property name="suppressDate" value="true"/><!--true为生成的注释不包含时间戳 false为生成的注释包含时间戳-->
        </commentGenerator>

        <!--指定连接工厂,用于获取数据库的连接,每个<context>元素都需要一个<connectionFactory>或<jdbcConnection>元素,这里使用
        -<jdbcConnection>-->
        <!--<connectionFactory>
            <property name="driverClass" value="org.hsqldb.jdbcDriver"/>
            <property name="connectionURL" value="jdbc:hsqldb:mem:aname"/>
            <property name="userId" value="XX"/>
            <property name="password" value="XX"/>
        </connectionFactory>-->

        <!--jdbc数据库连接-->
        <!--可以在 <jdbcConnection> 指定<property>子元素用于配置数据库连接-->
        <!--jdbc数据库连接
        -属性 >> driverClass:访问数据库的JDBC驱动程序的完全限定类名
        -       connectionURL:访问数据库的JDBC连接URL
        -       userId:数据库用户账号
        -       password:数据库密码
        -->
        <jdbcConnection driverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">

        </jdbcConnection>

        <!--用来指定JDBC类型和Java类型如何转换-->
        <!--子元素 >> <property>:可以配置的name属性的值为forceBigDecimals,该值可以控制是否强制DECIMAL和NUMERIC类型的字段转换为
        -               Java类型的java.math.BigDecimal,默认值为false,一般不需要配置
        -               注意一点,默认会先尝试使用Integer,Long,Short等来对应DECIMAL和NUMERIC数据类型
        -               默认情况下的转换规则为:
        -                       如果精度>0或者长度>18,就会使用java.math.BigDecimal
        -                       如果精度=0并且10<=长度<=18,就会使用java.lang.Long
        -                       如果精度=0并且5<=长度<=9,就会使用java.lang.Integer
        -                       如果精度=0并且长度<5,就会使用java.lang.Short
        -                       如果设置为true,那么一定会使用java.math.BigDecimal
        -->
        <!--可选属性 >> type:和<commentGenerator>比较类型,提供了默认的实现DEFAULT,一般情况下使用默认即可,需要特殊处理的情况可以通过
        -               其他元素配置来解决,不建议修改该属性
        -->
        <!--<javaTypeResolver>
            <property name="forceBigDecimals" value="false" />  value=“true”,那么一定会使用java.math.BigDecimal
        </javaTypeResolver>-->

        <!--控制生成的实体类(entity类)-->
        <!-- 指定生成的entity类的位置 -->
        <!--子元素 >> <property>:name属性值可以为constructorBased:该属性只对MyBatis3有效,如果true就会使用构造方法入参,如果false就
        -                       会使用setter方式。默认为false
        -               enableSubPackages:如果true,MBG会根据catalog和schema来生成子包。如果false就会直接用targetPackage属性。
        -                       默认为false
        -               immutable:该属性用来配置实体类属性是否可变,如果设置为true,那么constructorBased不管设置成什么,都会使用构造
        -                       方法入参,并且不会生成setter方法。如果为false,实体类属性就可以改变。默认为false
        -               rootClass:设置所有实体类的基类。如果设置,需要使用类的全限定名称。并且如果MBG能够加载rootClass,那么MBG不会覆
        -                       盖和父类中完全匹配的属性。匹配规则:
        -                               属性名完全相同、属性类型相同、属性有getter方法、属性有setter方法
        -               trimStrings:是否对数据库查询结果进行trim操作,如果设置为true就会生成类似这样
        -                       public void setUsername(String username) {
        -                           this.username = username == null ? null : username.trim();
        -                           }
        -                           的setter方法。默认值为false
        -->
        <!--必选属性 >> targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响
        -       targetProject:指定目标项目路径,可以是绝对路径或相对路径
        -->
        <javaModelGenerator targetPackage="com.test.springbm.entity" targetProject="src/main/java">
            <!--<property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="false" />-->
        </javaModelGenerator>

        <!--用于定义SQL映射生成器的属性-->
        <!--指定生成的mapperXML的位置-->
        <!--子元素 >> <property>:name属性只有一种值enableSubPackages,如果value为true,MBG会根据catalog和schema来生成子包。
        -               如果false就会直接用targetPackage属性。默认为false
        -->
        <!--必选属性 >> targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响
        -       targetProject:指定目标项目路径,可以是绝对路径或相对路径
        -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--如果不配置该元素,就不会生成Mapper接口-->
        <!--指定生成的Mapper类的位置-->
        <!--子元素 >> <property>:name属性值可为enableSubPackages:此属性用于选择MBG是否将根据内省表的目录和架构为对象生成不同的
        -               Java packages。例如,假设schema MYSCHMA中的表为MYTABLE。 还假设targetPackage属性设置为“com.mycompany”.
        -               如果此属性为true,则生成的DAO接口和表的类将放在包“com.mycompany.myschema”中。如果属性为false,则生成的
        -               SQL Map将放在“com.mycompany”架构中。默认值为false。
        -       exampleMethodVisibility:此属性用于设置不同“ByExample”方法的可见性 -selectByExample,deleteByExample等。如果未指
        -               定,则方法将是公共的,并将在界面中声明。 如果您只想使用它们来实现其他专用方法,则此属性允许您隐藏这些方法。
        -               public:这是默认值,实现类中生成的方法将是public,并且将在接口中声明方法。
        -               private:实现类中生成的方法将是私有的,并且不会在接口中声明方法
        -               protected:实现类中生成的方法将受到保护,并且不会在接口中声明方法
        -               default:实现类中生成的方法将具有默认(包)可见性,并且不会在接口中声明方法
        -               重要说明:如果目标运行时为MyBatis3,则忽略此属性。
        -       methodNameCalculator:此属性用于选择calculator method。calculator method可用于为DAO方法提供不同的名称。 您可以选择
        -               其中一个预定义值,如果所提供的选项都不适合您的环境也可以是指定实现
        -               org.mybatis.generator.api.DAOMethodNameCalculator接口的类的完全限定名称。
        -               default:这是默认值,生成的方法名称将非常简单(“insert”,“updateByPrimaryKey”等)
        -               extended:生成的方法名称将包含与方法关联的域对象的名称(“insertWidget”,“updateWidgetByPrimaryKey”等)
        -               重要说明:如果目标运行时为MyBatis3,则忽略此属性。
        -       rootInterface:用于指定一个所有生成的接口都继承的父接口。 这个值可以通过<table>配置的rootInterface属性覆盖
        -               要点:MBG不验证接口是否存在,或者是否是有效的Java接口。如果指定,则此属性的值应为完全限定的接口名称
        -                       (如com.mycompany.MyRootInterface)
        -       useLegacyBuilder:如果为true,则带注释的clients将使用MyBatis中的SqlBuilder生成动态SQL。 使用MyBatis 3.2及更高版本
        -               时,不推荐使用该构建器以支持新的SQL类。 如果为false,MBG将生成使用新SQL构建器的clients。默认值为false。
        -->
        <!--必选属性 >> type:该属性用于选择一个预定义的客户端代码(可以理解为Mapper接口)生成器,用户可以自定义实现,需要继承
        -               org.mybatis.generator.codegen.AbstractJavaClientGenerator类,必选有一个默认的构造方法。 该属性提供了以下
        -               预定的代码生成器,首先根据<context>的targetRuntime分成三类:
        -                       MyBatis3:
        -                               ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
        -                               MIXEDMAPPER:XML和注解的混合形式,(上面这种情况中的)SqlProvider注解方法会被XML替代。
        -                               XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
        -                       MyBatis3Simple:
        -                               ANNOTATEDMAPPER:基于注解的Mapper接口,不会有对应的XML映射文件
        -                               XMLMAPPER:所有的方法都在XML中,接口调用依赖XML文件。
        -                       Ibatis2Java2或Ibatis2Java5:
        -                               IBATIS:生成的对象符合iBATIS的DAO框架(不建议使用)。
        -                               GENERIC-CI:生成的对象将只依赖于SqlMapClient,通过构造方法注入。
        -                               GENERIC-SI:生成的对象将只依赖于SqlMapClient,通过setter方法注入。
        -                               SPRING:生成的对象符合Spring的DAO接口
        -       targetPackage:生成实体类存放的包名,一般就是放在该包下。实际还会受到其他配置的影响
        -       targetProject:指定目标项目路径,可以是绝对路径或相对路径
        -->
        <!--可选属性 >> implementationPackage:如果指定了该属性,实现类就会生成在这个包中-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.test.springbm.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--用来配置要通过内省的表。只有配置的才会生成实体类和其他文件-->
        <!--子元素 >> <property>:name属性可为constructorBased:和<javaModelGenerator>中的属性含义一样。
        -               ignoreQualifiersAtRuntime:生成的SQL中的表名将不会包含schema和catalog前缀。
        -               immutable:和<javaModelGenerator>中的属性含义一样。
        -               modelOnly:此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了<sqlMapGenerator>,
        -                       并且modelOnly为true,那么XML映射文件中只有实体对象的映射元素(<resultMap>)。如果为true还会覆盖属性中
        -                       的enableXXX方法,将不会生成任何CRUD方法。
        -               rootClass:和<javaModelGenerator>中的属性含义一样。
        -               rootInterface:和<javaClientGenerator>中的属性含义一样。
        -               runtimeCatalog:运行时的catalog,当生成表和运行环境的表的catalog不一样的时候可以使用该属性进行配置。
        -               runtimeSchema:运行时的schema,当生成表和运行环境的表的schema不一样的时候可以使用该属性进行配置。
        -               runtimeTableName:运行时的tableName,当生成表和运行环境的表的tableName不一样的时候可以使用该属性进行配置。
        -               selectAllOrderByClause:该属性值会追加到selectAll方法后的SQL中,会直接跟order by拼接后添加到SQL末尾。
        -               useActualColumnNames:如果设置为true,那么MBG会使用从数据库元数据获取的列名作为生成的实体对象的属性。 如果为
        -                       false(默认值),MGB将会尝试将返回的名称转换为驼峰形式。 在这两种情况下,可以通过元素显示指定,在这种情
        -                       况下将会忽略这个(useActualColumnNames)属性。
        -               useColumnIndexes:如果是true,MBG生成resultMaps的时候会使用列的索引,而不是结果中列名的顺序。
        -               useCompoundPropertyNames:如果是true,那么MBG生成属性名的时候会将列名和列备注接起来. 这对于那些通过第四代语言
        -                       自动生成列(例如:FLD22237),但是备注包含有用信息(例如:"customer id")的数据库来说很有用. 在这种情况下,
        -                       MBG会生成属性名FLD2237_CustomerId。
        -       除了<property>子元素外,<table>还包含以下子元素:
        -       <generatedKey> (0个或1个):用来指定自动生成主键的属性(identity字段或者sequences序列)。如果指定这个元素,MBG在生成
        -               insert的SQL映射文件中插入一个<selectKey>元素。 这个元素非常重要,这个元素包含下面两个必选属性:
        -                       必选属性 >> column:生成列的列名。
        -                       sqlStatement:将返回新值的 SQL 语句。如果这是一个identity列,您可以使用其中一个预定义的的特殊值。
        -                           预定义值如下:
        -                               Cloudscape:相当于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
        -                               DB
        -                               DB2_MF:相当于selectKey的SQL为:SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1
        -                               Derby:相当于selectKey的SQL为:VALUES IDENTITY_VAL_LOCAL()
        -                               HSQLDB:相当于selectKey的SQL为:CALL IDENTITY()
        -                               Informix:相当于selectKey的SQL为:select dbinfo('sqlca.sqlerrd1') from systables
        -                                       where tabid=1
        -                               MySql:相当于selectKey的SQL为:SELECT LAST_INSERT_ID()
        -                               SqlServer:相当于selectKey的SQL为:SELECT SCOPE_IDENTITY()
        -                               SYBASE:相当于selectKey的SQL为:SELECT @@IDENTITY
        -                               JDBC:这会配置MBG使用MyBatis3支持的JDBC标准的生成key来生成代码。 这是一个独立于数据库获取标
        -                                       识列中的值的方法。 重要: 只有当目标运行为MyBatis3时才会产生正确的代码。 如果与
        -                                       iBATIS2一起使用目标运行时会产生运行时错误的代码
        -                       可选属性 >> identity:当设置为true时,该列会被标记为identity列, 并且<selectKey>元素会被插入在
        -                               insert后面。 当设置为false时,<selectKey>会插入到insert之前(通常是序列)。
        -                               重要: 即使您type属性指定为post,您仍然需要为identity列将该参数设置为true。 这将标志MBG从插
        -                               入列表中删除该列。默认值是false。
        -                       type:type=post and identity=true的时候生成的<selectKey>中的order=AFTER,当type=pre的时候,
        -                               identity只能为false,生成的<selectKey>中的order=BEFORE。可以这么理解,自动增长的列只有插
        -                               入到数据库后才能得到ID,所以是AFTER,使用序列时,只有先获取序列之后,才能插入数据库,
        -                               所以是BEFORE
        -       <columnRenamingRule> (0个或1个):使用该元素可以在生成列之前,对列进行重命名。这对那些存在同一前缀的字段想在生成属性名时去
        -               除前缀的表非常有用
        -               注意,在内部,MBG使用java.util.regex.Matcher.replaceAll方法实现这个功能。请参阅有关该方法的文档和在Java中使
        -                       用正则表达式的例子。
        -               当<columnOverride>匹配一列时,这个元素(<columnRenamingRule>)会被忽略。<columnOverride>优先于重命名的规则。
        -                       必选属性 >> searchString:定义将被替换的字符串的正则表达式
        -                       可选属性 >> replaceString:这是一个用来替换搜索字符串列每一个匹配项的字符串。如果没有指定,就会使用空字
        -                               符串
        -       <columnOverride> (0个或多个):将某些属性默认计算的值更改为指定的值
        -                       必选属性 >> column:要重写的列名
        -                       可选属性 >> property:要使用的Java属性的名称。如果没有指定,MBG会根据列名生成。 例如,如果一个表的一列
        -                               名为STRT_DTE,MBG会根据<table>的useActualColumnNames属性生成STRT_DTE或strtDte。
        -                       javaType:该列属性值为完全限定的Java类型。如果需要,这可以覆盖由JavaTypeResolver计算出的类型。 对某些
        -                               数据库来说,这是必要的用来处理**“奇怪的”**数据库类型(例如MySql的unsigned bigint类型需要映射
        -                               为java.lang.Object)。
        -                       jdbcType:该列的JDBC类型(INTEGER, DECIMAL, NUMERIC, VARCHAR等等)。 如果需要,这可以覆盖由
        -                               JavaTypeResolver计算出的类型。 对某些数据库来说,这是必要的用来处理怪异的JDBC驱动 (例如DB2
        -                               的LONGVARCHAR类型需要为iBATIS 映射为VARCHAR)。
        -                       typeHandler:用户定义的需要用来处理这列的类型处理器。它必须是一个继承iBATIS的TypeHandler类或
        -                               TypeHandlerCallback接口(该接口很容易继承)的全限定的类名。如果没有指定或者是空白,iBATIS会
        -                               用默认的类型处理器来处理类型。**重要**:MBG不会校验这个类型处理器是否存在或者可用。 MGB只是简单
        -                               的将这个值插入到生成的SQL映射的配置文件中。
        -                       delimitedColumnName:指定是否应在生成的SQL的列名称上增加**分隔符**。 如果列的名称中包含空格,MGB会自
        -                               动添加**分隔符**, 所以这个重写只有当列名需要强制为一个合适的名字或者列名是数据库中的保留字时是
        -                               必要的
        -       <ignoreColumn> (0个或多个):该元素可以用来屏蔽不需要生成的列
        -                       必选属性 >> column:要忽略的列名
        -                       可选属性 >> delimitedColumnName:匹配列名的时候是否区分大小写。如果为true则区分。默认值为false,不区
        -                               分大小写
        -->
        <!--必选属性 >> tableName:指定要生成的表名,可以使用SQL通配符匹配多个表
        -               例如要生成全部的表,可以按如下配置:<table tableName="%" />
        -->
        <!--可选属性 >> schema:数据库的schema,可以使用SQL通配符匹配。如果设置了该值,生成SQL的表名会变成如schema.tableName的形式。
        -       catalog:数据库的catalog,如果设置了该值,生成SQL的表名会变成如catalog.tableName的形式。
        -       alias:如果指定,这个值会用在生成的select查询SQL的表的别名和列名上。 列名会被别名为
        -               alias_actualColumnName(别名_实际列名) 这种模式。
        -       domainObjectName:生成对象的基本名称。如果没有指定,MBG会自动根据表名来生成名称。
        -       enableXXX:XXX代表多种SQL方法,该属性用来指定是否生成对应的XXX语句。
        -       selectByPrimaryKeyQueryId:DBA跟踪工具会用到,具体请看详细文档。
        -       selectByExampleQueryId:DBA跟踪工具会用到,具体请看详细文档。
        -       modelType:和<context>的defaultModelType含义一样,这里可以针对表进行配置,这里的配置会覆盖<context>的
        -               defaultModelType配置。
        -       escapeWildcards:这个属性表示当查询列,是否对schema和表名中的SQL通配符 ('_' and '%') 进行转义。 对于某些驱动当schema
        -               或表名中包含SQL通配符时(例如,一个表名是MY_TABLE,有一些驱动需要将下划线进行转义)是必须的。默认值是false。
        -       delimitIdentifiers:是否给标识符增加**分隔符**。默认false。当catalog,schema或tableName中包含空白时,默认为true。
        -       delimitAllColumns:是否对所有列添加**分隔符**。默认false
        -->
        <table tableName="user" enableCountByExample="false" enableInsert="true" enableDeleteByExample="false"
                enableDeleteByPrimaryKey="true" enableUpdateByPrimaryKey="true" enableUpdateByExample="false"
                enableSelectByPrimaryKey="true" enableSelectByExample="false">
                <!--默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema-->
                <property name="ignoreQualifiersAtRuntime" value="false"/>

                <!--此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了<sqlMapGenerator>,并且modelOnly
                -为true,那么XML映射文件中只有实体对象的映射元素(<resultMap>)。如果为true还会覆盖属性中的enableXXX方法,将不会生成任何
                -CRUD方法
                -->
                <property name="modelOnly" value="false"/>

                <!--设置为true,会直接以字段名生成属性名,不再采取驼峰命名法
                -设置为false,则会将字段名以驼峰命名法的形式返回,默认为false
                -->
                <property name="useActualColumnNames" value="false"/>
        </table>
    </context>
</generatorConfiguration>

<!--针对MyBatis3的一些意见:
-       1.关于实体类的modelType,建议使用defaultModelType="flat",只有一个对象的情况下管理毕竟方便,使用也简单。
-       2.关于注释<commentGenerator>,不管你是否要重写自己的注释生成器,有一点不能忘记,那就是注释中一定要保留@mbggenerated,MBG通过该字
-               符串来判断代码是否为代码生成器生成的代码,有该标记的的代码在重新生成的时候会被删除,不会重复。不会在XML中出现重复元素。
-       3.使用MBG生成的代码时,建议尽可能不要去修改自动生成的代码,而且要生成带有@mbggenerated,这样才不会在每次重新生成代码的时候需要手动
-               修改好多内容。
-       4.仍然是注释相关,在<commentGenerator>中,建议一定要保留suppressAllComments属性(使用默认值false),一定要取消(设为true)时间戳
-               suppressDate,避免重复提交SVN。
-       5.<jdbcConnection>建议将JDBC驱动放到项目的**classpath**下,而不是使用<classPathEntry>来引入jar包,主要考虑到所有开发人员的统
-               一性。
-       6.当数据库字段使用CHAR时,建议在<javaModelGenerator>中设置<property name="trimStrings" value="true" />,可以自动去掉不必
-               要的空格。
-       7.在<javaClientGenerator>中,建议设置type="XMLMAPPER",不建议使用注解或混合模式,比较代码和SQL完全分离易于维护。
-       8.建议尽可能在<table>中配置<generatedKey>,避免手工操作,以便于MBG重复执行代码生成。
-->

去掉大部分详细的注释,只留下简短的注释

<?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 Generator 简称MBG-->
<!-- 根节点 没有属性 有三个子元素 -->
<generatorConfiguration>

    <!--properties 引入属性文件,引入后可以在配置中使用 ${property}这种形式的引用属性文件中的属性值-->
    <properties resource="./application.properties"/>

    <!--指定mysql驱动-->
    <classPathEntry location="C:\Program Files\MySQL\mysql-connector-java-5.1.46-bin.jar"/>

    <!-- 必须指定一组生成对象的环境 -->
    <context id="default" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 分隔符 -->
        <property name="autoDelimitKeywords" value="true"/><!--自动分隔关键词-->
        <property name="beginningDelimiter" value="`"/><!--开始分隔符-->
        <property name="endingDelimiter" value="`"/><!--结尾分隔符-->

        <!--用来定义一个插件,插件用于扩展或修改通过MyBatis Generator (MBG)代码生成器生成的代码,将按配置中列出的顺序调用插件-->
        <!-- 生成的entity将implements Serializable-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <!--注释规则-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/><!--true为取消所有注释 false为生成所有注释-->
            <property name="suppressDate" value="true"/><!--true为生成的注释不包含时间戳 false为生成的注释包含时间戳-->
        </commentGenerator>

        <!--指定连接工厂,用于获取数据库的连接,每个<context>元素都需要一个<connectionFactory>或<jdbcConnection>元素,这里使用
        -<jdbcConnection>-->
        <!--<connectionFactory>
            <property name="driverClass" value="org.hsqldb.jdbcDriver"/>
            <property name="connectionURL" value="jdbc:hsqldb:mem:aname"/>
            <property name="userId" value="XX"/>
            <property name="password" value="XX"/>
        </connectionFactory>-->

        <!--jdbc数据库连接-->
        <!--可以在 <jdbcConnection> 指定<property>子元素用于配置数据库连接-->
        <!--jdbc数据库连接-->
        <jdbcConnection driverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">

        </jdbcConnection>

        <!--用来指定JDBC类型和Java类型如何转换-->
        <!--<javaTypeResolver>
            <property name="forceBigDecimals" value="false" />  value=“true”,那么一定会使用java.math.BigDecimal
        </javaTypeResolver>-->

        <!--控制生成的实体类(entity类)-->
        <!-- 指定生成的entity类的位置 -->
        <javaModelGenerator targetPackage="com.test.springbm.entity" targetProject="src/main/java">
            <!--<property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="false" />-->
        </javaModelGenerator>

        <!--用于定义SQL映射生成器的属性-->
        <!--指定生成的mapperXML的位置-->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--如果不配置该元素,就不会生成Mapper接口-->
        <!--指定生成的Mapper类的位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.test.springbm.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--用来配置要通过内省的表。只有配置的才会生成实体类和其他文件-->
        <table tableName="user" enableCountByExample="false" enableInsert="true" enableDeleteByExample="false"
               enableDeleteByPrimaryKey="true" enableUpdateByPrimaryKey="true" enableUpdateByExample="false"
               enableSelectByPrimaryKey="true" enableSelectByExample="false">

            <!--默认为false,如果设置为true,在生成的SQL中,table名字不会加上catalog或schema-->
            <property name="ignoreQualifiersAtRuntime" value="false"/>

            <!--此属性用于配置是否为表只生成实体类。如果设置为true就不会有Mapper接口。如果配置了<sqlMapGenerator>,并且modelOnly
            -为true,那么XML映射文件中只有实体对象的映射元素(<resultMap>)。如果为true还会覆盖属性中的enableXXX方法,将不会生成任何
            -CRUD方法
            -->
            <property name="modelOnly" value="false"/>

            <!--设置为true,会直接以字段名生成属性名,不再采取驼峰命名法
            -设置为false,则会将字段名以驼峰命名法的形式返回,默认为false
            -->
            <property name="useActualColumnNames" value="false"/>
        </table>
    </context>
</generatorConfiguration>

以上是generatorConfig.xml所有属性或元素详解,项目中可以使用下面这个注释少的。
复制到你的项目中需要修改以下属性:
1、属性文件的位置
<properties resource="./application.properties"/>

2、Mysql驱动的位置
<classPathEntry location="C:\Program Files\MySQL\mysql-connector-java-5.1.46-bin.jar"/>
注意:刚开始我使用的是mysql-connector-java-8.0.15-bin.jar,生成失败,换回来5.1.46版本就可以生成成功,可能不支持太高版本的数据库连接驱动,我一直使用的是5.1.46版本,如果支持6.X或7.X的版本请call me

3、指定生成的实体类的位置
<javaModelGenerator targetPackage="com.test.springbm.entity" targetProject="src/main/java"></javaModelGenerator>

4、 指定生成的mapperXML的位置

<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
       <property name="enableSubPackages" value="false"/>
</sqlMapGenerator>

5、指定生成的Mapper类的位置

<javaClientGenerator type="XMLMAPPER" targetPackage="com.test.springbm.mapper" targetProject="src/main/java">
        <property name="enableSubPackages" value="false"/>
</javaClientGenerator>

6、指定需要生成的表

<table tableName="user"> </table>
使用文件的配置,只需要改tableName=""

到此配置就结束了

运行插件生成代码

在idea右侧有个maven栏,点击打开
在这里插入图片描述
找到插件,双击mybatis-generator:generator运行插件
在这里插入图片描述

提示

生成的XXXMapper.xml可能会提示No data sources are configured to run this SQL and provide advanced code ass警告是说 SQL方言没有配置
只需关联数据库就可以了
在这里插入图片描述
在这里插入图片描述
点击Apply,XXXMapper.xml中的警告则会消失

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值