MyBatis是一款优秀的开源持久层框架,支持自定义SQL查询、存储过程和高级映射。
在MyBatis中,我们可以在XML中编写SQL语句,然后绑定到Java方法中,通过参数和结果集的自动映射来实现复杂的查询逻辑。MyBatis消除了几乎所有JDBC操作和手动绑定参数操作,使用起来非常方便!
在SpringBoot中集成MyBatis
- 在
pom.xml
中添加MyBatis提供的Spring Boot Starter;
1 | <dependency> |
- 在
application.yml
中配置好编写SQL实现的xml
文件路径,这里我们存放在resources/dao
目录下;
1 | mybatis: |
- 添加Java配置,通过
@MapperScan
配置好Dao接口路径,这样就可以开始使用了。
1 |
|
基本使用
基本使用我已经很熟悉,不多赘述。
这里单独强调一点:如果数据库中表单的命名规则和Java中实体类的命名规则有差异,需要对其名称进行映射,否则可能导致某个字段的数据无法正确注入。
比如,对于一些数据库表中以下划线分割的返回字段无法自动映射,可以通过对字段取别名的方式来进行映射;
1 | <select id="selectById" resultType="com.macro.mall.tiny.model.UmsAdmin"> |
或者也可以通过在application.yml
中开启全局下划线自动转驼峰功能来解决。
1 | mybatis: |
动态SQL
通过MyBatis的动态SQL功能,比如条件筛选搜索功能。我们可以灵活地在xml中实现各种复杂的操作,动态SQL功能需要依赖MyBatis的各种标签。
if
if
标签可以实现判断逻辑,这里我们以根据用户名和Email模糊查询用户
为例,来聊聊它的使用;
1 | <select id="selectByUsernameAndEmailLike" resultType="com.macro.mall.tiny.model.UmsAdmin"> |
这里的where 1=1是为了保证SQL语句语法的正确性。
choose
choose
标签也可以实现判断逻辑,上面的例子中当我们不输入用户名和Email时,会查询出全部用户,我们如果想不查询出用户,可以使用它;
1 | <select id="selectByUsernameAndEmailLike2" resultType="com.macro.mall.tiny.model.UmsAdmin"> |
where
- 上面的例子中我们为了SQL拼接不出错,添加了
where 1=1
这样的语句,其实可以使用where
标签来实现查询条件,当标签内没有内容时会自动去除where
关键字,同时还会去除开头多余的and
关键字。
1 | <select id="selectByUsernameAndEmailLike3" resultType="com.macro.mall.tiny.model.UmsAdmin"> |
set
1 | <update id="updateByIdSelective"> |
foreach
- 通过
foreach
我们可以实现一些循环拼接SQL的逻辑,例如我们现在需要编写一个批量插入用户
的方法;
1 | <insert id="insertBatch"> |
高级映射
需要进行一对一的联表查询时,可以使用下面的方式查询。
1 | <select id="selectResourceWithCategory" resultType="com.macro.mall.tiny.domain.UmsResourceExt"> |
需要进行一对多的联表查询时,需要先在xml中配置一个ResultMap,通过collection
标签建立一对多关系;
在此之前我们在编写xml文件的时候,一般习惯于先给当前文件写一个BaseResultMap
,用于对当前表的字段和对象属性进行直接映射,例如在UmsResourceCategoryDao.xml
中这样实现;
1 |
|
1 | <resultMap id="selectCategoryWithResourceMap" type="com.macro.mall.tiny.domain.UmsResourceCategoryExt" extends="BaseResultMap"> |
然后在xml中编写具体的SQL实现,使用该ResultMap。
1 | <select id="selectCategoryWithResource" resultMap="selectCategoryWithResourceMap"> |
分页插件PageHelper
- 我们平时实现查询逻辑时,往往还会遇到分页查询的需求,直接使用开源的
PageHelper
插件即可,首先在pom.xml
中添加它的Starter;
1 | <!--MyBatis分页插件--> |
- 然后在查询方法之前使用它的
startPage
方法传入分页参数即可,分页后的得到的数据可以在PageInfo
中获取到。
1 |
|
MyBatis Generator(MBG)的用法
MyBatis Generator(简称MBG)是MyBatis官方提供的代码生成工具。可以通过数据库表直接生成实体类、单表CRUD代码、mapper.xml文件,从而减少开发者手动进行的大量重复性的编码。
基本使用
- 在
pom.xml
中添加如下依赖,主要添加了MyBatis、PageHelper、Druid、MBG和MySQL驱动等依赖;
1 | <dependencies> |
- 在
application.yml
中对数据源和MyBatis的mapper.xml
文件路径进行配置,这里做个约定,MBG生成的放在resources/com/**/mapper
目录下,自定义的放在resources/dao
目录下;
1 | # 数据源配置 |
- 添加Java配置,用于扫码Mapper接口路径,这里还有个约定,MBG生成的放在mapper包下,自定义的放在dao包下。
1 |
|
- 使用代码生成器
在使用MBG生成代码前,我们还需要对其进行一些配置,首先在generator.properties文件中配置好数据库连接信息;
1 | jdbc.driverClass=com.mysql.cj.jdbc.Driver |
然后在generatorConfig.xml
文件中对MBG进行配置,配置属性说明直接参考注释即可;
1 |
|
这里值得一提的是targetRuntime
这个属性,设置不同的属性生成的代码和生成代码的使用方式会有所不同,常用的有MyBatis3
和MyBatis3DynamicSql
两种,这里使用的是MyBatis3
;
如果你想自定义MBG生成的代码的话,可以自己写一个CommentGenerator来继承DefaultCommentGenerator
最后我们写个Generator类用于生成代码,直接运行main方法即可生成所有代码;
1 | public class Generator { |
MyBatis官方代码生成器MBG还是很强大的,可以生成一些常用的单表CRUD方法,减少了我们的工作量。但是对于子查询、多表查询和一些复杂查询支持有点偏弱,依然需要在mapper.xml
中手写SQL实现。