1.1 简介

MyBatis Generator简介
MyBatis生成器(MBG)是MyBatis MyBatis的代码生成器。它将为MyBatis的所有版本生成代码。它将对一个数据库表(或多个表)进行内部检查,并将生成可用于访问表的工件。这减轻了设置对象和配置文件以与数据库表进行交互的麻烦。MBG试图对简单CRUD(创建,检索,更新,删除)的大部分数据库操作产生重大影响。您仍将需要手工编写SQL和对象代码以进行联接查询或存储过程。

MBG会根据其配置方式以不同的样式和不同的语言生成代码。例如,MBG可以生成Java或Kotlin代码。MBG可以生成MyBatis3兼容的XML-尽管现在认为MBG是旧版使用。生成的代码的较新样式不需要XML。

根据其配置方式,MyBatis Generator可能会生成:

与表结构匹配的Java或Kotlin类。这可能包括:

  • 匹配表主键的类(如果有主键)
  • 一个与表的非主键字段匹配的类(BLOB字段除外)
  • 一个包含表的BLOB字段的类(如果表具有BLOB字段)
  • 一个启用动态选择,更新和删除的类

2.1 使用

环境:IDEA
1.创建数据表

/*
Navicat MySQL Data Transfer

Source Server         : mysql
Source Server Version : 80020
Source Host           : localhost:3306
Source Database       : myproject

Target Server Type    : MYSQL
Target Server Version : 80020
File Encoding         : 65001

Date: 2020-06-29 13:23:18
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `id` int NOT NULL,
  `classname` varchar(255) DEFAULT NULL,
  `classimage` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES ('1', '计算机', null);
INSERT INTO `class` VALUES ('2', '软工', null);

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `uid` int DEFAULT NULL,
  `admin` int DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `phonenumber` int DEFAULT NULL,
  `classid` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `classid` (`classid`),
  CONSTRAINT `classid` FOREIGN KEY (`classid`) REFERENCES `class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '徐浩杰', '970829', '928675426', '1', '928675426@qq.com', '1838145982', '1');
INSERT INTO `user` VALUES ('2', '小明', '123456', '568985656', '2', '568985656@qq.com', '1254635895', '2');

Mybatis-Generator_xml

我以这两张表作为演示,看如何用Mybatis MBG逆向生成java文件。

2.1.1 配置文件

MybatisGenerator支持以下几种方式来做MBG:
Mybatis-Generator_java_02

我选用java(maven)这两种比较常用。
1.第一步创建generatorConfig.xml
Mybatis-Generator_xml_03

内容如下:

<?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>
    <properties resource="jdbc.properties" />
<!--    <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />-->

    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/myproject?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC&amp;allowPublicKeyRetrieval=true"
                        userId="root"
                        password="xhj970829">
        </jdbcConnection>

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

        <javaModelGenerator targetPackage="com.hifix.springbootmyfirstproject.pojo" targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="com.hifix.springbootmyfirstproject.mapper"  targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.hifix.springbootmyfirstproject.dao"  targetProject="src/main/java">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <table schema="DB2ADMIN" tableName="user" domainObjectName="User" >
            <property name="useActualColumnNames" value="true"/>
            <generatedKey column="ID" sqlStatement="DB2" identity="true" />
            <columnOverride column="DATE_FIELD" property="startDate" />
            <ignoreColumn column="FRED" />
            <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
        </table>
<table tableName="class" domainObjectName="Class"></table>
    </context>
</generatorConfiguration>

官方模板:http://mybatis.org/generator/configreference/xmlconfig.html

<context id="DB2Tables" targetRuntime="MyBatis3">

这个targetRuntime属性的指定很关键,官方支持四种属性:
Mybatis-Generator_计算机_04
也就是告诉生成器采用哪种模式生成我们的java代码。

<jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>
  • 这个标签一眼明了,配置JDBC驱动包,地址等等。
<javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
  • 这个标签作用是强制类型转换,因为mysql中有些数据类型比如date,bitint等等需要转成java 中的数据格式。
<javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
  • 指定pojo包位置。targetProject是指定项目位置。
  • enableSubPackages是否自动添加包名后缀。
  • trimStrings是否去除空格
 <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
  • 指定mapper.xml的位置
<javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>
  • 指定dao包的位置

<table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

这里给出了一个表单逆向的模板,tableName数据库中的表名,domainObjectName指定生成的pojoclassname.(一般就这么指定就行了其他子属性可以不写)
当然你还可以指定是否开启具体的查询,插入规则:
Mybatis-Generator_java_05

官方api:http://mybatis.org/generator/configreference/table.html

2.1.2 test测试生成

根据官方提供的接口代码:

 @Test
    public  void mybatisGenerator() throws Exception {

        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("C:\\Users\\Administrator\\Downloads\\spring-boot-examples-master\\springboot-myfirstproject\\src\\main\\resources\\generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

这里配置文件的位置最好用绝对路径,不然死活找不到,我也不知道为什么。。我之前直接写的generatorConfig.xml或者classpath:generatorConfig.xml。都报错找不到指定文件。

之后看生成的目录文件:
Mybatis-Generator_sql_06
这样就自动根据数据库中的信息逆向生成我们的dao,pojo,mapper层。

PS:之前用Hiberante的时候也用到过逆向,不过Hiberante的逆向是从java代码来逆向到数据库。封装的太狠,灵活性太低。