为什么要使用MyBatis代码生成器?

MyBatis代码生成器(MyBatis Generator)的作用就是方便我们偷懒,这样说比较贴切一些。
因为我们在使用MyBatis框架的时候,需要三个组件:

  1. 实体类
  2. Mapper接口
  3. Mapper.xml

Mybatis 怎么生成java项目_xml


在没有使用MyBatis代码生成器的时候,我们需要手动创建它们,一张表对应一个实体类、一个Mapper接口、一个Mapper.xml。

表的数量比较少的情况自己创建还可以,如果表有几十张或者上百张,我们要一个一个创建的话,很难受的。MyBatis也考虑到这点,

所以提供了代码生成器,我们只需要编写少量的配置,就能为每张表创建上面三个组件了,而且在创建的Mapper接口和Mapper.xml中,已经帮我们自动生成单表的增删改查代码了,也就是说使用MyBatis代码生成器,对于单表的增删改查我们不需要再写代码了。

我们通过下面两步来使用代码生成器:

  1. 编写代码生成器配置文件
  2. 运行代码生成器

1.编写代码生成器配置文件

我们先对代码生成器配置文件做一个详细讲解,然后再给出整个配置代码。

  1. 首先要引入配置文件的模板,之后就是在这个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">
<generatorConfiguration>
    
</generatorConfiguration>
  1. generatorConfiguration标签下只包含以下三个标签,下面一 一介绍这三个标签的作用。

properties标签

  1. properties标签用于指定一个需要在配置中解析使用的外部属性文件,引入属性文件后,可以在配置中使用${property}这种形式的引用,通过这种方式引用属性文件中的属性值。
  2. properties标签包含resource和url两个属性,只能使用其中一个属性来指定,同时出现则会报错。

    resource:指定classpath下的属性文件。
    url:指定文件系统上的特定位置。

classPathEntry标签

这个标签可以配置多个,也可以不配置,只有一个location属性。这个标签最常见的用法就是通过location属性指定数据库驱动的路径。

<classPathEntry location="E:\mysql-connector-java-5.1.29.jar"/>

context标签

这个标签至少配置一个,可以配置多个。context标签用于指定生成一组对象的环境。例如:

  1. 指定要连接的数据库
  2. 指定要处理的数据库表
  3. 生成实体类
  4. 生成Mapper接口
  5. 生成Mapper.xml

context标签属性如下:

Mybatis 怎么生成java项目_xml_02

  1. 必选属性id,id属性主要是区分多个context标签,必须唯一,id属性在运行代码生成器时使用。
  2. targetRuntime属性用于指定生成的代码的运行时环境,支持以下可选值:
MyBatis3:默认值
MyBatis3Simple:这种情况下不会输出与Example相关的方法。

接下来我们看看context包含哪些子标签,我们只介绍其中常用的子标签。

Mybatis 怎么生成java项目_代码生成器_03

commentGenerator标签

该标签用来配置如何生成注释信息,最多可以配置1个。

1. suppressAllComments:阻止生成注释。
2. suppressDate:阻止生成的注释包含时间戳。
3. addRemarkComments:注释是否添加数据库表的备注信息。

jdbcConnection标签

该标签用于指定MBG要连接的数据库信息,该标签必选,并且只能有一个。

1. driverClass:访问数据库的JDBC驱动程序的完全限定类名。
2. connectionURL:访问数据库的JDBC连接URL。
3. userId:访问数据库的用户ID。
4. password:访问数据库的密码。

javaTypeResolver

该标签的配置用来指定JDBC类型和Java类型如何转换,最多可以配置一个。

javaModelGenerator标签

该标签用来控制生成的实体类。该标签必须配置一个,并且最多配置一个。

1. targetPackage:生成实体类存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

sqlMapGenerator标签

该标签用于配置SQL映射生成器(Mapper.xml文件)的属性,该标签可选,最多配置一个。

1. targetPackage:生成SQL映射文件存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

javaClientGenerator标签

该标签用于生成Mapper接口,该标签可选,最多配置一个。

1. targetPackage:生成Mapper接口存放的包名。
2. targetProject:指定目标项目路径,可以使用相对路径或绝对路径。

table标签

该标签用于配置需要通过内省数据库的表,只有在table中配置过的表,才能经过上述其他配置生成最终的代码,该标签最少配置一个。
table标签有一个必选属性tableName,该属性指定要生成的表名,可以使用SQL通配符匹配多个表。例如要生成全部的表,可以如下配置

<table tableName="%"></table>

下面给出完整的配置文件代码

<?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">
<generatorConfiguration>
    <!--<classPathEntry location="E:\mysql-connector-java-5.1.29.jar"/>-->
    <context id="mybatis" targetRuntime="mybatis3simple" defaultModelType="flat">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mybatis"
                        userId="root"
                        password="root">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <javaModelGenerator targetPackage="test.model"
                            targetProject="src\main\java">
            <property name="enableSubPackages" value="false"/>
            <property name="trimStrings" value="false"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="text.xml"
                         targetProject="src\main\resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="test.mapper"
                             targetProject="src\main\java">
        </javaClientGenerator>
        <table tableName="%">
            <generatedKey column="id" sqlStatement="MySql"/>
        </table>
    </context>
</generatorConfiguration>

配置介绍完了,接下来我们就开始运行代码生成器,这里使用Java编写代码运行它。

2.使用Java代码运行代码生成器

我们需要在pom.xml中引入以下依赖

  1. 代码生成器核心依赖
  2. MyBatis框架依赖
  3. MySQL数据库驱动依赖
<dependencies>
    <dependency>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-core</artifactId>
        <version>1.3.7</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
</dependencies>

然后编写Java代码运行代码生成器配置文件

/**
 *  读取MBG生成代码
 */
public class MyBatisGenerator {
    public static void main(String[] args) throws Exception {
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<String>();
        //当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取我们的 MBG 配置文件
        InputStream is = MyBatisGenerator.class.getResourceAsStream("/generator/mbg-config.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建 MBG
        org.mybatis.generator.api.MyBatisGenerator myBatisGenerator = new org.mybatis.generator.api.MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for(String warning : warnings){
            System.out.println(warning);
        }
    }
}

运行之后的结果如下图,对于我们指定的表,MBG全部为我们生成对应的实体类,Mapper接口,以及Mapper.xml,超级方便。

Mybatis 怎么生成java项目_Mybatis 怎么生成java项目_04