spring整合Mybatis

依赖

父工程

<packaging>pom</packaging>
​
<properties>
   <maven.compiler.source>17</maven.compiler.source>
   <maven.compiler.target>17</maven.compiler.target>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
​
   <spring.version>6.2.5</spring.version>
   <lombok.version>1.18.38</lombok.version>
   <aspectjweaver.version>1.9.23</aspectjweaver.version>
   <mysql.version>9.2.0</mysql.version>
   <druid.version>1.2.24</druid.version>
   <mybatis.version>3.5.19</mybatis.version>
   <log4j.version>2.24.3</log4j.version>
   <junit5.version>5.12.2</junit5.version>
</properties>
​
<dependencies>
    <!-- spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
​
    <!-- 测试框架 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.version}</version>
    </dependency>
​
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <scope>provided</scope>
    </dependency>
​
    <!-- log4j2 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j.version}</version>
    </dependency>
​
</dependencies>
​
<dependencyManagement>
    <dependencies>
        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- druid 数据连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>${mybatis-spring.version}</version>
      </dependency>
    </dependencies>
</dependencyManagement>

配置

连接信息 jdbc.properties

# 数据库连接信息
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456
# Druid 连接池配置
# 初始化连接数:连接池启动时创建的初始连接数量
druid.initialSize=5
# 最小空闲连接数:连接池保持的最小空闲连接数量
druid.minIdle=5
# 最大活跃连接数:连接池能创建的最大连接数(包括正在使用和空闲的连接)
druid.maxActive=20
# 最大等待时间(毫秒):当没有可用连接时,请求获取连接的最大等待时间
druid.maxWait=60000
# 空闲连接检测周期(毫秒):定期检测空闲连接的间隔时间
druid.timeBetweenEvictionRunsMillis=60000
# 最小可驱逐空闲时间(毫秒):连接空闲超过此时间将被标记为可驱逐(可能被关闭)
druid.minEvictableIdleTimeMillis=300000
# 检测空闲连接时,验证连接是否有效(推荐开启)
druid.testWhileIdle=true
# 申请连接时是否验证连接有效性(高并发场景建议关闭,避免性能损耗)
druid.testOnBorrow=false
# 归还连接时是否验证连接有效性(推荐关闭,依赖 testWhileIdle 定期检测)
druid.testOnReturn=false
# 连接有效性验证 SQL(需根据数据库类型调整,如 MySQL 用 SELECT 1)
druid.validationQuery=SELECT 1

mybatis配置类MybatisConfig.java

@Configuration
@PropertySource("classpath:jdbc.properties")
@MapperScan("com.dream.mapper")
@EnableTransactionManagement
public class MybatisConfig {
    
    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    
    @Value("${jdbc.url}")
    private String url;
    
    @Value("${jdbc.username}")
    private String username;
    
    @Value("${jdbc.password}")
    private String password;
    
    @Value("${druid.initialSize}")
    private int initialSize;
    
    @Value("${druid.minIdle}")
    private int minIdle;
    
    @Value("${druid.maxActive}")
    private int maxActive;
    
    @Value("${druid.maxWait}")
    private int maxWait;
    
    @Value("${druid.timeBetweenEvictionRunsMillis}")
    private long timeBetweenEvictionRunsMillis;
    
    @Value("${druid.minEvictableIdleTimeMillis}")
    private long minEvictableIdleTimeMillis;
    
    @Value("${druid.testWhileIdle}")
    private boolean testWhileIdle;
    
    @Value("${druid.testOnBorrow}")
    private boolean testOnBorrow;
    
    @Value("${druid.testOnReturn}")
    private boolean testOnReturn;
    
    @Value("${druid.validationQuery}")
    private String validationQuery;
    
    /**
     * 配置数据源
     */
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        
        // Druid连接池配置
        dataSource.setInitialSize(initialSize);
        dataSource.setMinIdle(minIdle);
        dataSource.setMaxActive(maxActive);
        dataSource.setMaxWait(maxWait);
        dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
        dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
        dataSource.setTestWhileIdle(testWhileIdle);
        dataSource.setTestOnBorrow(testOnBorrow);
        dataSource.setTestOnReturn(testOnReturn);
        dataSource.setValidationQuery(validationQuery);
        
        return dataSource;
    }
    
    /**
     * 配置SqlSessionFactory
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        
        // 配置类型别名
        sqlSessionFactoryBean.setTypeAliasesPackage("com.dream.domain");
        
        // 配置Mapper XML文件位置
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));
        
        return sqlSessionFactoryBean.getObject();
    }
    
    /**
     * 配置事务管理器
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
    
}

spring配置SpringConfig.java

@Configuration
@ComponentScan("com.dream")
@Import({MybatisConfig.class})
public class SpringConfig {
​
} 

测试

@Slf4j
@SpringJUnitConfig(SpringConfig.class)
public class ApiTest {
​
}