SpringBoot-数据访问

SpringBoot-数据访问

SpringBoot整合Spring、SpringMVC、Mybatis(SSM)进行数据访问场景开发

SSM整合流程

  1. 导入mybatis-spring-boot-starter
  2. 配置数据源信息
  3. 配置Mybatis的Mapper接口扫描与XML映射文件扫描
  4. 编写实体类,Mapper接口,生成MapperXML,编写sql进行CRUD

创建SSM整合项目并导入相应的依赖

    <!-- 所有springboot项目都必须继承自 spring-boot-starter-parent -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.9</version>
    </parent>

    <dependencies>
        <!--web场景-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--lombok简化JavaBean开发,自动生成构造器、getter/seter、自动生成Builder模式等-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>compile</scope>
        </dependency>

        <!-- mysql驱动-->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

        <!-- 第三方依赖 mybaits场景-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>

    <!-- SpringBoot应用打包插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

配置数据源与Mybatis

# 配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456

# 配置整合Mybatis
mybatis.mapper-locations=classpath:/mapper/*.xml
# 打开驼峰命名规则
mybatis.configuration.map-underscore-to-camel-case=true

# 开启调试模式,详细打印开启了哪些自动配置
debug=true
# Positive:生效的自动配置,Negative:不生效的自动配置

编写CRUD

用户实体类

/**
 * 用户实体类
 */
@Data
public class User {
    /**
     * 用户id
     */
    private Integer userId;
    /**
     * 用户名
     */
    private String userName;
    /**
     * 账户余额
     */
    private Integer balance;
}

Mapper接口

public interface UserMapper {
    /**
     * 每个方法都在Mapper文件有一个对应的sql标签对应
     * 所有参数都应该用@Param注解进行签名,以后使用指定的名字在SQL中取值
     * @param userId 用户id
     * @return 用户信息
     */
    User getUserById(@Param("user_id") Long userId);
}

使用mybatisX插件快速生成MapperXML

<?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" >
<mapper namespace="com.demo.ssm.mapper.UserMapper">
    <!--    接口的全类名和namespace的值是一一对应的-->
    <select id="getUserById" resultType="com.demo.ssm.bean.User">
        select *
        from user
        where user_id = #{user_id}
    </select>
</mapper>

控制层接口

/**
 * 用户控制层接口
 */
@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user/{user_id}")
    public User getUser(@PathVariable("user_id") Long userId) {
        return userMapper.getUserById(userId);
    }
}

启动类

/**
 * @MapperScan 注解告诉mybatis,扫描哪个包下面的所有接口
 * 使用mybatis.mapper-locations 配置参数 告诉Mybatis,每个接口的xml文件在哪里
 * Mybatis自动关联绑定
 */
@MapperScan(basePackages = "com.demo.ssm.mapper")
@SpringBootApplication
public class SSMApplication {
    public static void main(String[] args) {
        SpringApplication.run(SSMApplication.class, args);
    }
}

自动配置原理

JDBC场景的自动配置

mybatis-spring-boot-starter依赖会导入spring boot官方依赖spring-boot-starter-jdbc,jdbc是操作数据库的场景,引入该场景后会使以下配置类激活

1

  • DataSourceAutoConfiguration:数据源核心配置类。会根据classpath中的依赖和配置文件智能选择并创建DataSource Bean。如果没有引入任何连接池则默认使用HikariCP。
  • DataSourceTransactionManagerAutoConfiguration:自动配置Spring的事务管理器。它会检查容器中是否存在DataSource Bean,如果存在,则自动创建一个DataSourceTransactionManager实例,并将其注册为PlatfromTransactionManager。这就是为什么在SpringBoot中可以直接使用@Transactional注解的原因。
  • JdbcTemplateAutoConfiguration:自动配置JdbcTemplate。如果容器中存在DataSource Bean,且classpath下存在JdbcTemplate类,它会自动创建一个JdbcTemplate Bean和一个NamedParameterJdbcTemplate Bean。你可以直接在业务代码中通过@Autowired注入并使用它们,无需手动new。
