[springboot 開發單體web shop] 2. Mybatis Generator 生成common mapper

Mybatis Generator tool

在咱們開啓一個新項目的研發後,一般要編寫不少的entity/pojo/dto/mapper/dao..., 大多研發兄弟們都會抱怨,爲何我要重複寫CRUD? 咱們爲了不編寫一些沒必要要的重複代碼,這節給你們介紹介紹使用一個開源工具,來幫助咱們從這種簡單枯燥的編碼中解救出來。隆重有請: MyBatis通用Mapper4html

通用Mapper均可以極大的方便開發人員。能夠隨意的按照本身的須要選擇通用方法,還能夠很方便的開發本身的通用方法。
極其方便的使用MyBatis單表的增刪改查。
支持單表操做,不支持通用的多表聯合查詢。
通用 Mapper 支持 Mybatis-3.2.4 及以上版本。
Tips:
各位技術同仁必定要有版本意識哦~
Let's code!java

Create mybatis-generator-tool Module

參考上一節中的Module建立mybatis-generator-tool.mysql

  • 添加依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>expensive-shop</artifactId>
        <groupId>com.life-runner</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mybatis-generator-tool</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <!--springboot 構建可執行fat jars必須的插件,如不添加,在生產環境會有問題-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <!-- 設置配置文件路徑 -->
                    <configurationFile>
                        ${basedir}/src/main/resources/generator/generatorConfig.xml
                    </configurationFile>
                    <!--容許覆蓋-->
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- mysql8 驅動-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>8.0.16</version>
                    </dependency>
                    <!--通用 Mapper-->
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>4.1.5</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>複製代碼

  • 編寫配置文件
    根據咱們在pom文件中指定的路徑:${basedir}/src/main/resources/generator/generatorConfig.xml, 咱們須要在項目src=>main=>resource目錄下建立generator文件夾,在文件夾下建立文件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="generator/config.properties"/>

  <context id="MysqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
    <!--配置是否使用通用 Mapper 自帶的註釋擴展,默認 true-->
    <!--<property name="useMapperCommentGenerator" value="false"/>-->

    <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
      <!--設置Mapper生成的basic,可自定義-->
      <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
      <!--大小寫轉換敏感-->
      <property name="caseSensitive" value="true"/>
      <!--引入lombok註解-->
      <property name="lombok" value="Getter,Setter,ToString"/>
      <!--分隔符定義-->
      <property name="beginningDelimiter" value="`"/>
      <property name="endingDelimiter" value="`"/>
    </plugin>

    <!-- 設置數據庫配置 -->
    <jdbcConnection driverClass="${jdbc.driverClass}"
      connectionURL="${jdbc.url}"
      userId="${jdbc.user}"
      password="${jdbc.password}">
    </jdbcConnection>

    <!-- 對應生成的pojo所在包 -->
    <javaModelGenerator targetPackage="com.liferunner.pojo" targetProject="src/main/java"/>

    <!-- 對應生成的mapper所在目錄 -->
    <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>

    <!-- 配置mapper對應的java映射 -->
    <javaClientGenerator targetPackage="com.liferunner.mapper" targetProject="src/main/java" type="XMLMAPPER"/>

    <!-- 數據庫表 -->
    <table tableName="carousel"></table>
    <table tableName="category"></table>
    <table tableName="items"></table>
    <table tableName="items_comments"></table>
    <table tableName="items_img"></table>
    <table tableName="items_param"></table>
    <table tableName="items_spec"></table>
    <table tableName="order_items"></table>
    <table tableName="order_status"></table>
    <table tableName="orders"></table>
    <table tableName="shop_users"></table>
    <table tableName="user_address"></table>
    <table tableName="users"></table>
  </context>
</generatorConfiguration>複製代碼

咱們能夠看到一行配置內容: ,這裏是爲了將咱們的數據庫鏈接、帳號等信息外置,配置內容以下:git

jdbc.driverClass = com.mysql.cj.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/expensiveshop?characterEncoding=UTF-8&useSSL\
  =false&useUnicode=true&serverTimezone=UTC
jdbc.user = root
jdbc.password = 12345678複製代碼

能夠看到這裏設置的內容就是下屬代碼中用到的。github

...
   <jdbcConnection driverClass="${jdbc.driverClass}"
      connectionURL="${jdbc.url}"
      userId="${jdbc.user}"
      password="${jdbc.password}">
    </jdbcConnection>
...複製代碼

配置信息你們能夠參考:傳送門spring

  • 使用maven測試生成
    執行如下命令:
