使用MyBatis自动生成和更新Mapper

本文主要介绍MyBatis在Spring Boot中项目中的配置,以及自动生成和更新Mapper的操作流程。使用MyBatis可以很方便的创建Java中间件中数据持久层的基本数据操作逻辑。为我们节省了大量时间,避免了手动编写数据库增删改查的基础操作和数据映射代码。下面我们将从创建新表开始演示如何使用MyBatis自动生成和更新Mapper。

在Spring Boot中使用MyBatis

本文将使用Spring Boot创建和开发,并且在项目中使用MyBatis依赖,从而自动创建持久层中的相关代码。在本文中,我们将使用spring-boot 2.3、mysql 8.0、mybatis 3。具体的依赖包版本和插件版本将在以下代码中给出明确的说明。

J2EE开发工具和环境

这里就省略了一步一步创建Java项目的过程,开发工具可以使用IntelliJ Idea,或者Eclipse,或者VS Code。在开始动手创建项目之前,请确保Java环境,Maven工具等都已经安装和配置完毕。创建一个Java项目比较简单。最重要的是,在创建完毕Java项目以后(注意在创建项目过程中,请选择Spring Boot项目,或者Maven项目),会有一个Maven的POM文件。该文件包含了Spring Boot和MyBatis的必要依赖。样例代码可以参考项目springboot-mybatis-mysql-demo

如果需要单独强调的话,可能就是mybatis-spring-boot-starter依赖和mysql-connector-java依赖。另外,在POM文件的build设置区,需要包含mybatis-generator-maven-plugin的配置。这些配置都在springboot-mybatis-mysql-demo项目中给出对应的样例。

MyBatis配置说明

MyBatis的配置信息网上有很多样例。这里就提几个基本的点。首先一个是classPathEntry的配置,这个要看当前系统中jar包的路径。大多情况下,每个人的驱动路径是不一样的,这个设置必须是jar的路径,而不是jar所在的文件夹。

第二点就是context标签中targetRuntime指定MyBatis要创建Mapper的运行环境。从MyBatis 3.0以后对于注解的支持,可以不需要在创建XML或者SqlProvider类。因此,当前本文推荐使用MyBatis3DynamicSql这个设置(默认)。特别需要注意的是,当targetRuntime设置为MyBatis3DynamicSql时,sqlMapGenerator这个标签就被忽略了,因为不会生成任何XML Mapping文件。另外,javaClientGenerator的type类型也会被忽略。统一生成带注释的映射器。详情,参考:

context标签官方说明
sqlMapGenerator标签官方说明
javaClientGenerator标签官方说明

第三点就是使用table标签指定要自动生成Mapper和帮助类的表。例如项目中有10个表,第一次执行所有的表。项目中期有新表加入,可以注释掉其它的表而只选择创建新增表的Mapper和帮助类。

自动生成Mapper和帮助类

配置好以上信息后,我么可以通过以下命令启动MyBatis。默认情况下,Maven是不会自动执行mybatis-generator的。如果需要Moven在编译项目过程中执行mybatis生成工具的话,可以配置pom文件中plugin的goal选项,具体可以参考以下

mvn mybatis-generator:generate

以下是参考文档:使用Maven启动Mybatis Generator

更多MyBatis的讨论

以下是在创建本文过程中碰到的一些问题,以及最后的解决方案和选择该方案的原因。

使用XML,Provider,或是注解

从MyBatis 3开始可以使用注解编写SQL查询条件了(网上有大量MyBatis的教程是XML,或者使用Provider工具类)。本文将使用注解,这样的话少写一半数量的xml文件(主要还是懒)。另外还需说明,注解已经成为MyBatis 3的默认配置。如果不明确说明使用XML的话,MyBatis将默认生成使用注解的Mapper和对应的帮助类(Support Classes)。

在创建本文之前看到这篇文章,SpringBoot 快速整合Mybatis(去XML化+注解进阶)。一开始觉得有所帮助。当要完结本文的时候,发现上文中高级注解已经不适用最新的MyBatis注解用法了。因为最新的MyBatis不再创建Provider工具类。MyBatis的官方文档提供了一个不错的使用样例供参考:MyBatis Dynamic SQL用法以及MyBatis Dynamic Select编写教程

手动更新Mapper文件

由于具体业务需求,会遇到Mybatis创建的增删改查方法不够用的情况。我们时常不得不自定义一些新的增删改查的方法。这时非常不建议大家在自动创建的Mapper类文件上直接修改,建议创建一个custom文件夹,并且基于Mapper都创建一个Customer的类。最后将应用类的MapperScan设置为custom文件夹。这样可以保证自定义的内容不会被自动覆盖。

MyBatis动态查询语句编写

MyBatis之前使用XML配置查询语句非常灵活,但是总感觉又是写Java编码,又是写XML编写,其实统一性非常低。从MyBatis 3开始支持动态查询语句以后,在Mapper里编写查询语句非常灵活,而且统一性非常好。

使用标注编写查询语句

MyBatis的标注类都在org.apache.ibatis.annotations包中。使用annotations写查询语句非常直观,几乎和编写原生mysql查询语句一样简单灵活。

使用DSLCompleter编写查询语句

SelectDSLCompleter,DeleteDSLCompleter,UpdateDSLCompleter等
返回的都是DSL语句

使用SqlBuilder编写查询语句

org.mybatis.dynamic.sql.SqlBuilder
StatementProvider

Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。