本文主要介绍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
扫码联系船长