likes
comments
collection
share

SpringBoot 项目集成 MyBatis 框架的方法

作者站长头像
站长
· 阅读数 7

1. 添加依赖

首先在 SpringBoot 项目的 pom.xml 文件中添加 MyBatis 依赖,我使用的 SpringBoot 版本是 2.5.3,这里我引入最新的 MyBatis 版本:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

然后再在 pom.xml 的build标签中添加资源配置,因为 MyBatis 一般会使用 xml 文件写 SQL,并且我习惯将 xml 文件放在/src/main/java/**/mapper/xml包下,所以这里需要该配置,否则编译或打包的时候 IDEA 不会将该目录下的 xml 文件一起打包的。

<resources>
    <!-- src/main/java下的xml资源编译到classes下 -->
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.xml</include>
        </includes>
    </resource>
    <!-- src/main/resources下的资源编译到classes下 -->
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.*</include>
        </includes>
    </resource>
</resources>

注意:这里未正确配置可能会引起异常org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

2. 配置文件

下面写几条我认为要用到的配置。以下配置均配置在application.properties中。

2.1. 配置 xml 文件地址

当 xml 文件和 mapper 接口不在同一个包下的时候必须配置这个,我的项目一般 mapper 接口在src/main/java/**/mapper包下,而 xml 文件我习惯放在该包下的 xml 包中,也就是src/main/java/**/mapper/xml包下。当 xml 文件和 mapper 接口在同一个包下的时候这个配置可以省略。

mybatis.mapper-locations=classpath:**/mapper/xml/*.xml

注意:这里未正确配置也可能会引起异常org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

2.2. 配置实体包地址

指定 model 包地址,mybatis 的 xml 中的 resultType 等返回类型就可直接写为该类的首字母小写的简写形式,该项配置非必须,我们可以直接写完整类名,便于跳转和识别。比如:

<select id="listOutputTasks" resultType="com.gtcom.web.entity.OutputTask">
    SELECT * FROM output_task
</select>
mybatis.type-aliases-package=com.gtcom.web.entity

2.3. 配置下划线自动映射驼峰

将带有下划线的表字段映射为驼峰格式的实体类属性,因为数据库表字段一般都是以下划线分割的,而 Java 类字段命名都是驼峰命名的。要让 MyBatis 实现自动映射,就要启用该配置项。

mybatis.configuration.map-underscore-to-camel-case=true

2.4. 配置日志级别

mybatis 日志设置,我们可以在开发阶段将 mapper 接口所在的包的日志格式调整为 trace 级别,这样能完整输出 SQL 的执行过程日志,便于调试。其中com.gtcom.web.mapper是我的 mapper 接口和 xml 文件所在的包。

logging.level.com.gtcom.web.mapper=trace

从下面的日志可以看出,SQL 语句和参数以及结果总数的日志级别是 DEBUG,返回结果明细的日志级别是 TRACE,所以我们可以在开发或测试环境指定对应包的日志级别为 TRACE,而生产环境可以指定为 DEBUG 或者 INFO,减少日志输出。

2021-08-21 17:58:44.827 DEBUG 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : ==>  Preparing: SELECT * FROM output_task 
2021-08-21 17:58:44.857 DEBUG 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : ==> Parameters: 
2021-08-21 17:58:44.884 TRACE 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : <==    Columns: id, create_time, update_time
2021-08-21 17:58:44.886 TRACE 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : <==        Row: 1, 2021-08-15 10:10:07, 2021-08-18 10:11:28
2021-08-21 17:58:44.892 TRACE 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : <==        Row: 2, 2021-01-01 13:04:04, 2021-08-21 17:08:54
2021-08-21 17:58:44.893 DEBUG 14848 --- [nio-8080-exec-1] c.g.w.m.O.listOutputTasks                : <==      Total: 2

3. 代码编写

OutputTaskMapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gtcom.web.mapper.OutputTaskMapper">

    <select id="listOutputTasks" resultType="com.gtcom.web.entity.OutputTask">
        SELECT * FROM data_center.output_task
    </select>

</mapper>

OutputTaskMapper.java

package com.gtcom.web.mapper;

import com.gtcom.web.entity.OutputTask;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author wangbo
 * @date 2021/8/20
 */
@Mapper
public interface OutputTaskMapper {

    /**
     * 查询输出任务列表
     *
     * @return List<OutputTask>
     */
    List<OutputTask> listOutputTasks();

}