Spring与MyBatis整合
mybatis-spring.jar简介
Spring与MyBatis整合需要引入一个mybatis-spring.jar文件包,该整合包由MyBatis提供,可以从MyBatis官网下载。
mybatis-spring.jar提供了下面几个与整合相关的API
-
SqlSessionFactoryBean
- 为整合应用提供SqlSession对象资源
-
MapperFactoryBean
- 根据指定Mapper接口生成Bean实例
-
MapperScannerConfigurer
- 根据指定包批量扫描Mapper接口并生成实例
SqlSessionFactoryBean
在单独使用MyBatis时,所有操作都是围绕SqlSession展开的,SqlSession是通过SqlSessionFactory获取的,SqlSessionFactory又是通过SqlSessionFactoryBuilder创建生成。
在Spring和MyBatis整合应用时,同样需要SqlSession,mybatis-spring.jar提供了一个SqlSessionFactoryBean。这个组件作用就是通过原SqlSessionFactoryBuilder生成SqlSessionFactory对象,为整合应用提供SqlSession对象。
SqlSessionFactoryBean在applicationContext.xml中定义格式如下
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定连接资源 -->
<property name="dataSource" ref="myDataSource"/>
<!-- 指定映射文件 -->
<property name="mapperLocations" value="classpath:org/tarena/entity/*.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对象。多个包之间可以使用逗号或者分号进行分隔。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.tarena.mapper" />
<bean>
sqlSessionFactory属性可以不用指定,会以Autowired方式自动注入
如果指定的某个包下并不完全是我们定义的Mapper接口,此时使用MapperScannerConfigurer的另外两个属性可以缩小搜索和注册范围,一个是annotationClass,另一个是markerInterface。
annotationClass:用于指定一个注解标记,当指定了annotationClass时,MapperScannerConfiguer将只注册使用了annotationClass注解标记的接口
markeInterface:用于指定一个接口,当指定了markerInterface时,MapperScannerConfigurer将只注册继承自markerInterface的接口
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.tarena" />
<property name="annotationClass" value="org.tarena.annotation.MyBatisRepository"/>
</bean>
上面配置含义:MapperScannerConfigurer自动扫描org.tarena包下所有接口,遇到带@MyBatisRepository标记的将对应MapperFactoryBean对象注册
@MaBatisRepository自定义注解标记代码如下
public @interface MyBatisRepository{
}
SqlSessionTemplate
上述整合完成后,程序可直接使用Spring容器中的Mapper接口实例进行编程。此为mybatis-spring.jar还提供了一个SqlSessionTemplate组件,也可以将该组件对象注入给程序中的DAO,在DAO中利用
SqlSessionTemplata编程。
基于SqlSessionTemplate的DAO示例代码如下
@Repository
public class MyBatisDeptDAO implements DeptDAO{
private SqlSessionTemplate template;
@Autowired
public void setTemplate(SqlSessionTemplate template){
this.template = template;
}
}
public List<Dept> findAll(){
List<Dept> list = template.selectList("findAll");
}
基于SqlSessionTemplate的DAO配置信息如下
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory">
</constructor-arg>
</bean>
<context:component-scan base-package="org.tarena.dao"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
</bean>
Spring整合MyBatis应用
整合步骤介绍
基于SpringMVC和MyBatis技术开发的主要步骤如下
创建工程,搭建SpringMVC和MyBatis技术环境
基于MapperScannerConfigurer方式整合MyBatis的Mapper接口(推荐)
编写和配置SpringMVC的主要组件,例如Controller,HandlerMapping,ViewResolver等
编写JSP视图组件,利用标签和表达式显示模型数据
测试程序
如何搭建SpringMVC和MyBatis技术环境?
创建一个Web工程
-
添加MyBatis相关技术环境
- 引入数据库驱动包和MyBatis开发包
- 引入dbcp连接池开发包
-
添加SpringMVC相关技术环境
- 引入Spring ioc,jdbc,tx等支持的开发包
- 引入Spring webmvc支持的开发包
- 在src下添加applicationContext.xml配置文件
- 在web.xml中配置DispatcherServleet主控制器
引入MyBatis和Spring整合开发包mybatis-spring.jar
如何基于MapperScannerConfigurer方式整合MyBatis的Mapper接口?
- 根据数据表编写实体类
- 编写Mapper映射文件,在XML中添加SQL操作的定义
- 编写Mapper接口,定义SQL操作方法
-
在Spring配置文件中定义以下Bean
- DateSource
- SqlSessionFactoryBean
- MapperScannerConfigurer
测试Spring容器的DAO组件
如何编写和配置SpringMVC的主要组件?
- 编写Controller和请求处理方法
- 配置<mvc:annotation-driven/>,支持@RequestMapping
-
配置Controller组件
- 开启组件扫描,将Controller扫描到Spring容器
- 需要DAO时采用注入方式使用
- 在请求处理方法上使用@RequestMapping指定对应的请求
- 配置ViewResolver组件
在JSP视图组件中如何显示模型数据?
JSP可以使用JSTL标签库,需要引入开发包 jstl(JSP Standard Tag Library)
JSP可以使用EL表达式 EL(Expression Language)
JSP可以使用SpringMVC的表单标签