第一章:思路

Spring 和 Mybatis 整合思路.png

第二章:Mybatis - Spring 技术

  • 官网
  • 相关技术之间版本匹配说明:

Mybatis - Spring 技术版本匹配.png

  • Mybatis-Spring 的依赖:
  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis-spring</artifactId>
  4. <version>2.0.6</version>
  5. </dependency>

第三章:总体 SSM 整合所需依赖

  • pom.xml
  1. <!-- Mybatis 整合 Spring -->
  2. <dependency>
  3. <groupId>org.mybatis</groupId>
  4. <artifactId>mybatis-spring</artifactId>
  5. <version>2.0.6</version>
  6. </dependency>
  7. <!-- SpringMVC -->
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-webmvc</artifactId>
  11. <version>5.3.12</version>
  12. </dependency>
  13. <!-- Spring 持久化层所需依赖 -->
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-orm</artifactId>
  17. <version>5.3.12</version>
  18. </dependency>
  19. <!-- 日志 -->
  20. <dependency>
  21. <groupId>ch.qos.logback</groupId>
  22. <artifactId>logback-classic</artifactId>
  23. <version>1.2.7</version>
  24. </dependency>
  25. <!-- ServletAPI -->
  26. <dependency>
  27. <groupId>javax.servlet</groupId>
  28. <artifactId>javax.servlet-api</artifactId>
  29. <version>4.0.1</version>
  30. <scope>provided</scope>
  31. </dependency>
  32. <!-- Spring5和Thymeleaf整合包 -->
  33. <dependency>
  34. <groupId>org.thymeleaf</groupId>
  35. <artifactId>thymeleaf-spring5</artifactId>
  36. <version>3.0.12.RELEASE</version>
  37. </dependency>
  38. <!-- Mybatis核心 -->
  39. <dependency>
  40. <groupId>org.mybatis</groupId>
  41. <artifactId>mybatis</artifactId>
  42. <version>3.5.7</version>
  43. </dependency>
  44. <!-- MySQL驱动 -->
  45. <dependency>
  46. <groupId>mysql</groupId>
  47. <artifactId>mysql-connector-java</artifactId>
  48. <version>8.0.25</version>
  49. </dependency>
  50. <!-- 数据源 -->
  51. <dependency>
  52. <groupId>com.alibaba</groupId>
  53. <artifactId>druid</artifactId>
  54. <version>1.2.8</version>
  55. </dependency>
  56. <!-- junit5 -->
  57. <dependency>
  58. <groupId>org.junit.jupiter</groupId>
  59. <artifactId>junit-jupiter-api</artifactId>
  60. <version>5.8.1</version>
  61. <scope>test</scope>
  62. </dependency>
  63. <!-- Spring 的测试功能 -->
  64. <dependency>
  65. <groupId>org.springframework</groupId>
  66. <artifactId>spring-test</artifactId>
  67. <version>5.3.12</version>
  68. </dependency>
  69. <!-- Lombok -->
  70. <dependency>
  71. <groupId>org.projectlombok</groupId>
  72. <artifactId>lombok</artifactId>
  73. <version>1.18.22</version>
  74. <scope>provided</scope>
  75. </dependency>

第四章:配置数据源

4.1 创建 jdbc.properties

  • jdbc.properties
  1. jdbc.user=root
  2. jdbc.password=123456
  3. jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&allowMultiQueries=true
  4. jdbc.driver=com.mysql.cj.jdbc.Driver

4.2 加入日志配置文件

  • logback.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="true">
  3. <!-- 指定日志输出的位置 -->
  4. <appender name="STDOUT"
  5. class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <!-- 日志输出的格式 -->
  8. <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
  9. <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
  10. <charset>UTF-8</charset>
  11. </encoder>
  12. </appender>
  13. <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
  14. <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
  15. <root level="INFO">
  16. <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
  17. <appender-ref ref="STDOUT" />
  18. </root>
  19. <!-- 根据特殊需求指定局部日志级别 -->
  20. <logger name="org.springframework.web.servlet.DispatcherServlet" level="DEBUG" />
  21. </configuration>