mybatis-generator-tool>mvn mybatis-generator:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.life-runner:mybatis-generator-tool >---------------
[INFO] Building mybatis-generator-tool 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- mybatis-generator-maven-plugin:1.3.6:generate (default-cli) @ mybatis-generator-tool ---
[INFO] Connecting to the Database
[INFO] Introspecting table carousel
[INFO] Introspecting table category
...
[INFO] Generating Record class for table carousel
[INFO] Generating Mapper Interface for table carousel
[INFO] Generating SQL Map for table carousel
...
[INFO] Saving file CarouselMapper.xml
...
[INFO] Saving file Carousel.java
[INFO] Saving file Users.java
...
[WARNING] Table configuration with catalog null, schema null, and table shop_users did not resolve to any tables
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.374 s
[INFO] Finished at: 2019-11-05T15:40:07+08:00
[INFO] ------------------------------------------------------------------------
複製代碼

能夠看到執行成功,雖然這裏執行成功,可是當咱們打開文件的時候會發現:sql

package com.liferunner.pojo;

import java.util.Date;
import javax.persistence.*;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@Table(name = "Carousel")
public class Carousel {
    /**
     * ����id �û�id
     */
    @Id
    private String id;

    /**
     * �û��� �û���
     */
    private String imageUrl;
    ...
}複製代碼

這裏出現了亂碼問題,這又是怎麼回事呢?不要緊,let's bing... 傳送門,能夠看到有265000條結果,那就說明咱們的問題已經有太多的人遇到了,隨便點開一個:bug1能夠看到紅框裏面的內容咱們缺失了,在expensive-shopmybatis-generator-toolsrcmainresourcesgeneratorgeneratorConfig.xml中添加上 ,從新執行生成命令,能夠看到咱們的亂碼就沒有了。數據庫

@Getter
@Setter
@ToString
@Table(name = "`carousel`")
public class Carousel {
    /**
     * 主鍵
     */
    @Id
    @Column(name = "`id`")
    private String id;

    /**
     * 圖片 圖片地址
     */
    @Column(name = "`image_url`")
    private String imageUrl;
    ...複製代碼

Tips:apache

在這一環節先劇透一個bug,不然我擔憂在後續你們遇到的時候,由於它確實是和Common Mapper生成相關的。segmentfault

咱們點開生成的Users.java,能夠看到以下所示:

@Getter
@Setter
@ToString
@Table(name = "users")
public class Users {
    @Column(name = "USER")
    private String user;

    @Column(name = "CURRENT_CONNECTIONS")
    private Long currentConnections;

    @Column(name = "TOTAL_CONNECTIONS")
    private Long totalConnections;
}複製代碼

但是咱們的Users表不是這樣的呀,這是怎麼回事???讓咱們分析分析:1.既然沒有用到咱們本身的Users表,可是又確實經過生成器生成了,那麼很明顯確定是Mysql數據庫中表,這是確定的。2.那麼問題就來了,它從哪裏冒出來的?找它,盤它。3.究竟是哪一個數據庫中的呢?sys?informationschema?performanceschema?4.挨個查詢,果真:bug2能夠看到,在performance_schema數據庫中有一個users表,那麼究竟是不是咱們生成出來的呢?執行SHOW CREATE TABLE users, 結果如上圖,字段和生成出來的是一致的!5.抓住它了,怎麼盤它???

很簡單,修改jdbc:mysql://localhost:3306/expensiveshop?nullCatalogMeansCurrent=true&characterEncoding=UTF-8&useSSL
=false&useUnicode=true&serverTimezone=UTC,新增上加粗部分就能夠了。

nullCatalogMeansCurrent 字面意思很簡單,就是說若是是null catalog,我就選擇current.由於mysql不支持catalog,咱們須要告知mybatis這個特性,設置爲true就好了。

按照SQL標準的解釋,在SQL環境下Catalog和Schema都屬於抽象概念,主要用來解決命名衝突問題。
從概念上說,一個數據庫系統包含多個Catalog,每一個Catalog又包含多個Schema,而每一個Schema又包含多個數據庫對象(表、視圖、序列等),反過來說一個數據庫對象必然屬於一個Schema,而該Schema又必然屬於一個Catalog,這樣咱們就能夠獲得該數據庫對象的徹底限定名稱從而解決命名衝突的問題了
從實現的角度來看,各類數據庫系統對Catalog和Schema的支持和實現方式千差萬別,針對具體問題須要參考具體的產品說明書,比較簡單而經常使用的實現方式是使用數據庫名做爲Catalog名,Oracle使用用戶名做爲Schema名.

bug2-1

可查閱Mysql官網說明:傳送門

本節咱們講解了如何生成咱們想要的,簡單和重要又重複的工做咱們能夠經過工具實現啦,下一次咱們將開始實際業務的編碼實現.

gogogo.

奔跑的人生 | 博客園 | segmentfault | spring4all | csdn | 掘金 | OSChina | 簡書 | 頭條 | 知乎 | 51CTO

相關文章
相關標籤/搜索