[springboot 开发单体web shop] 2. Mybatis Generator 生成common mapper

  • 2019 年 11 月 6 日
  • 筆記

Mybatis Generator tool


在我们开启一个新项目的研发后,通常要编写很多的entity/pojo/dto/mapper/dao..., 大多研发兄弟们都会抱怨,为什么我要重复写CRUD? 我们为了避免编写一些不必要的重复代码,这节给大家介绍介绍使用一个开源工具,来帮助我们从这种简单枯燥的编码中解救出来。
隆重有请: MyBatis通用Mapper4

通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。
极其方便的使用MyBatis单表的增删改查。
支持单表操作,不支持通用的多表联合查询。
通用 Mapper 支持 Mybatis-3.2.4 及以上版本。
Tips:
各位技术同仁一定要有版本意识哦~
Let’s code!

Create mybatis-generator-tool Module

参考上一节中的Module创建mybatis-generator-tool.


  • 添加依赖
<?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>

我们可以看到一行配置内容:<properties resource="generator/config.properties"/>,这里是为了将我们的数据库连接、账号等信息外置,配置内容如下:

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

可以看到这里设置的内容就是下属代码中用到的。

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

配置信息大家可以参考:传送门


  • 使用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] ------------------------------------------------------------------------  

可以看到执行成功,虽然这里执行成功,但是当我们打开文件的时候会发现:

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中添加上 <property name="javaFileEncoding" value="UTF-8"/>,重新执行生成命令,可以看到我们的乱码就没有了。

@Getter  @Setter  @ToString  @Table(name = "`carousel`")  public class Carousel {      /**       * 主键       */      @Id      @Column(name = "`id`")      private String id;        /**       * 图片 图片地址       */      @Column(name = "`image_url`")      private String imageUrl;      ...

Tips:
在这一环节先剧透一个bug,否则我担心在后续大家遇到的时候,因为它确实是和Common Mapper生成相关的。

我们点开生成的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?information_schema?performance_schema?
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.