4.3 创建 Spring 的配置文件

  • spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6. <!-- 加载外部属性配置文件 -->
  7. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  8. <!-- 配置数据源 -->
  9. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  10. <property name="url" value="${jdbc.url}"/>
  11. <property name="password" value="${jdbc.password}"/>
  12. <property name="driverClassName" value="${jdbc.driver}"/>
  13. <property name="username" value="${jdbc.user}"/>
  14. </bean>
  15. </beans>

4.3 创建 Junit 测试

  1. package com.github.fairy.era;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
  6. import javax.sql.DataSource;
  7. /**
  8. * @author 许大仙
  9. * @version 1.0
  10. * @since 2021-11-22 09:25
  11. */
  12. @SpringJUnitConfig(locations = {"classpath:spring-persist.xml"})
  13. @Slf4j
  14. public class SpringTest {
  15. @Autowired
  16. private DataSource dataSource;
  17. @Test
  18. public void test() {
  19. log.info(" dataSource = " + dataSource);
  20. }
  21. }

第五章:配置 SqlSessionFactoryBean

5.1 创建 Mybatis 全局配置文件

  • mybatis-config.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!-- Mybatis全局配置 -->
  7. <settings>
  8. <!-- 将数据库表字段映射到驼峰式命名的Java实体类属性中 -->
  9. <!-- 数据库表字段格式:单词_单词 -->
  10. <!-- Java实体类属性:首字母小写的驼峰式命名 -->
  11. <setting name="mapUnderscoreToCamelCase" value="true"/>
  12. </settings>
  13. </configuration>

