Spring 集成 MyBatis
11 Spring 集成 MyBatis
把mybatis框架和spring集成在一起,向一个框架一样使用。
用的技术是:ioc 。
为什么ioc能把mybatis和spring集成在一起,像一个框架, 是因为ioc能创建对象。可以把mybatis框架中的对象交给spring统一创建, 开发人员从spring中获取对象。开发人员就不用同时面对两个或多个框架了, 只需面对一个spring框架。
将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring来管理。所以,该整合,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理。
Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插 上 mybatis,两个框架就是一个整体。
11.1 mybatis使用步骤
mybatis使用步骤,对象:
- 定义
dao接口 ,StudentDao - 定义
mapper文件StudentDao.xml - 定义
mybatis的主配置文件mybatis.xml - 创建
dao的动态代理对象,StudentDao dao = SqlSession.getMapper(StudentDao.class); - 调用
dao的selectStudents方法查询数据库:List<Student> students = dao.selectStudents();
要使用dao对象,需要使用getMapper()方法,怎么能使用getMapper()方法,需要哪些条件?
- 获取
SqlSession对象——需要使用SqlSessionFactory的openSession()方法; - 故需要创建
SqlSessionFactory对象——通过读取mybatis的主配置文件,能创建SqlSessionFactory对象。
(需要SqlSessionFactory对象, 使用Factory能获取SqlSession,有了SqlSession就能调getMapper方法得到dao,通过dao对象调用dao接口中的方法)
Factory创建需要读取主配置文件,in是主配置文件xml:



spring会创建SqlSessionFactory对象,通过SqlSessionFactory对象获取SqlSession对象,SqlSession对象使用getMapper()方法创建dao对象。
另外,我们会使用独立的连接池类替换mybatis默认自己带的连接池, 把连接池类也交给spring创建。
主配置文件:
- 数据库信息
<environment id="mydev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库的驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接数据库的url字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
<!--访问数据库的用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="xzx"/>
</dataSource>
mapper文件的位置
<mappers>
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
<!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
</mappers>
通过以上的说明,我们需要让spring创建以下对象:
- 独立的连接池类的对象, 使用阿里的
druid连接池; SqlSessionFactory对象;- 创建出
dao对象;
需要学习就是上面三个对象的创建语法,使用xml的bean标签。
11.2 思考:mapper.xml和mybatis.xml文件的作用
Mapper顾名思义就是“映射”的意思,Mapper文件就是MyBatis中SQL语句的配置文件,其会在运行时加载SQL语句并映射相应参数。
在MyBatis的全局配置文件SqlMapConfig.xml(mybatis.xml),其中就有mapper文件的资源路径的配置。
因为创建SqlSessionFactory时会加载全局配置文件mybatis.xml,这说明Mapper映射文件在会话(Session)创建开始就被加载了,所以在整个工程的运行期间,Mapper映射文件有着举足轻重的作用。

11.3 spring和mybatis的集成步骤
ch07-spring-mybatis:spring和mybatis的集成

步骤:
-
新建
maven项目 -
加入
maven的依赖
1)spring依赖
2)mybatis依赖
3)mysql驱动
4)spring的事务的依赖
5)mybatis和spring集成的依赖:mybatis官方体用的,用来在spring项目中创建mybatis的SqlSesissonFactory,dao对象的


-
表:

-
创建实体类

-
创建
dao接口和mapper文件


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

-
创建
Service接口和实现类,属性是dao。(通过service调用dao)

-
创建
spring的配置文件:声明mybatis的对象交给spring创建
1)数据源DataSource
使用JDBC模板,首先需要配置好数据源,数据源直接以Bean的形式配置在Spring配置文件中。根据数据源的不同,其配置方式不同:
Druid 数据源 DruidDataSource
Druid 是阿里的开源数据库连接池。是 Java 语言中最好的数据库连接池。Druid 能够提供强大的监控和扩展功能。Druid 与其他数据库连接池的最大区别是提供数据库的
官网:https://github.com/alibaba/druid。
使用地址:https://github.com/alibaba/druid/wiki/常见问题。
配置连接池:

Spring 配置文件:

<!--声明数据源DataSource, 作用是连接数据库的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!--set注入给DruidDataSource提供连接数据库信息 -->
<!-- 使用属性配置文件中的数据,语法 ${key} -->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passwd}" />
<property name="maxActive" value="${jdbc.max}" />
</bean>
当Spring启动后,会创建DruidDataSource这个类的对象,然后DruidDataSource这个类的对象会读取url、username、password、maxActive属性创建Connection对象(创建好的Connection对象存在于Spring容器中),进而访问数据库。
2)SqlSessionFactory

mybatis中创建sqlsessionFactory对象,需要读取mybatis主配置文件的数据库信息、mapper文件信息:

而在spring中,同样需要数据库信息、mapper文件信息。
连接数据库的信息在applicationContext.xml:

mapper文件在mybatis.xml:

这俩加起来等同于原来mybatis的主配置文件。
spring容器在读取applicationContext.xml时,扫描文件中的bean,就把sqlSessionFactory、DruidDataSource对象创建好了。
3) Dao对象
Mapper扫描配置器 MapperScannerConfigurer 会自动生成指定的基本包中 mapper 的代理对象。该 Bean 无需设置 id 属性。basePackage 使用分号或逗号设置多个包。
创建dao对象需要sqlSession(sqlSessionFactory能提供),还需要接口名字StudentDao.class(StudentDao所在的包能提供),故要注入sqlSessionFactory(这样就能通过spring容器,找到sqlSessionFactory对象,赋给属性sqlSessionFactoryBeanName)、指定包名。
spring通过sqlSessionFactory得到sqlSession对象,MapperScannerConfigurer会扫描这个包中的所有接口,通过sqlSession对象把每个接口都执行一次getMapper()方法,得到每个接口的dao对象。要使用这个dao对象,直接getBean反射即可。



4)声明自定义的service
ref引用的是上一步获得的DAO对象:



- 创建测试类,获取
Service对象,通过service调用dao完成数据库的访问。


- 补充:从属性文件读取数据库连接信息
为了便于维护,可以将数据库连接信息从Spring 配置文件分离出来,写入到属性文件中,使Spring 配置文件从中读取数据。
属性文件名称自定义,但一般都是放在 src 下。

Spring配置文件从属性文件中读取数据时,需要在<property/>的 value 属性中使用${ },将在属性文件中定义的 key 括起来,以引用指定属性的值。
<!--
把数据库的配置信息,写在一个独立的文件,编译修改数据库的配置内容
spring知道jdbc.properties文件的位置
-->
<context:property-placeholder location="classpath:jdbc.properties" />
<!--声明数据源DataSource, 作用是连接数据库的-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!--set注入给DruidDataSource提供连接数据库信息 -->
<!-- 使用属性配置文件中的数据,语法 ${key} -->
<property name="url" value="${jdbc.url}" /><!--setUrl()-->
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.passwd}" />
<property name="maxActive" value="${jdbc.max}" />
</bean>



以后不需要getMapper()来获取dao对象,spring容器给你自动创建好了(内部通过MapperScannerConfigurer扫描指定包的接口类,然后sqlsession.getMapper()来创建dao对象),只需读取applicationContext配置文件,并创建该文件的类对象ctx,通过类对象ctx调用getbean()方法即可获得dao对象。

11.4 小结












