欢迎关注笔者的微信公众号
最近公司在开发个小项目,本来是计划用Mybatis-Plus的,但是因为种种原因最终还是使用了Mybatis。
说下项目技术选型:Spring Boot + Mybatis + Spring Security
因为系统中数据库表较多,大概十几张表,一个一个手动创建*Mapper.xml
文件工程量太大,因此使用了Mybatis逆向工程。
是什么?
MyBatis Generator (MBG) 是一个Mybatis的代码生成器。他可以生成Mybatis各个版本的代码,和iBATIS 2.2.0版本以后的代码。 他可以内省数据库的表(或多个表)然后生成可以用来访问(多个)表的基础对象。 这样和数据库表进行交互时不需要创建对象和配置文件。 MBG的解决了对数据库操作有最大影响的一些简单的CRUD(插入,查询,更新,删除)操作。
简而言之,MBG就是可以帮助开发人员生成数据表对应的Mapper对象及对应的配置文件,并且生成了相关的增删改查方法。就这么简单。
怎么用?
官网介绍了五种方式,笔者这里就介绍两种:Maven插件、Java代码。其实不管哪种方式,核心都是编写生成器配置文件。
环境准备
便于演示,这里创建了一个演示数据库和几张表。
create database xxdxyxhd;
use xxdxyxhd;
# 用户表
drop table if exists tb_user;
create table tb_user
(
u_id varchar(50) primary key comment '用户id',
u_telephone char(11) not null comment '用户手机号',
u_name varchar(50) not null comment '用户姓名',
u_open_id varchar(50) not null comment '微信用户对应的openid',
u_gender tinyint not null comment '用户性别',
u_password varchar(255) comment '用户密码,冗余字段,暂时用不到',
u_register_time datetime default current_timestamp comment '注册时间',
u_parent_id varchar(50) comment '父id',
u_role varchar(50) comment '角色id',
u_area_id varchar(50) not null comment '用户所属区域id',
u_state tinyint comment '用户状态',
u_deleted tinyint comment '逻辑删除字段',
u_guest_manager varchar(50) comment '用户所属客户经理',
u_avatar text comment '用户头像',
u_son_count int comment '下级数量'
) comment '用户分类表';
# 创建区域表
drop table if exists tb_area;
create table tb_area
(
ar_id varchar(50) primary key comment '主键',
ar_name varchar(50) not null comment '区域名称',
ar_code varchar(50) comment '区域编码',
ar_state tinyint comment '区域状态',
ar_create_time datetime default current_timestamp comment '添加时间',
ar_update_time datetime default current_timestamp on update current_timestamp comment '修改时间',
ar_deleted tinyint comment '逻辑删除字段'
) comment '区域表';
# banner轮播图
drop table if exists tb_banner_image;
create table tb_banner_image
(
bi_id varchar(50) primary key comment '轮播图主键',
bi_image_address varchar(255) not null comment '轮播图地址',
bi_url_address varchar(255) not null comment '连接地址',
bi_state tinyint comment '图片状态',
bi_deleted tinyint comment '逻辑删除字段',
bi_update_time datetime default current_timestamp on update current_timestamp comment '删除时间'
) comment 'banner轮播图';
方式一:Maven插件
-
创建Maven项目
-
添加相关依赖
<dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> </dependencies>
-
添加插件依赖
<build> <plugins> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <configurationFile>src/main/resources/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <includeAllDependencies>true</includeAllDependencies> </configuration> </plugin> </plugins> </build>
-
创建生成器配置文件
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> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--数据库连接的信息:驱动类、连接地址、用户名、密码 --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/xxdxyxhd?useUnicode=true&useSSL=false&characterEncoding=utf8" userId="root" password="123456"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- targetProject:生成PO类的位置 --> <javaModelGenerator targetPackage="com.autewifi.project.xctm.domain" targetProject="/home/sairo/Project/generator/src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> <!-- 从数据库返回的值被清理前后的空格 --> <property name="trimStrings" value="true"/> </ja<table schema="xxdxyxhd" tableName="tb_user"> <domainObjectRenamingRule searchString="^Tb" replaceString=""/> <columnRenamingRule searchString="^u_" replaceString="" /> <columnOverride column="u_deleted" javaType="boolean" /> <columnOverride column="u_state" javaType="java.lang.Integer" /> </table>vaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.autewifi.project.xctm.mapper" targetProject="/home/sairo/Project/generator/src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.autewifi.project.xctm.mapper" targetProject="/home/sairo/Project/generator/src/main/java"> <!-- enableSubPackages:是否让schema作为包的后缀 --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 指定数据库表 --> <!-- 有些表的字段需要指定java类型--> <table schema="xxdxyxhd" tableName="tb_area"> <!--去掉生成的实体类的前缀名,默认生成的实体类是 TbArea.java --> <domainObjectRenamingRule searchString="^Tb" replaceString=""/> <!--去除实体类中的ar前缀--> <columnRenamingRule searchString="^ar_" replaceString="" /> <!--指定对应的java类型,默认是byte类型--> <columnOverride column="ar_deleted" javaType="boolean" /> <!--指定对应的java类型,默认是byte类型--> <columnOverride column="ar_state" javaType="java.lang.Integer" /> </table> <table schema="xxdxyxhd" tableName="tb_banner_image"> <domainObjectRenamingRule searchString="^Tb" replaceString=""/> <columnRenamingRule searchString="^bi_" replaceString="" /> <columnOverride column="bi_deleted" javaType="boolean" /> <columnOverride column="bi_state" javaType="java.lang.Integer" /> </table> <table schema="xxdxyxhd" tableName="tb_user"> <domainObjectRenamingRule searchString="^Tb" replaceString=""/> <columnRenamingRule searchString="^u_" replaceString="" /> <columnOverride column="u_deleted" javaType="boolean" /> <columnOverride column="u_state" javaType="java.lang.Integer" /> </table> </context> </generatorConfiguration>
-
运行
-
方式一: 命令行或终端中操作
mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate
-
方式二:IDE中执行maven命令
-
- 生成结果
方式二:Java代码
-
创建maven项目
同上
-
添加依赖
同上
-
创建生成器配置文件
同上
-
编写执行代码
官网已经给出了现成代码,直接调用就好。
public static void main(String[] args) throws Exception { List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("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); }
-
运行
-
结果
同上
结语
Mybatis逆向工程的使用主要就是编写相关的配置文件
- 指定数据库连接信息
- 文件生成位置
- 表到实体类的生成规则
具体的配置文件书写规则文档可以参照官方文档,这里也有一个中文翻译版。笔者也是参照官方文档学的。
其实还是建议使用Mybatis Plus,也有一个代码生成器,跟原生Mybatis逆向工程作用一样。