Spring4️⃣整合MyBatis
SSM 整合
- 原始方式:MyBatis 相关配置文件、Spring 相关配置文件。
- Spring 整合 MyBatis:在 Spring 配置文件中配置MyBatis 的配置。
(即:由 Spring 完成 MyBatis 的工作)
回顾
1、环境搭建
1.1、业务实体
以 user(id, name, password) 为例
-
user 表
-
User 类
public class User { private String userId; private String name; private String password; // 构造方法 // toString()、getter、setter }
1.2、项目依赖
核心项目依赖
-
Spring:导入 webmvc 即可引入相关 Spring 依赖。
-
MyBatis:MySQL 驱动、MyBatis 依赖
<!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <!-- MyBatis --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency>
2、原始方式
在项目中使用两个框架,二者互不依赖。
2.1、MyBatis 环境
- 配置文件:数据源、日志等
- 核心配置文件:通常命名 SqlMapConfig 或 mybatis-config
- 工具类:生成 sqlSession
2.1.1、数据源配置文件
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://数据库名:端口号?参数
jdbc.username=用户名
jdbc.password=密码
2.1.2、核心配置文件
mybatis-config.xml
-
引入数据源配置文件
-
命名映射:将数据库列名(xxx_yyy)自动映射为 Java 属性名(xxxYyy)
-
类型别名:pojo
-
环境配置
-
注册 Mapper
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <package name="indi.jaywee.pojo"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="映射文件的路径"/> <mapper class="Mapper接口的全限类名"/> </mappers> </configuration>
2.1.3、工具类
MyBatisUtils
public class MyBatisUtils {
private static final SqlSessionFactory SQL_SESSION_FACTORY;
static {
String resource = "mybatis-config.xml";
InputStream is = null;
try {
// 加载核心配置文件
is = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
// 构建sqlSessionFactory
SQL_SESSION_FACTORY = new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession getSqlSession() {
// 创建sqlSession实例
return SQL_SESSION_FACTORY.openSession();
}
}
2.2、Spring 环境
Spring 核心配置文件:applicationContext.xml
注解扫描:dao、pojo、service
<context:component-scan base-package="indi.jaywee.mapper"/>
<context:component-scan base-package="indi.jaywee.pojo"/>
<context:component-scan base-package="indi.jaywee.service"/>
2.3、Mapper 开发及测试
2.3.1、UserMapper
-
Mapper 接口
public interface UserMapper { User getUserByUserId(String userId); int insertUser(User user); }
-
Mapper.xml:存放在 resouces 目录,Mapper 接口的同级包下。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="indi.jaywee.mapper.UserMapper"> <select id="getUserByUserId" parameterType="string" resultType="user"> SELECT user_id, name, password FROM study_mysql.t_user WHERE user_id = #{userId} </select> <insert id="insertUser" parameterType="user"> INSERT INTO study_mysql.t_user(user_id, name, password) VALUE (#{userId}, #{name}, #{password}) </insert> </mapper>
2.3.2、测试
模拟 Service 层,调用 Mapper 层方法
-
获得 sqlSession 对象
-
通过 sqlSession 对象获取 Mapper 接口的动态代理实现类。
-
调用 Mapper 接口方法。
-
关闭 sqlSession。
private UserMapper mapper; @Test public void testGetUserByUserId() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserByUserId("u_jaywee"); System.out.println(user); sqlSession.close(); }
2.4、分析
原始方式整合,没有体现 Spring 容器的优势。
- 配置文件:创建 MyBatis 和 Spring 的配置文件,各自进行配置。
- 获取 Mapper:需手动获取
- 在工具类中加载核心配置文件,构造 sqlSessionFactory,创建 sqlSession。
- 从工具类中获取 sqlSession,获取 Mapper 接口。
- 事务:由 MyBatis 控制事务。
优化
- 配置文件:在 Spring 配置文件中配置 MyBatis 的配置。
- 获取 Mapper:配置后自动注入
- sqlSessionFactoryBean:用于创建 sqlSession。
- Mapper 扫描配置器:扫描 Mapper 并创建实现类,注入依赖。
- 事务:Spring 声明式事务控制。
3、Spring 整合 MyBatis(❗)
由 Spring 容器完成 MyBatis 的工作,关键在于配置文件。
3.1、导入依赖
-
框架整合:mybatis-spring
-
获取数据源:spring-jdbc
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency>
3.2、整合配置文件(❗)
Spring 可完成所有 MyBatis 的相关配置。
- 为区分职责,通常会保留 mybatis-config,进行 settings 和 typeAliases 的配置。
- 其余配置由 Spring 完成。
3.2.1、mybatis-config
保留 settings 和 typeAliases 的配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="indi.jaywee.pojo"/>
</typeAliases>
</configuration>
3.2.2、mybatis-spring
-
引入数据源配置文件
-
数据源:在 MyBatis 中的 mybatis-config 设置
-
sqlSessionFactory:绑定数据源、MyBatis 配置文件。
-
Mapper 扫描配置器:扫描 Mapper,生成动态代理实现类。
<context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="mybatis-config.xml"/> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="indi.jaywee.mapper"/> </bean>
applicationContext.xml
导入整合配置文件。
<import resource="mybatis-spring.xml"/>
3.3、测试
Service 层
专注于调用 Mapper 接口方法,由 Spring 加载配置文件、获取 sqlSession 等。
-
接口
public interface UserService { User getUserByUserId(String userId); int insertUser(User user); }
-
实现类:定义成员变量 UserMapper,自动注入依赖。
@Service public class UserServiceImpl implements UserService { @Resource private UserMapper mapper; @Override public User getUserByUserId(String userId) { return mapper.getUserByUserId(userId); } @Override public int insertUser(User user) { return mapper.insertUser(user); } }