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.xmljdbc.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类对象是在逆向工程执行后自动产生的(也可以自己配置不产生),它内部已经帮我们封装好了很多常用的高级查询方法,例如inis nulllike等关键字的使用。我们可以使用Example对象的createCriteria方法创建后,将条件封装到criteria对象中。

说在最后

在上面的说明使用中我们可以知道,MyBatis Generator的使用确确实实提高了我们的开发效率,尤其是在表很多的时候,更是能够很好的提高我们的开发效率,可以说得上是一款很实用的工具。
其实MyBatis Generator本质上就是MyBatis的拓展插件,要想实现数据库操作还需要再单独引入MyBatis的依赖,它能够方便我们简化一些模板文件的创建,但它的局限性也比较明显,当项目有多个模块时,我们就需要在不同的模块下去单独使用插件。同时,对于表字段经常变动的模块,频繁地执行代码生成工具可能会破坏掉原有的代码结构。这就引出了后来使用更为简便,功能更为强大的MyBatis-Plus的产生...

本篇文章的代码,可以在我的码云上面下载:本文章源码下载

参考文章:
MyBatis代码生成器(逆向工程)MBG使用:
https://blog.csdn.net/zl1zl2zl3/article/details/84939335

posted @ 2021-04-07 11:04  moutory  阅读(6)  评论(0编辑  收藏  举报  来源