SpringBoot集合Mybatis 的方法

本文详细介绍SpringBoot结合MyBatis的三种方式:XML配置、Class配置及Starter配置,帮助开发者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始前…

上面的金句是被转载很多的一句话,Spring Boot也有自己的舞台,只是这个舞台还没有大量展开。今天接着上一篇的内容开始正式的切入到Spring Boot,按照从Spring mvc里的xml配置导入使用到class类配置,最后使用starter的方法来实战,到最后,大家就能看到是怎么过渡到的了,还能体会到最后那快速的畅快感。

实战

1、建立启动类

建包: com.hjf.boot.demo.boot_mybatis
  • 1
  • 2

首先建立StartApp启动程序类

// StartApp.class

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication //1
public class StartApp {
    public static void main(String[] args) {
        SpringApplication.run(StartApp.class,args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

说明: 
1:用这个注解,就能实现自动扫描包和自动配置默认配置的功能,它包含了@ComponentScan和@EnableAutoConfiguration这两个注解,同时这个类自身也是一个配置类@Configuration,可以直接在这个类里添加@Bean来注入java bean,第一章用的注解组合实现的和这个注解功能是一致的,这也是Spring Boot官方推荐的配置方式,是不是觉得很简单,以前需要在xml里写自动扫描的bean,现在只需要一个注解就搞定,快速、快速、快速,重要的原则说三遍,这也是Spring Boot的目标。

2、建立演示用服务类

我们使用现在基本通用的设计模式来设计类,包含controller(我更喜欢叫api),dao,domain,service,每一个都只有一个类。

模型类:domain—>TestPOJO.class

public class TestPOJO {
    private Long id;
    private String name;
    private int age;

   //省略 get、set
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

服务类:service—>TestServices.class

import com.hjf.boot.demo.boot_mybatis.dao.TestDao;
import com.hjf.boot.demo.boot_mybatis.domain.TestPOJO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestServices { //1

    @Autowired
    private TestDao testDao; 


    public String show(){
        return "hello world!";
    }

    public List<TestPOJO> showDao(int age){
        return testDao.get(age);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

说明: 
1:这里提供两个方法,一个只是简单返回字符串,另个从mysql数据库里去取出数据显示。

接口控制器类:api—>TestController.class

import com.hjf.boot.demo.boot_mybatis.services.TestServices;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController //1
public class TestController {

    @Autowired
    private TestServices testServices; //2

    @RequestMapping(value = "/show")  //3
    public String show(){
        return testServices.show();
    }

    @RequestMapping(value = "/showDao")  //4
    public Object showDao(int age){
        return testServices.showDao(age);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

说明: 
1:使用这个方法代表rest风格的控制器,这个是Spring MVC的特性。主要是方便不写@ResponseBody; 
2:注入服务方法; 
3:调用普通服务接口方法; 
4:调用查询数据库接口方法。

文件结构配置完后,接下来我们开始配置链接数据库的dao接口和配置,这里就会有三种方法:

三板斧

方法1:引用xml配置

在Spring Boot里其实是不推荐使用导入xml配置的,但不是说就不能导入xml,只能用starter,之前也看过有关的集成的文章,都是一笔带过,我还是那个感触,不能一篇文章就成功过的,反正我自己折腾了很久才成功。

第1步:添加pom依赖。这需要添加mybatis相关的驱动依赖和jdbc连接池的依赖。

第2步:建立文件applicationContext.xml。我们要在resources下新建applicationContext.xml并将上一章同名xml文件里的datasource和mybatis的配置放入这里(我们不用profile配置,直接使用datasource简单一点):

applicationContext.xml

<!-- 数据源配置, 使用Tomcat JDBC连接池 -->
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- Connection Pooling Info -->
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="50" />
        <property name="minIdle" value="0" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

    <!-- MyBatis配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
        <property name="typeAliasesPackage" value="com.hjf.boot.api.domain" />
        <!-- 显式指定Mapper文件位置 -->
        <property name="mapperLocations" value="classpath:/mybatis/*Mapper.xml" />
    </bean>
    <!-- 扫描basePackage下所有以@MyBatisRepository标识的 接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hjf.boot.demo.boot_mybatis.domain" />
        <property name="annotationClass" value="com.hjf.boot.demo.boot_mybatis.dao.Mapper"/>
    </bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

使用同样注入自定义@Mapper的方式来发现接口,并且使用xml的真实Mapper来执行sql,这里没有写propertites的读取,是因为Spring Boot会默认自动读取application.properties里的内容。

第3步:建立application.properties,并写入如下属性内容。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username=test
jdbc.password=123456
jdbc.pool.minIdle=0
jdbc.pool.maxIdle=10
jdbc.pool.maxActive=50
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第4步:在dao文件夹下新建dao接口和@Mapper注解类。

TestDao.class

import com.hjf.boot.demo.boot_mybatis.domain.TestPOJO;

import java.util.List;

@Mapper
public interface TestDao {

    //根据age查找info
    List<TestPOJO> get(int age);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Mapper.class

import org.springframework.stereotype.Component;
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Component
public @interface Mapper {
    String value() default "";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

TestDaoMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace必须指向Dao接口 -->
<mapper namespace="com.hjf.boot.demo.boot_mybatis.dao.TestDao">

    <!-- 所有列 -->
    <sql id="Column_list">
        id,
        name,
        age
    </sql>

    <resultMap id="ListTest" type="TestPOJO" >
        <id  column="id" property="id" />
        <result column="name" property="name" />
        <result column="age" property="age" />
    </resultMap>

    <!-- 根据ID查询数据 -->
    <select id="get" parameterType="int" resultMap="ListTest">
        SELECT
        <include refid="Column_list" />
        FROM info
        WHERE age = #{age}
    </select>

</mapper>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

到此类已经建立完毕了,启动,然后报错!为什么呢?通过idea的上下文关联图可以看得比较明白:

这里写图片描述

这个图是生成的,其实用boot,可以不用在项目工程里加载spring的上下文的,这里是为了方便说明,我手动建立了spring的上下文,那什么启动会报错呢,这个跟Spring Boot的启动机制有关,boot在启动启动类以后,才会根据类文件间的依赖去加载spring的bean类,boot本身并不会自动去读取xml文件,所以boot是不知道我们在xml里注入的bean的,所以肯定找不到datasource和mybatis配置,所以,我们要在StartApp类里增加一个注解@@ImportResource,让boot主动加载我们的bean。

@ImportResource(locations = "classpath*:/applicationContext.xml")
  • 1

这时启动还是会报错,因为boot本着自动配置的原则,会帮你去加载mybatias的自动配置类,但自动配置类又是用的包内自有的mapper,导致找不到包,这时我们排除一下自动配置:

@SpringBootApplication(exclude = MybatisAutoConfiguration.class)
  • 1

启动,成功,测试数据成功。

这里写图片描述

方法2:使用class类配置

虽然我们能够使用导入xml的配置,但是还是显得有点麻烦,并且配置xml文件有一个很大的缺点:容易出现拼写错误。上一个例子中我自己写的类的位置很多时候检查不够充分,也因为写错两个字母,一直报类找不到,spring 从4.x开始推荐使用class配置的方式来配置bean,我刚开始其实还是挺不喜欢class的方式的,觉得,这就是写代码了配置了,有时想修改下配置变量也需要提交上线,岂不是太麻烦了。class有class的好处,保密性比配置文件好,但不如xml方便,具体使用看使用场景和个人习惯。我是觉得,小项目配置改动比较小的可以使用class方式,对于协作比较多的项目还是使用xml和配置的方式。接下来使用class的方法来配置dao。

第1步:建立配置类文件config。这里需要三个类文件: 
DataSourceConfig —>datasource源配置 
MyBatisConfig —> 配置sqlSessionFactory 
MyBatisMapperScannerConfig —> 配置mapperScannerConfigurer 
这里需要说明一下:最后一个配置因为依赖前两个,需要最后一个加载,否则会报错。

DataSourceConfig .class

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration //1
public class DataSourceConfig {

    @Bean //2
    public DataSource dataSource(){ //3
        DataSource dataSource = new DataSource(); 
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8");
        dataSource.setUsername("test");
        dataSource.setPassword("123456");
        return dataSource;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

说明: 
1:代表此类为配置类; 
2:代表需要注入的bean; 
3:使用代码的方式传入值到对象。

MyBatisConfig .class

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

@Configuration
public class MyBatisConfig implements TransactionManagementConfigurer {//1

    @Autowired //2
    DataSource dataSource;

    @Bean(name = "sqlSessionFactory")//3
    public SqlSessionFactory sqlSessionFactoryBean() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setTypeAliasesPackage("com.hjf.boot.demo.boot_mybatis.domain");

        //分页插件 //4
//        PageHelper pageHelper = new PageHelper();
//        Properties properties = new Properties();
//        properties.setProperty("reasonable", "true");
//        properties.setProperty("supportMethodsArguments", "true");
//        properties.setProperty("returnPageInfo", "check");
//        properties.setProperty("params", "count=countSql");
//        pageHelper.setProperties(properties);
        //添加插件
//        bean.setPlugins(new Interceptor[]{pageHelper});

        //添加XML目录
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
            bean.setMapperLocations(resolver.getResources("classpath:/mybatis/*Mapper.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

说明: 
1:实现TransactionManagementConfigurer接口,配置spring事务的管理; 
2:注入datasource; 
3:注入的名称指定,如果不指定,默认方法名为bean的名字,命名规则需要遵守spring命名规范; 
4:跳过分页插件,需要使用的,自行去了解mybatis分页插件的内容。

MyBatisMapperScannerConfig

import com.hjf.boot.demo.boot_mybatis.dao.Mapper;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@AutoConfigureAfter(MyBatisConfig.class)//1
public class MyBatisMapperScannerConfig {

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScannerConfigurer.setBasePackage("com.hjf.boot.demo.boot_mybatis");
        mapperScannerConfigurer.setAnnotationClass(Mapper.class);
        return mapperScannerConfigurer;
    }
}
说明:
1 : 让此类在上一个类加载完毕后再加载,代码都是xml内容的转化,比较简单。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

现在,我们来看一下上下文的依赖变化成什么样了,如下图:

这里写图片描述

这个图很好的说明了boot在建立配置的方式,和xml是有一定区别的,所以才需要注意配置类的加载顺序。

到此,方法2建立dao完毕,我们注释掉方法1里的@ImportResource和application.properties里的所有内容,启动,成功!测试数据成功!

这里写图片描述

方法3:使用starter配置

终于来到最简单的方法了,能够自己实践,然后读到这里的同学,是不是感觉到,xml反而比class的方式还麻烦呢,讲了这么多,也没有觉得Spring Boot有多方便呢,但是在前两个方法的过渡中,很多配置其实是逐渐减少了,比如web.xml,spring-mvc的serverlet配置文件,读取properties,是不是没有配置了,虽然mvc里的配置更自由,但boot也是加载了默认配置,适用于大多数场景,并且它同样提供了强大的mvc的配置和自定义的配置,后续章节会涉及到。现在,我们继续建立dao。

第1步:引入mybatis的starter的包。 Spring Boot将封装的一系列支持boot的应用的工程都叫做starter,我们这里引入mybatis对boot的支持的starter。如果是同一个的pom,要注释掉mybatis的依赖,starter会自动引入依赖包。

pom.xml

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

第2步:配置properties。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver //1
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=test
spring.datasource.password=123456
spring.datasource.max-active=10
spring.datasource.max-idle=5
spring.datasource.min-idle=0

mybatis.mapper-locations=classpath:/mybatis/*Mapper.xml //2
mybatis.type-aliases-package=com.hjf.boot.demo.boot_mybatis.domain
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

说明: 
1: spring.开头的是spring boot自动配置的属性开头,后面我们会讨论怎么自定义自己类型安全的配置项。 
2: 这是mybatis配置的自动配置的属性。

第3步,新建dao。

import com.hjf.boot.demo.boot_mybatis.domain.TestPOJO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper  //1
public interface TestDao {

    //根据age查找info
    List<TestPOJO> get(int age);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

说明: 
1:这里的Mapper是Mybatis自己定义的注解。 
到此,结束,启动,成功!测试成功!

这里写图片描述

小结

到此,本章内容结束了,到方法3的时候,会不会觉得,这么简单?就这么简单,快速配置,快速启动,你只需要关注你的核心业务。三种方法各有优缺点,适用的场景也不相同。 
上面提到的要排除自动配置,其实是因为我的demo里的pom

引入了mybatis的starter,细心的同学可能已经发现,可以不用加exclude。

 

 

https://blog.youkuaiyun.com/mickjoust/article/details/51646658

### Spring Boot集成MyBatis教程及常见问题 #### 1. MyBatis与Spring Boot的集成概述 在现代Java开发中,Spring Boot因其简洁性和自动化配置而备受青睐。为了进一步简化数据访问层的操作,开发者通常会选择将MyBatis作为持久化框架集成到Spring Boot项目中。这种组合不仅提供了强大的SQL映射功能,还保持了项目的轻量化特性。 #### 2. 集成步骤详解 ##### (a) 添加必要的依赖项 要在Spring Boot项目中使用MyBatis,第一步是修改`pom.xml`文件并添加所需的Maven依赖项。这包括`mybatis-spring-boot-starter`和数据库驱动程序(如MySQL)。以下是具体的依赖声明: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 上述代码片段展示了如何引入MyBatis的核心组件及其对应的数据库驱动支持[^1]。 ##### (b) 数据源配置 完成依赖导入后,在`application.properties`或`application.yml`文件中定义数据源的相关属性。例如: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 这些设置指定了目标数据库的位置、认证信息以及其他必要参数[^2]。 ##### (c) 启动类中的Mapper扫描 为了让Spring能够自动发现所有的Mapper接口,需在其启动类上标注`@MapperScan`注解,并指定Mapper所在的包路径。如下所示是一个典型的例子: ```java package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.mapper") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 此部分确保了所有位于指定包下的Mapper都能被正确加载至容器内[^4]。 #### 3. 常见问题分析 ##### (i) Mapper未被识别 如果运行时遇到“无法找到Mapper”的错误提示,则可能是由于缺少`@MapperScan`注解或是其指向的包名有误所致。确认该注解已正确定义于主应用程序入口处即可解决问题。 ##### (ii) SQL语句执行失败 当某些查询操作未能按预期返回结果时,应检查以下几个方面: - 是否存在拼写错误; - 参数绑定是否匹配实际需求; - XML文件内的命名空间是否一致等。 另外值得注意的是,尽管Hibernate具备更高的抽象层次,但在灵活性方面却不及MyBatis;因此对于那些追求精细控制权的应用场景来说,后者往往是更优的选择[^3]。 #### 结论 综上所述,通过合理运用以上方法可以顺利达成Spring Boot同MyBatis之间的无缝衔接,从而极大提升开发效率的同时也增强了系统的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值