引入spring-boot-starter-jdbc后,你只需要在配置文件中提供数据库连接信息,SpringBoot就会自动为你搭建以下体系:
1.连接池(HikariCP)
2.事务管理器(DataSourceTransactionManager)
3.数据库操作模板(JdbcTemplate)

第三方Mybatis场景的自动配置

在引入mybatis-spring-boot-starter依赖后,Mybatis的自动配置主要通过mybatis-spring-boot-autoconfigure模块实现,利用了SPI(Service Provider Interface)机制和条件注解来完成Bean的自动注册

2

当Spring Boot启动时,AutoConfigurationImportSelector会去读取classpath下所有的jar包中的特定文件,其路径为INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

而在mybatis-spring-boot-autoconfigure包中,该文件定义了启用自动配置的全路径名,如上图所示

核心配置类-MybatisAutoConfiguration

MybatisAutoConfiguration是自动配置的核心类。它使用了一系列关键注解来控制配置和加载时机和条件

类级注解分析
@org.springframework.context.annotation.Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration {...}
  • @Configuration:
    • 声明这是配置类,可以向Spring容器注册Bean
  • @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }):
    • 这是前置条件。只有当类路径下存在MyBatis的核心类SqlSessionFactory和SqlSessionFactoryBean时,该配置类才会生效。
    • 这意味着必须引入Mybatis的核心依赖(通常starter已经帮你引入了)
  • @ConditionalOnSingleCandidate(DataSource.class):
    • 这是数据源依赖条件。只有当Spring容器中存在且仅有一个DataSource(数据源)Bean时,配置才会生效
    • 因为Mybatis必须依赖数据库链接,如果没有数据源,Mybatis配置就没有意义
  • @EnableConfigurationProperties(MybatisProperties.class):
    • 开启对配置类的支持。它将MybatisProperties注册为Bean,以便配置文件中的配置(mybatis.xx)绑定到该类的字段中
  • @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class }):
    • 加载顺序控制。指定该配置类必须在Spring Boot的数据源自动配置完成之后再执行。这保证了在初始化Mybatis时,数据源已经准备好了
核心Bean的注册

在MybatisAutoConfiguration类内部,主要定义了两个核心Bean:SqlSessionFactory和SqlSessionTemplate

  • SqlSessionFactory: Mybatis的核心接口,用于创建SqlSession
  • SqlSessioonTemplate: Mybatis-spring提供的核心类,它是线程安全的,用于替代Mybatis原生的SqlSession

Mapper接口的自动扫描

虽然MybatisAutoConfiguration创建了基础设施,但Mapper接口的注册通常由@MapperScan注解处理

3

通常做法为在启动类上添加@MapperScan("com.example.mapper"),其原理为利用@Import(MapperScannerRegistrar.class)批量给容器中注册组件:解析指定包路径里面的每一个类,为每一个Mapper接口类,创建Bean定义信息,注册到容器中

整体的流程

通过这种机制,开发者只需要引入依赖并配置数据源,即可零配置使用Mybatis,极大简化了集成难度

  1. 引入依赖:项目引入mybatis-spring-boot-starter
  2. 类加载:Spring Boot启动,读取INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,发现MybatisAutoConfiguration
  3. 条件校验:
    1. 检查类路径是否有Mybatis核心包
    2. 检查容器是否有数据源
  4. 属性绑定:读取配置文件中的mybatis.*配置到MybatisProperties
  5. Bean注册:
    1. 创建SqlSessionFactory(绑定数据源、加载XML、配置插件)
    2. 创建SqlSessionTemplate(线程安全的操作模版)
  6. Mapper扫描:根据@MapperScan配置,将Mapper接口注册为Spring Bean

参考资料

SQL Databases :: Spring Boot

posted @ 2026-07-19 13:48  柯南。道尔  阅读(3)  评论(0)    收藏  举报