MyBatis系列(七)——逆向工程
前言
在前面的MyBatis系列文章中,我们已经知道了MyBatis作为持久层框架的基本使用方式了,在本篇文章中将简单对MyBatis的逆向工程(MyBatis Generator)和MyBatisPlus的使用进行介绍,同时也将这两者进行对比。这两个工具能够帮助我们简化和提高开发的效率和步骤,后者更是当前很多项目采用的MyBaits-Plus来作为持久层框架的增强。也希望本篇文章能够给各位读者一个参考。
想要了解更多MyBaits系列文章,可以从下面的传送门阅读:
MyBatis系列(一)——MyBatis的介绍和CRUD
MyBatis系列(二)——MyBatis的动态代理和映射文件动态配置
MyBatis系列(三)——MyBatis的类型处理器和PageHelper分页插件
MyBatis系列(四 )——MyBatis的多表操作
MyBatis系列(五)——Spring整合MyBatis
MyBatis系列(六)——MyBatis的注解开发
说在前面
讲本篇文章之前,我们还是先来说说文章的背景。我们在之前的学习中已经使用过很多次原生MyBatis
的API去进行DAO层的操作,虽然相比于原始的JDBC而言MyBatis已经简化了很多操作,但是还是不够简便,我们每次新建一张表后都需要创建实体类和接口,围绕新的实体类编写相关的CRUD代码在mapper映射文件中,这其实也是比较繁琐和重复性的工作,当刚刚创建的项目表很多的时候,持久化层的繁琐代码开发可能会让人大感头痛。这就引出了MyBatis Generator
(MBG)逆向工程和MyBatis-Plus
的出现。
其中,MBG
应该是2010年就出现了,是MyBatis开发团队自己开发且提供的一个很强大的代码生成器,应用的时间比较早,但现在还在使用的项目不多了。MyBatisPlus
最早是2016年出现的,自2017年到2020年已经连续四年取得OSC 年度最受欢迎中国开源软件,当前也成为很多个人和团队使用的持久层工具的方案选择。
一、MyBatis Generator
(一)MyBatis Generator的基本使用
MyBatis Generator的使用比较简单,这里的话我们将使用ssm架构的maven项目进行演示
常见的方式主要有使用Java编写运行代码、从命令提示符运行、使用Maven Plugin运行、使用Eclipse插件运行等四种方式,这里的话我们演示maven插件的方式生成代码。
步骤一:搭建SSM框架
这一步不进行演示,可以参考系列文章:MyBatis系列(五)——Spring整合MyBatis
步骤二:在pom.xml
文件中导入插件依赖
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<!-- 多了这个-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
<configuration>
<configurationFile>${basedir}/src/main/resources/mybatis-generator/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
</build>
我们可以看到,插件依赖了数据库的驱动,同时配置了generatorConfig.xml
配置文件的存放路径
步骤三:编写generatorConfig.xml
和jdbc.properties
配置文件内容
关于这两个配置文件的名称是可以自己任意取的
<?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="mybatis-generator/jdbc.properties"/>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接参数 -->
<jdbcConnection
driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}"
userId="${jdbc.username}"
password="${jdbc.password}">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 实体类的包名和存放路径 -->
<javaModelGenerator targetPackage="com.qiqv.pojo" targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 清理数据库返回的值前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件*.xml的位置-->
<sqlMapGenerator targetPackage="com/qiqv/mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.qiqv.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- tableName:数据库中的表名或视图名;domainObjectName:生成的实体类的类名-->
<table tableName="orders"/>
</context>
</generatorConfiguration>
这个generatorConfig.xml
配置文件主要是配置代码的生成策略、结果文件的生成路径和jdbc数据源的。我们需要注意的是要设置好mapper接口、pojo类和mapper映射文件的生成路径。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
这是jdbc.properties
数据源配置文件的内容,没啥好说的...
步骤四:运行插件
在我们配置好依赖后,我们可以在IDEA右侧的Maven
菜单栏中看到对应的执行命令后鼠标左键双击
步骤五:查看运行结果
我们可以看到,在插件运行之后对应的文件已经生成出来了,我们可以在配置文件中批量写入表名,这样就可以大大提高我们的开发效率!
(二)基本的CRUD操作
在上一小节中,我们已经使用插件实现了代码生成,同时也搭建好了SSM框架,现在我们就来创建一个测试用例做一下简单的CRUD操作吧。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MyBatisGeneratorTest {
@Autowired
private OrdersMapper ordersMapper;
@Test
public void insertOrdersTest() throws Exception{
Orders orders = new Orders(null,new Date(System.currentTimeMillis()),100.0,1);
int result = ordersMapper.insert(orders);
System.out.println("插入是否成功:" + (result>0?"成功":"失败"));
}
@Test
public void deleteOrdersTest() throws Exception{
int result = ordersMapper.deleteByPrimaryKey(5);
System.out.println("删除是否成功:" + (result>0?"成功":"失败"));
}
@Test
public void updateOrdersTest() throws Exception{
Orders orders = new Orders(5,new Date(System.currentTimeMillis()),200.0,1);
int result = ordersMapper.updateByPrimaryKeySelective(orders);
System.out.println("更新是否成功:" + (result>0?"成功":"失败"));
}
@Test
public void selectAllOrdersTest() throws Exception{
Orders result = ordersMapper.selectByPrimaryKey(5);
System.out.println(result);
}
}
这里需要注意两点,第一点,当前的项目架构是SSM,所以要想使用@Autowired
注解注入bean的话,需要我们去自己配置好运行环境,使用@RunWith
,@ContextConfiguration
两种注解加载applicationContext.xml
配置文件。其次,我们可以看到基本的CRUD操作其实很简单,和使用以前的MyBatis
的API没啥两样,只是说我们不需要再手动写映射文件、mapper接口和pojo类而已。
但实际上,逆向工程的作用还远不止如此,MyBatis Generator
提供了Example
类让我们使用,我们可以利用它来进行一些高级的查询,而不再需要手动写一些动态sql。
(三)Example类的使用
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class MyBatisGeneratorTest {
@Autowired
private OrdersMapper ordersMapper;
@Test
public void selectOrderByExample(){
OrdersExample ordersExample = new OrdersExample();
OrdersExample.Criteria criteria = ordersExample.createCriteria();
criteria.andTotalGreaterThan(100.1);
List<Orders> orders = ordersMapper.selectByExample(ordersExample);
orders.forEach(System.out::println);
}
@Test
public void selectOrderByExample2(){
OrdersExample ordersExample = new OrdersExample();
OrdersExample.Criteria criteria = ordersExample.createCriteria();
criteria.andUidNotIn(Arrays.asList(2,3));
List<Orders> orders = ordersMapper.selectByExample(ordersExample);
orders.forEach(System.out::println);
}
}
Example
类对象是在逆向工程执行后自动产生的(也可以自己配置不产生),它内部已经帮我们封装好了很多常用的高级查询方法,例如in
,is null
,like
等关键字的使用。我们可以使用Example
对象的createCriteria
方法创建后,将条件封装到criteria
对象中。
说在最后
在上面的说明使用中我们可以知道,MyBatis Generator的使用确确实实提高了我们的开发效率,尤其是在表很多的时候,更是能够很好的提高我们的开发效率,可以说得上是一款很实用的工具。
其实MyBatis Generator
本质上就是MyBatis的拓展插件,要想实现数据库操作还需要再单独引入MyBatis
的依赖,它能够方便我们简化一些模板文件的创建,但它的局限性也比较明显,当项目有多个模块时,我们就需要在不同的模块下去单独使用插件。同时,对于表字段经常变动的模块,频繁地执行代码生成工具可能会破坏掉原有的代码结构。这就引出了后来使用更为简便,功能更为强大的MyBatis-Plus
的产生...
本篇文章的代码,可以在我的码云上面下载:本文章源码下载
参考文章:
MyBatis代码生成器(逆向工程)MBG使用:
https://blog.csdn.net/zl1zl2zl3/article/details/84939335