5.2 数据库脚本

  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3. -- ----------------------------
  4. -- 创建数据库
  5. -- ----------------------------
  6. CREATE DATABASE IF NOT EXISTS `ssm` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  7. -- ----------------------------
  8. -- 创建表
  9. -- ----------------------------
  10. DROP TABLE IF EXISTS `employee`;
  11. CREATE TABLE `employee` (
  12. `id` int(11) NOT NULL AUTO_INCREMENT,
  13. `last_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  14. `gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  15. `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  16. PRIMARY KEY (`id`) USING BTREE
  17. ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
  18. -- ----------------------------
  19. -- 插入数据
  20. -- ----------------------------
  21. INSERT INTO `employee` VALUES (1, 'jerry', '男', 'jerry@qq.com');
  22. INSERT INTO `employee` VALUES (2, 'aa', '男', 'aa@11.com');
  23. INSERT INTO `employee` VALUES (3, 'bb', '男', 'bb@11.com');
  24. INSERT INTO `employee` VALUES (4, 'aa', '男', 'aa@11.com');
  25. INSERT INTO `employee` VALUES (5, 'bb', '男', 'bb@11.com');
  26. SET FOREIGN_KEY_CHECKS = 1;

5.3 创建实体类

  • Employee.java
  1. package com.github.fairy.era.entity;
  2. import lombok.Data;
  3. /**
  4. * @author 许大仙
  5. * @version 1.0
  6. * @since 2021-11-22 09:42
  7. */
  8. @Data
  9. public class Employee {
  10. private Integer id;
  11. private String lastName;
  12. private String gender;
  13. private String email;
  14. }

5.4 创建 Mapper 接口

  • EmployeeMapper.java
  1. package com.github.fairy.era.mapper;
  2. import com.github.fairy.era.entity.Employee;
  3. import java.util.List;
  4. /**
  5. * @author 许大仙
  6. * @version 1.0
  7. * @since 2021-11-22 09:56
  8. */
  9. public interface EmployeeMapper {
  10. List<Employee> findAll();
  11. }

5.5 创建 Mapper 配置文件

  • EmployeeMapper.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- mapper是根标签。namespace属性是找到当前配置的依据 -->
  6. <!-- 由于最理想的Mybatis使用方式是:通过Mapper接口调用接口方法,访问数据库 -->
  7. <!-- 这样的理想方式要求:能够通过接口全类名找到Mapper配置 -->
  8. <!-- 所以:我们就用Mapper接口的全类名来给namespace属性赋值 -->
  9. <mapper namespace="com.github.fairy.era.mapper.EmployeeMapper">
  10. <select id="findAll" resultType="com.github.fairy.era.entity.Employee">
  11. SELECT id,last_name,gender,email
  12. FROM employee
  13. </select>
  14. </mapper>

5.6 配置 sqlSessionFactoryBean

5.6.1 保留 Mybatis 全局配置文件

  • spring-persist.xml
  1. <!-- 配置 sessionFactoryBean -->
  2. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <!-- 数据源 -->
  4. <property name="dataSource" ref="dataSource"/>
  5. <!-- 指定 Mybatis 全局配置文件位置 -->
  6. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  7. <!-- 指定 Mapper 配置文件位置 -->
  8. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  9. </bean>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6. <!-- 加载外部属性配置文件 -->
  7. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  8. <!-- 配置数据源 -->
  9. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  10. <property name="url" value="${jdbc.url}"/>
  11. <property name="password" value="${jdbc.password}"/>
  12. <property name="driverClassName" value="${jdbc.driver}"/>
  13. <property name="username" value="${jdbc.user}"/>
  14. </bean>
  15. <!-- 配置 sessionFactoryBean -->
  16. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  17. <!-- 数据源 -->
  18. <property name="dataSource" ref="dataSource"/>
  19. <!-- 指定 Mybatis 全局配置文件位置 -->
  20. <property name="configLocation" value="classpath:mybatis-config.xml"/>
  21. <!-- 指定 Mapper 配置文件位置 -->
  22. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  23. </bean>
  24. </beans>

5.6.2 彻底舍弃 Mybatis 全局配置文件

  • spring-persist.xml
  1. <!-- 配置 sessionFactoryBean -->
  2. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  3. <!-- 数据源 -->
  4. <property name="dataSource" ref="dataSource"/>
  5. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  6. <property name="configuration">
  7. <bean class="org.apache.ibatis.session.Configuration">
  8. <property name="mapUnderscoreToCamelCase" value="true"/>
  9. </bean>
  10. </property>
  11. <!-- 指定 Mapper 配置文件位置 -->
  12. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  13. </bean>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6. <!-- 加载外部属性配置文件 -->
  7. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  8. <!-- 配置数据源 -->
  9. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  10. <property name="url" value="${jdbc.url}"/>
  11. <property name="password" value="${jdbc.password}"/>
  12. <property name="driverClassName" value="${jdbc.driver}"/>
  13. <property name="username" value="${jdbc.user}"/>
  14. </bean>
  15. <!-- 配置 sessionFactoryBean -->
  16. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  17. <!-- 数据源 -->
  18. <property name="dataSource" ref="dataSource"/>
  19. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  20. <property name="configuration">
  21. <bean class="org.apache.ibatis.session.Configuration">
  22. <property name="mapUnderscoreToCamelCase" value="true"/>
  23. </bean>
  24. </property>
  25. <!-- 指定 Mapper 配置文件位置 -->
  26. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  27. </bean>
  28. </beans>

注意:上面两种方式如果并存,会抛出异常:java.lang.IllegalStateException: Property ‘configuration’ and ‘configLocation’ can not specified with together

5.7 配置 Mapper 接口的扫描器

5.7.1 使用扫描器

  • spring-persist.xml
  1. <!-- 配置 Mapper 接口 bean 的扫描器 -->
  2. <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  3. <property name="basePackage" value="com.github.fairy.era.mapper"/>
  4. </bean>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  6. <!-- 加载外部属性配置文件 -->
  7. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  8. <!-- 配置数据源 -->
  9. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  10. <property name="url" value="${jdbc.url}"/>
  11. <property name="password" value="${jdbc.password}"/>
  12. <property name="driverClassName" value="${jdbc.driver}"/>
  13. <property name="username" value="${jdbc.user}"/>
  14. </bean>
  15. <!-- 配置 sessionFactoryBean -->
  16. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  17. <!-- 数据源 -->
  18. <property name="dataSource" ref="dataSource"/>
  19. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  20. <property name="configuration">
  21. <bean class="org.apache.ibatis.session.Configuration">
  22. <property name="mapUnderscoreToCamelCase" value="true"/>
  23. </bean>
  24. </property>
  25. <!-- 指定 Mapper 配置文件位置 -->
  26. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  27. </bean>
  28. <!-- 配置 Mapper 接口 bean 的扫描器 -->
  29. <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  30. <property name="basePackage" value="com.github.fairy.era.mapper"/>
  31. </bean>
  32. </beans>

5.7.2 使用 mybatis-spring 名称空间

  • spring-persist.xml
  1. <!-- 使用 mybatis-spring 名称空间 -->
  2. <mybatis-spring:scan base-package="com.github.fairy.era.mapper"/>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
  7. <!-- 加载外部属性配置文件 -->
  8. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  9. <!-- 配置数据源 -->
  10. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  11. <property name="url" value="${jdbc.url}"/>
  12. <property name="password" value="${jdbc.password}"/>
  13. <property name="driverClassName" value="${jdbc.driver}"/>
  14. <property name="username" value="${jdbc.user}"/>
  15. </bean>
  16. <!-- 配置 sessionFactoryBean -->
  17. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  18. <!-- 数据源 -->
  19. <property name="dataSource" ref="dataSource"/>
  20. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  21. <property name="configuration">
  22. <bean class="org.apache.ibatis.session.Configuration">
  23. <property name="mapUnderscoreToCamelCase" value="true"/>
  24. </bean>
  25. </property>
  26. <!-- 指定 Mapper 配置文件位置 -->
  27. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  28. </bean>
  29. <!-- 使用 mybatis-spring 名称空间 -->
  30. <mybatis-spring:scan base-package="com.github.fairy.era.mapper"/>
  31. </beans>

注意:两种方式任选一种即可。

5.8 测试

  1. package com.github.fairy.era;
  2. import com.github.fairy.era.mapper.EmployeeMapper;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
  7. /**
  8. * @author 许大仙
  9. * @version 1.0
  10. * @since 2021-11-22 09:25
  11. */
  12. @SpringJUnitConfig(locations = {"classpath:spring-persist.xml"})
  13. @Slf4j
  14. public class SpringTest {
  15. @Autowired
  16. private EmployeeMapper employeeMapper;
  17. @Test
  18. public void test() {
  19. System.out.println("employeeMapper = " + employeeMapper);
  20. }
  21. }

第六章:加入声明式事务

6.1 配置事务管理器

  • spring-persist.xml
  1. <!-- 配置事务管理器 -->
  2. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  3. <property name="dataSource" ref="dataSource"/>
  4. </bean>
  5. <!-- 开启基于注解的事务支持 -->
  6. <tx:annotation-driven transaction-manager="transactionManager"/>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  8. <!-- 加载外部属性配置文件 -->
  9. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  10. <!-- 配置数据源 -->
  11. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  12. <property name="url" value="${jdbc.url}"/>
  13. <property name="password" value="${jdbc.password}"/>
  14. <property name="driverClassName" value="${jdbc.driver}"/>
  15. <property name="username" value="${jdbc.user}"/>
  16. </bean>
  17. <!-- 配置 sessionFactoryBean -->
  18. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  19. <!-- 数据源 -->
  20. <property name="dataSource" ref="dataSource"/>
  21. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  22. <property name="configuration">
  23. <bean class="org.apache.ibatis.session.Configuration">
  24. <property name="mapUnderscoreToCamelCase" value="true"/>
  25. </bean>
  26. </property>
  27. <!-- 指定 Mapper 配置文件位置 -->
  28. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  29. </bean>
  30. <!-- 使用 mybatis-spring 名称空间 -->
  31. <mybatis-spring:scan base-package="com.github.fairy.era.mapper"/>
  32. <!-- 配置事务管理器 -->
  33. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  34. <property name="dataSource" ref="dataSource"/>
  35. </bean>
  36. <!-- 开启基于注解的事务支持 -->
  37. <tx:annotation-driven transaction-manager="transactionManager"/>
  38. </beans>

6.2 创建Service组件

  • EmployeeService.java
  1. package com.github.fairy.era.service;
  2. import com.github.fairy.era.entity.Employee;
  3. import java.util.List;
  4. /**
  5. * @author 许大仙
  6. * @version 1.0
  7. * @since 2021-11-22 12:38
  8. */
  9. public interface EmployeeService {
  10. List<Employee> findAll();
  11. }
  • EmployeeServiceImpl.java
  1. package com.github.fairy.era.service.impl;
  2. import com.github.fairy.era.entity.Employee;
  3. import com.github.fairy.era.mapper.EmployeeMapper;
  4. import com.github.fairy.era.service.EmployeeService;
  5. import lombok.RequiredArgsConstructor;
  6. import org.springframework.stereotype.Service;
  7. import org.springframework.transaction.annotation.Transactional;
  8. import java.util.List;
  9. /**
  10. * @author 许大仙
  11. * @version 1.0
  12. * @since 2021-11-22 12:39
  13. */
  14. @Service
  15. @Transactional(rollbackFor = Exception.class,readOnly = true)
  16. @RequiredArgsConstructor
  17. public class EmployeeServiceImpl implements EmployeeService {
  18. private final EmployeeMapper employeeMapper;
  19. @Override
  20. public List<Employee> findAll() {
  21. return employeeMapper.findAll();
  22. }
  23. }

6.3 配置自动扫描的包

  • spring-persist.xml
  1. <!-- 配置自动扫描的包 -->
  2. <context:component-scan base-package="com.github.fairy.era.service"/>
  • 完整的 spring-persist.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
  8. <!-- 加载外部属性配置文件 -->
  9. <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  10. <!-- 配置数据源 -->
  11. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  12. <property name="url" value="${jdbc.url}"/>
  13. <property name="password" value="${jdbc.password}"/>
  14. <property name="driverClassName" value="${jdbc.driver}"/>
  15. <property name="username" value="${jdbc.user}"/>
  16. </bean>
  17. <!-- 配置 sessionFactoryBean -->
  18. <bean id="sessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  19. <!-- 数据源 -->
  20. <property name="dataSource" ref="dataSource"/>
  21. <!-- 舍弃 Mybatis 全局配置文件,使用 configuration 属性 -->
  22. <property name="configuration">
  23. <bean class="org.apache.ibatis.session.Configuration">
  24. <property name="mapUnderscoreToCamelCase" value="true"/>
  25. </bean>
  26. </property>
  27. <!-- 指定 Mapper 配置文件位置 -->
  28. <property name="mapperLocations" value="classpath*:com/github/fairy/era/mapper/*Mapper.xml"/>
  29. </bean>
  30. <!-- 使用 mybatis-spring 名称空间 -->
  31. <mybatis-spring:scan base-package="com.github.fairy.era.mapper"/>
  32. <!-- 配置事务管理器 -->
  33. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  34. <property name="dataSource" ref="dataSource"/>
  35. </bean>
  36. <!-- 开启基于注解的事务支持 -->
  37. <tx:annotation-driven transaction-manager="transactionManager"/>
  38. <!-- 配置自动扫描的包 -->
  39. <context:component-scan base-package="com.github.fairy.era.service"/>
  40. </beans>

6.4 测试

  1. package com.github.fairy.era;
  2. import com.github.fairy.era.service.EmployeeService;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
  7. /**
  8. * @author 许大仙
  9. * @version 1.0
  10. * @since 2021-11-22 09:25
  11. */
  12. @SpringJUnitConfig(locations = {"classpath:spring-persist.xml"})
  13. @Slf4j
  14. public class SpringTest {
  15. @Autowired
  16. private EmployeeService employeeService;
  17. @Test
  18. public void test() {
  19. employeeService.findAll().forEach(System.out::println);
  20. }
  21. }