1. MyBatis Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。<br /> 下面以两种方式来实现 Spring MyBatis 的整合: <br />(1Mapper 动态代理 <br />(2)支持扫描的 Mapper 动态代理

1 Mapper 动态代理方式

项目:spring-mybatis-1。
在项目 dao_jdbcTemplate 上修改。

1.1 导入 Jar 包

无论哪种实现方式,均需要首先完成 Jar 包的导入。

(1)mybatis 的 Jar 包

image.png

(2)Spring 的 Jar 包

image.png

(3)mybatis 与 Spring 整合 Jar 包

该 Jar 包需要从 mybatis 官网下载。登录 MyBatis 的下载官网,找到 spring 链接:
image.pngimage.png
image.png

(4)其它 Jar 包

 由于程序需要使用 JUnit 进行测试,所以导入 JUnit 的 Jar 包。 由于需要连接 mysql 数据库,所以导入 mysql 驱动 Jar 包。 由于连接数据库使用 C3P0 数据源,所以导入 C3P0 的 jar 包。从 Spring 的支持库中获取。  

1.2 定义映射文件 mapper

在 Dao 接口的包中创建 MyBatis 的映射文件 mapper,命名与接口名相同,本例为 IStudentDao.xml。mapper 中的 namespace 取值也为 Dao 接口的全限定性名
image.png

1.3 定义 MyBatis 主配置文件

在 src 下定义 MyBatis 的主配置文件,命名为 mybatis.xml。
这里有两点需要注意:
(1)主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器来管理了。
(2)这里对 mapper 映射文件的注册,使用标签,即只需给出 mapper 映射文件 所在的包即可。因为 mapper 的名称与 Dao 接口名相同,可以使用这种简单注册方式。这种 方式的好处是,若有多个映射文件,这里的配置也是不用改变的。当然,也可使用原来的 标签方式
image.png

1.4 添加 log4j 日志控制文件

image.png

1.5 修改 Spring 配置文件

A、注册 SqlSessionFactoryBean

image.png

B、使用 MapperFactoryBean 生成 Dao 代理对象

由于使用 Mapper 动态代理方式没有 Dao 实现类,所以 Dao 的实现类对象由代理工厂生 成:MapperFactoryBean 映射工厂 Bean
image.png

C、添加事务配置

image.png

2 支持扫描的 Mapper 动态代理

 前面的方式在动态生成代理时存在一个缺点:MapperFactoryBean 一次只能生成一个代 理对象,即若有多个 dao 接口需要代理对象,则需要配置多个 Mapper 动态代理对象。这将 会使配置文件变得臃肿  <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/513034/1637077761289-33ccb6a8-0925-4f5a-9848-32726f24b5d0.png#clientId=ua7812e1b-d2db-4&from=paste&height=243&id=u411f37ef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=356&originWidth=771&originalType=binary&ratio=1&size=137593&status=done&style=none&taskId=ubb9d3749-5e1f-4ed1-b2c3-df2678ddcc8&width=525.5)<br /> 而支持扫描的 Mapper 动态代理则会避免以上缺点。其会对所配置的基础包中所有的接 口生成 Mapper 动态代理。 <br />项目:spring-mybatis-2。在项目 spring-mybatis-1 上修改。 <br />只需要修改 Spring 配置文件即可。  

2.1 定义 Mapper 扫描配置器 MapperScannerConfigurer

Mapper 扫描配置器 MapperScannerConfigurer 会自动生成指定的基本包中 mapper 的代 理对象。该 Bean 无需设置 id 属性。 当然,此时需要删除 MapperFactoryBean 的配置。
image.png

2.2 向 Service 注入接口名

向 Service 注入 Mapper 代理对象时需要注意,由于通过 Mapper 扫描配置器 MapperScannerConfigurer 生成的 Mapper 代理对象没有名称,所以在向 Service 注入 Mapper 代理时,无法通过名称注入。但可通过接口的简单类名注入,因为生成的是这个 Dao 接口 的对象,这是多态的应用
image.png