xml整合第三方框架有两种整合方案:
不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如: MyBatis;
需要引入第三方框架命名空间,需要使用Spring的配置文件配置第三方框架本身内容,例如: Dubbo.
1 整合MyBatis
Spring整合MyBatis的步骤如下
导入MyBatis整合Spring的相关坐标;
编写Mapper和Mapper.xml;
配置SqlSessionFactoryBean和MapperScannerConfigurer;
编写测试代码
创建一个简单的数据库方便测试,数据如下:
创建pojo
public class User {
private int id;
private String username;
private String password;
public void setId(int id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
创建mapper
public interface UserMapper {
/**
*
* @return
*/
List<User> findAll();
}
创建mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.msf.mapper.UserMapper">
<select id="findAll" resultType="cn.msf.pojo.User">
select * from tb_user
</select>
</mapper>
spring的xml文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="username" value="xxxx"></property>
<property name="password" value="xxxx"></property>
<property name="url" value="jdbc:mysql://localhost:3307/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8"></property>
</bean>
<!--配置SqlSessionFactoryBean,将SqlSessionFactoryBean放到容器-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--MapperScannerConfigurer,扫描指定的包将mapper对象放到容器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.msf.mapper"></property>
</bean>
<bean id="userService" class="cn.msf.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
<property name="userMapper" ref="userMapper"></property>
<!-- <property name="username" value="msf"></property>-->
</bean>
测试代码:
原理:
我们在spring的xml文件中注入了一个SqlSessionFactoryBean和一个扫描mapper的 MapperScannerConfigurer,SqlSessionFactoryBean一旦被实例化,就开始扫描mapper病痛动态代理产生Mapper的实现类存储到Spring容器中。
SglSessionFactoryBean: 需要进行配置,用于提供SqlSessionFactory;
MapperScannerConfigurer: 需要进行配置,用于扫描指定mapper注册成BeanDefinition;
ClassPathMapperScanner: definitionsetAutowireMode(2) 修改了自动注入状态,所以MapperFactoryBean中的setSqlSessionFactory会自动注入进去。
MapperFactoryBean: Mapper的FactoryBean,获得指定Mapper时调用getObject方法
最终调用sqlsession.getmapper方法。