Mybatis-Generator

西伯利亞愛學習的狼發表於2020-06-29

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 MBG逆向生成java檔案。

2.1.1 配置檔案

MybatisGenerator支援以下幾種方式來做MBG:

我選用java(maven)這兩種比較常用。
1.第一步建立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">

<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屬性的指定很關鍵,官方支援四種屬性:

也就是告訴生成器採用哪種模式生成我們的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.(一般就這麼指定就行了其他子屬性可以不寫)
當然你還可以指定是否開啟具體的查詢,插入規則:

官方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。都報錯找不到指定檔案。

之後看生成的目錄檔案:

這樣就自動根據資料庫中的資訊逆向生成我們的dao,pojo,mapper層。

PS:之前用Hiberante的時候也用到過逆向,不過Hiberante的逆向是從java程式碼來逆向到資料庫。封裝的太狠,靈活性太低。