您的位置:首页 > 编程语言 > Java开发

spring-mybatis如何配置

2017-08-29 17:23 375 查看
前面已经有一篇利用idea整合ssm框架的helloworld入门项目(http://blog.csdn.net/zyf2333/article/details/77623537),这里主要跟着课本把基本配置说明一下。以供参考

1)概述

MyBatis-Spring项目是MyBatis社区自己编写出来的项目,使得MyBatis3能在Spring中使用。因此我们先要去下载MyBatis-Spring的jar包(http://mvnrepository.com/artifact/org.mybatis/mybatis-spring/1.3.1),然后自行添加到运行环境中去

配置MyBatis-Spring分为下面几个部分

配置数据源

配置SqlSessionFactory

配置SqlSessionTemplate

配置Mapper

事务处理

在学习mybatis基础入门时候(http://blog.csdn.net/zyf2333/article/details/77528279)我们知道了,要构建SqlSessionFactory对象,让它来产生SqlSession,而在MyBatis-Spring项目中是通过SqlSessionTemplate来实现的,它提供了对SqlSession的封装。所以通过SqlSessionTemplate可以得到Mapper。下面开始配置

2)配置SqlSessionFactory

SqlSessionFactory作用就是生产SqlSession。而MyBatis-Spring项目提供了org.mybatis.springSqlSessionFactoryBean类给我们配置。一般而言,我们要给出两个参数,一个是数据源,一个是mybatis的配置文件路径,这样SpringIOC容器就会初始化这个SqlSessionFactoryBean,解析MyBatis配置文件并连同数据源一同保存在SpringBean里面,接下来看看配置的代码清单:

配置SqlSessionFactory:(applicationContext.xml)

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<!-- MySQL中有个example数据库 -->
<value>jdbc:mysql://localhost:3306/example</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value><!-- 写上你自己的MySQL的密码 --></value>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean>


sqlMapConfig.xml(和applicationContext.xml在同一目录下)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//iBATIS.com//DTD SQL Map Config 3.0//EN"
"mybatis-3-config.dtd" >
<configuration>

<!-- 这些settings一般用不到,现阶段写出来知道就好了。主要还是写别名和指定映射器路径 -->
<settings>
<!-- 这个配置使全局的映射器启用或者禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许jdbc支持生成的键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认执行器。SIMPLE执行器没什么特别的,REUSE执行器重用预处理语句,BATCH执行器重用语句和批量更新 -->
<setting name="defaultExecutorType" value="REUSE" />
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置超时时间,单位是毫秒 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>

<!-- 别名配置 -->
<typeAliases>
<typeAlias alias="role" type="com.mkyong.common.po.Role" />
</typeAliases>

<!-- 指定映射器路径 -->
&l
4000
t;mappers>
<mapper resource="com\mkyong\common\po\role.xml" />
</mappers>
</configuration>


到此SqlSessionFactory配置完成。总的来说其实变化不是很大,就是mybatis基础配置文件中配置数据库的部分放入了spring的配置文件中,然后这个spring的配置文件引用了mybatis的基本配置文件

3)配置SqlSessionTemplate

SqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate)是个模板类,通过调用SqlSession来完成工作,所以在MyBatis-Spring项目中它是核心。有两种构建它的方法,一种是只有一个SqlSessionFactory作为参数;另一种是有2个参数(SqlSessionFactory和执行器类型)。接下来看看代码:

方法一,使用SqlSessionFactory

//该代码接着上面的spring的配置文件
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>


方法二,使用两个参数构建

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"
scope="prototype">
<constructor-arg index="0" ref="sqlSessionFactory" />
<constructor-arg index="1" value="BATCH" />
</bean>


通过这些配置就意味着Spring会把我们之前配置的SqlSessionFactory设置到SqlSessionTemplate中(感觉就是SqlSessionFactory创建出来就是专门为了让SqlSessionTemplate合并的)。

接下来通过Mapper来看看SqlSessionTemplate是如何使用的

4)配置Mapper

按照课本的说法,在代码中,大部分场景不建议使用SqlSessionTemplate或者SqlSession的方式,这里我们采用Mapper接口编程的方式,让SqlSessionTemplate在开发过程中“消失”,这样更符合面向对象,也更容易理解

4.1 MapperFactoryBean

在mybatis中,Mapper只需要是一个接口即可,它是由MyBatis体系通过动态代理的形成生成代理对象去运行的,所以Spring也没有办法为其生成实现类。为了处理这个问题,MyBatis-Spring提供了MapperFactoryBean作为中间。我们通过它来配置想要的Mapper。主要有以下三个参数

mapperInterface:制定接口,当我们的接口继承了配置的接口,那么MyBatis就认为它是个Mapper

SqlSessionFactory:当SqlSessionTemplate未配置时候,MyBatis-Spring才会去设置它。

SqlSessionTemplate:注入DAO中,当它设置时候,SqlSessionFactory将被作废,如代码所示

<bean id="userDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- UserDAO接口将被扫描为Mapper,上面创建的sqlSessionTempalte也引用了 -->
<property name="mapperInterface" value="com.dao.UserDAO"/>
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>


4.2 MapperScannerConfigurer

一个复杂的系统中存在很多DAO,不仅仅UserDAO,还有角色的RoleDAO,产品的ProductDAO,如果一个个配置,工作量很大。MyBatis-Spring处理了这种状况,采用自动扫描的形式来配置我们的映射器,这样可以在很少的代码情况下完成对映射器的配置

在MyBatis-Spring项目中,采用的是MapperScannerConfigurer。它有下面几个属性

basePackage:指定让Spring自动扫描什么包

annotationClass:表示如果类被这个注解标识的时候,才进行扫描

sqlSessionFactoryBeanName:指定Spring中定义sqlSessionFactory的bean名称,如果被定义,sqlSessionFactory将不起作用

sqlSessionTemplateBeanName:类似上面一条

markerInterface:指定是实现了什么接口就认为它是Mapper。我们需要提供一个公共的接口去标记。在Spring配置前需要给DAO一个@Repository注解

比如

import org.springframework.stereotype.Repository;
@Repository
public interface UserDAO {
...
}


然后在Spring中配置它

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.learn.dao" />
<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate" />
<property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
</bean>


这样Spring上下文就会自动扫描com.learn.dao来找到@Repository注解的接口,自动生成Mapper,从而无需多余的配置

5)配置事务

学Spring时候我们就是用的AOP,此处也一样。它分为声明式事务和编程式事务。主流是声明式事务。此处看简单举例

<!--事务管理器-->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--使用声明式事务管理器-->
<tx:annotation-driven transaction-manager="txManager" />


这时候我们需要业务层,通过spring扫描配置,代码如下

<context:component-scan base-package="com">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>


这样Spring会自动扫描这些Service对象的bean读取到上下文中。MyBatis的事物就交给Spring控制,我们只需要在Spring中通过注解注入即可,如下

@Service("userService")
public class UserServiceImpl implements UserService{
...
@Autowired
private UserDAO userDAO;//注解注入userDAO
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mybatis