Mybatis Generator tool
在我们开启一个新项目的研发后,通常要编写很多的entity/pojo/dto/mapper/dao...
, 大多研发兄弟们都会抱怨,为什么我要重复写CRUD
? 我们为了避免编写一些不必要的重复代码,这节给大家介绍介绍使用一个开源工具,来帮助我们从这种简单枯燥的编码中解救出来。
隆重有请: MyBatis通用Mapper4
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条结果,那就说明我们的问题已经有太多的人遇到了,随便点开一个:
可以看到红框里面的内容我们缺失了,在\expensive-shop\mybatis-generator-tool\src\main\resources\generator\generatorConfig.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;
...
我们点开生成的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.挨个查询,果然:
可以看到,在performance_schema
数据库中有一个users
表,那么到底是不是我们生成出来的呢?执行SHOW CREATE TABLE users
, 结果如上图,字段和生成出来的是一致的!
5.抓住它了,怎么盘它???
nullCatalogMeansCurrent
字面意思很简单,就是说如果是null catalog,我就选择current.因为mysql不支持catalog
,我们需要告知mybatis
这个特性,设置为true
就行了。
可查阅Mysql官网说明:传送门
本节我们讲解了如何生成我们想要的,简单和重要又重复的工作我们可以通过工具实现啦,下一次我们将开始实际业务的编码实现.
gogogo.