文章目录
- 一、前述
- 二、引出
- SqlSessionFactory
- 数据映射器类
- 三、手动整合
- 环境搭建
- 依赖注入报错
- 代理方式改写
- 使用包扫描方式
- 自定义扫描器修改
- 改写代理类
- 加入SqlSessionFactory的对象
- 四、总结
一、前述
spring框架概述:
- spring可以理解为一个帮我们管理bean的容器。
- 之前我们创建bean都是通过new的方式,使用spring之后, 只需要告诉spring有那些bean,它就会帮我们管理这些bean,在程序启动的时候帮我们创建好,放到一个容器中,随用随取, 并且维护bean整体的生命周期。
- spring有两大特性 AOP(面向切面编程)和 IOC(控制反转)。
- spring也是一个基础框架, 在此基础之上还有 springboot 框架和 springcloud 框架,这些框架都是以spring框架为基础的,并在此基础上进行二次开发。
mybatis框架概述:
- mybatis是一个基于java的持久层框架,内部封装了jdbc,使开发者只需要关注SQL语句本身,无需要花费精力去处理加载驱动,创建连接,创建Statement等复杂过程。
- mybatis通过xml或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的SQL的动态参数进行映射,生成最终需要执行的SQL语句,最后由mybatis框架执行SQL并将结果映射为java对象返回。
- 使用mybatis配置之后就不用再写dao接口的实现类了,mybatis会通过动态代理的方式创建实体类。
- 注意:mybatis框架是可以单独使用的,该框架的主要作用就是方便我们操作数据库。
总结:
- spring框架是一个帮助我们管理bean的框架, mybatis框架是帮我们访问数据库的框架,二者都可以单独使用。
- 使用mybatis框架需要用到mybatis框架所提供的一些类构造出对应的对象,然后才能使用mybatis框架给我们提供的功能。
问题就是如何让spring帮我们管理mybatis框架提供的这些bean那?这所谓的spring整合mybatis框架。
二、引出
通过mybatis官网的入门介绍里可知,每个基于 mybatis 的应用都是以一个 SqlSessionFactory
的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder
获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 得到。有了 SqlSessionFactory,就可以从中获得 SqlSession
的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。通过 SqlSession 实例来直接执行已映射的 SQL 语句。
// 配置文件
String resource = "org/mybatis/example/mybatis-config.xml";
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过配置构建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
}
mybatis核心配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
SQL映射配置文件(如果使用注解则可以不配置):BlogMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>
数据映射器类:BlogMapper.class
public interface BlogMapper {public Blog selectBlog(Long id);
}
因此要想和 spring 一起使用 mybatis,需要在 spring 容器中定义至少两样东西,一个 SqlSessionFactory
和 至少一个数据映射器类
。
SqlSessionFactory
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.3</version>
</dependency>
在 mybatis-spring jar包中,可使用 SqlSessionFactoryBean 来创建 SqlSessionFactory。 要配置这个工厂 bean,只需要在 spring 的 xml 配置文件中配置即可:
<!-- 数据库连接配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="1234"></property>
</bean>
<!-- 可使用 SqlSessionFactoryBean 来创建 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- SqlSessionFactory 需要一个 DataSource(数据源),可以是任意的 DataSource --><property name="dataSource" ref="dataSource" />
</bean>
数据映射器类
public interface BlogMapper {@Select(" select * from Blog where id = #{id}")public Blog selectBlog(Long id);
}
mybatis所指定的映射器类必须是一个接口,而接口不是具体实现类,故不能直接使用。可以通过 MapperFactoryBean
将接口加入到 Spring 容器中。
<bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="org.mybatis.example.BlogMapper" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
将上述配置将入到spring的xml配置文件,配置好之后,你就可以使用 spring 的Autowired注解,将映射器类注入到你的业务或服务对象中了。MapperFactoryBean 将会负责 SqlSession 的创建和关闭。如果使用了 Spring 的事务功能,那么当事务完成时,Session 将会被提交或回滚。最终任何异常都会被转换成 Spring 的 DataAccessException 异常。
三、手动整合
环境搭建
POM文件坐标:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework