Spring与MyBatis整合应用
mybatis-spring.jar简介
Spring与Mybatis整合需要引入一个mybatis-spring.jar文件包,该整合包由MyBatis提供,可以从MyBatis官网下载。
mybatis-spring.jar提供了下面几个与整合相关的API
(1)SqlSessionFactoryBean
为整合应用提供SqlSession对象资源
(2)MapperFactoryBean
根据指定Mapper接口生成Bean
(3)MapperScannerConfigurer
根据指定包批量扫描Mapper接口并生成实例
SqlSessionFactoryBean
在单独使用MyBatis时,所有操作都围绕SqlSession展开,SqlSession是通过SqlSessionFactory获取的,SqlSessionFactory又是通过SqlSessionFactoryBuilder创建生成。
在spring和MyBatis整合应用时,同样需要SqlSession,mybatis-spring.jar提供一个SqlSessionFactoryBean.这个组件作用就是通过原SqlSessionFactoryBuilder生成SqlSessionFactory对象,为整合应用提供SqlSession对象。
SqlSessionFactoryBean在applicationContext.xml中定义格式如下:
<!-- 定义SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定连接资源 --> <property name="dataSource" ref="myDataSource"/> <!-- 指定映射文件 --> <property name="mapperLocations" value="classpath:org/web/sql/*.xml"/> </bean>
通过SqlSessionFactoryBean还可以定义一些属性来指定MyBatis框架的配置信息。在定义SqlSessionFactoryBean时,可以使用以下常用属性:
dataSource:用于指定连接数据库的数据源(必要属性)。
mapperLocations:用于指定Mapper文件存放的位置。
configLocation:用于指定Mybatis的配置文件位置。如果指定了该属性,那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder,但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。
typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名
MapperScannerConfigurer
在使用MapperFactoryBean时,有一个Mapper就需要定义一个对应的MapperFactoryBean.当Mapper比较少时可以,但遇到大量Mapper时就需要使用mybatis-spring.jar提供的MapperScannerconfigurer组件,通过这个组件会自动扫描各个Mapper接口,并注册对应的MapperFactoryBean对象。
在定义MapperScannerConfigurer时,只需要指定一个basePackage即可。basePackage用于指定Mapper接口所在的包,在这个包及其所有子包下面的Mapper接口都将被搜索到,并把他们注册为一个个MapperFactoryBean对象。多个包之间可以使用逗号或者分号进行分隔。
<!-- 定义MapperScannerConfigurer组件,这个组件会自动扫描各个Mapper接口, 并注册对应的MapperFactoryBean对象--> <!-- basePackage用于指定Mapper接口所在的包,在这个包及其所以的子包下面的Mapper接口都将被搜索到,并把他们注册为一个MapperFactoryBean对象 --> <!-- sqlSessionFactory属性可以不用指定,会以Autowired方式自动注入 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.web.dao"/> </bean>
如果指定的某个包下并不完全是我们定义的Mapper接口,此时使用MapperScannerConfigurer的另外两个属性可以缩小搜索和注册范围,一个是annotationClass 另一个是markerInterface.
annotationClass:用于指定一个注解标记,当指定了annotationClass时,MapperScannerConfigurer将只注册使用了annotationClass注解标记的接口
markerInterface:用于指定一个接口,当指定了markerInterface时,MapperScannerConfigurer将只注册继承自markerInterface的接口。
<!-- 定义MapperScannerConfigurer组件,这个组件会自动扫描各个Mapper接口, 并注册对应的MapperFactoryBean对象--> <!-- basePackage用于指定Mapper接口所在的包,在这个包及其所以的子包下面的Mapper接口都将被搜索到,并把他们注册为一个MapperFactoryBean对象 --> <!-- sqlSessionFactory属性可以不用指定,会以Autowired方式自动注入 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.web.dao"/> <!-- MapperScannerConfigurer自动扫描 org.web.dao包下所以接口, 遇到带有@MyBatisRepository标记的将对应MapperFactoryBean对象注册--> <property name="annotationClass" value="org.web.dao.annotation.MyBatisRepository"/> </bean>
SqlSessionTemplate
上述整合完成后,程序直接使用spring容器中的Mapper接口实例进行编程。此外mybatis-spring.jar还提供了一个SqlSessionTemplate组件,也可以将该组件对象注入给程序中的DAO,在DAO中利用SqlSessionTemplate编程。
基于SqlSessionTemplate的DAO示例代码如下:
package test; import java.util.List; import java.util.Map; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.web.dao.CostDao; import org.web.entity.Cost; @Repository public class MyBatisCostDAO implements CostDao { private SqlSessionTemplate template; @Autowired public void setTemplate(SqlSessionTemplate template){ this.template=template; } public List<Cost> findAll() { List<Cost> list=template.selectList("findAll"); return list; } }
基于SqlSessionTemplate的DAO配置信息如下:
<!-- 定义SqlSessionTemplate组件,该组件是由mybatis-spring.jar提供,可以将该组件对象注入给程序中的DAO,在DAO中利用SqlSessionTemplate编程 --> <bean id="sqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg> </bean> <!-- 扫描Dao并注入template --> <context:component-scan base-package="org.web.dao"/> <!-- 定义SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 指定连接资源 --> <property name="dataSource" ref="myDataSource"/> <!-- 指定映射文件 --> <property name="mapperLocations" value="classpath:org/web/sql/*.xml"/> </bean>
Spring与MyBatis整合步骤
基于springMVC和MyBatis技术开发的主要步骤如下:
(1)创建工程,搭建SpringMVC和MyBatis技术环境
(2)基于MapperScannerConfigurer方式整合MyBatis的Mapper接口(推荐使用)
(3)编写和配置SpringMVC的主要组件,例如Controller,HandlerMapping,ViewResolver等
(4)编写JSP视图组件,利用标签和表达式模型数据
(5)测试程序
如何搭建SpringMVC和MyBatis技术环境?
(1)创建一个web工程
(2)添加MyBatis相关技术环境
-----引入数据库驱动包和MyBatis开发包
-----引入dbcp连接池开发包
(3)添加SpringMVC相关技术环境
-----引入Spring ioc,jdbc,tx等支持的开发包
-----引入Spring webmvc支持的开发包
-----在src下添加applicationContext.xml配置文件
-----在web.xml中配置DispatcherServlet主控制器
(4)引入MyBatis和Spring整合开发包mybatis-spring.jar
如何基于MapperScannerConfigurer方式整合MyBatis的Mapper的接口?
(1)根据数据表编写实体类
(2)编写Mapper映射文件,在XML中添加SQL操作的定义
(3)编写Mapper接口,定义SQL操作方法
(4)在Spring配置文件中定义以下Bean
DataSource
SQLSessionFactoryBean
MapperScannerConfigurer
(5)测试Spring容器的DAO组件
如何编写和配置SpringMVC的主要组件?
(1)编写controller和请求处理方式
(2)配置<mvc:annotation-driven/>,支持@RequestMapping
(3)配置Controller组件
---开启组件扫描,将Controller扫描到Spring容器
---需要DAO时采用注入方式使用
---在请求处理方法上使用@RequestMapping指定对应的请求
(4)配置ViewResolver组件
JSP视图组件如何显示模型数据?
(1)JSP可以使用JSTL标签库,需要引入开发包
(2)JSP可以使用EL表达式
(3)JSP可以使用SpringMVC的表单标签