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 小结