【MyBatis学习14】MyBatis和Spring整合

本文博客地址:http://blog.csdn.net/soonfly/article/details/64495909 (转载请注明出处)

MyBatis和Spring整合可以有很多种方式,只要明白几个重要的类,就能随心所欲整合了。

导入包
我们可以从Mybatis官网上下载Mybatis-Spring的jar包添加到我们项目的类路径下。
当然不要忘记添加Mybatis的相关jar包和Spring的相关jar包。
(点击下载相关包)

接下来要在Spring的applicationContext.xml配置文件中进行主要类的配置

一、SqlSessionFactoryBean

我们知道在Mybatis的所有操作都是基于SqlSession的。SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。
Mybatis-Spring包(org.mybatis.spring)封装了一个SqlSessionFactoryBean,在这个bean里面也是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。
这里写图片描述
所以无论哪种方式,第一步必须配置SqlSessionFactoryBean (首先还得配置数据源)

<!-- 加载db.properties数据库连接信息 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
   <property name="driverClassName" value="${driver}" />
   <property name="url" value="${url}" />
   <property name="username" value="${username}" />
   <property name="password" value="${password}" />
   <!-- 初始化连接大小 -->
   <property name="initialSize" value="${initialSize}" />
   <!-- 连接池最大数量 -->
   <property name="maxActive" value="${maxActive}" />
   <!-- 连接池最大空闲 -->
   <property name="maxIdle" value="${maxIdle}" />
   <!-- 连接池最小空闲 -->
   <property name="minIdle" value="${minIdle}" />
   <!-- 获取连接最大等待时间 -->
    <property name="maxWait" value="${maxWait}" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 加载mybatis的全局配置文件 -->
    <property name="configLocation" value="classpath:SqlMapConfig.xml" />
    <!-- 加载数据源 -->
    <property name="dataSource" ref="dataSource" />
</bean>

除了必填的dataSource属性外,还有几个重要属性:

configLocation:指定Mybatis的配置文件位置,并以该配置信息构建SqlSessionFactoryBuilder。后续属性指定的内容会覆盖该配置文件里面指定的对应内容。

mapperLocations:指定Mapper配置文件位置,批量载入。当Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。同mybatis配置中的<mappers>作用。

typeAliasesPackage:指定实体POJO类所在的包,并取类名作为别名。多个package之间可以用逗号或者分号等来进行分隔。同mybatis配置中的<typeAliases>作用。

typeAliases:数组类型。用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名。类上标注@Alias注解,将优先使用注解。同mybatis配置中的<typeAliases>作用。

<property name="typeAliases">  
    <array>  
        <value>twm.mybatisdemo.pojo.User</value>  
        <value>twm.mybatisdemo.pojo.Order</value>  
    </array>  
</property>  

plugins:数组类型,用来指定Mybatis的Interceptor。
typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。
typeHandlers:数组类型,表示TypeHandler。

有了上面这些参数,可以发现,原来SqlMapConfig.xml的配置全都可以在SqlSessionFactoryBean的属性中完成。

二、MapperFactoryBean

我们已经完成通过Mybatis-Spring包(org.mybatis.spring)中的SqlSessionFactoryBean获取Sqlsession了。
接下来,就要获取Mapper对象进行业务开发了。
在Spring的applicationContext文件中定义Mapper对象,是通过Mybatis-Spring包中MapperFactoryBean类实现的

<bean id="UserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="twm.mybatisdemo.mapper.UserMapper" />
    <!-- 上面定义的sqlSessionFactory -->
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

有两个属性需要我们注入:sqlSessionFactorymapperInterface(对应的Mapper接口)
定义好后,spring容器已经接管UserMapper对象,这时可以开始业务逻辑的编写了:

public static void main(String[] args) throws Exception {
    ApplicationContext context = 
               new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    UserMapper usermp = context.getBean(UserMapper.class);
    System.out.println(usermp.selectAll().size());
}

一切OK!成功
很简单的配置,只需两个类搞定整合。当然,我们还要继续探讨。

三、MapperScannerConfigurer

利用上面的方法进行整合的时候,我们要一个一个的定义MapperFactoryBean来生成Mapper对象。如果mapper数量一多就傻了。
为此Mybatis-Spring为我们提供了一个叫做MapperScannerConfigurer的类,这个会自动为我们注册Mapper对应的MapperFactoryBean对象。
多个包之间可以使用逗号或者分号进行分隔。
因此,可以直接把上面那段org.mybatis.spring.mapper.MapperFactoryBean的定义删掉,改用:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="twm.mybatisdemo.mapper" />
</bean>

如果要缩小搜索和注册范围:
annotationClass:当指定了annotationClass的时候,只有使用annotationClass注解标记的接口才会被注册。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="twm.mybatisdemo.mapper" />
   <property name="annotationClass" value="twm.mybatisdemo.mapper.testannotation"/>
</bean>

markerInterface:markerInterface用于指定一个接口的,当指定了markerInterface之后,MapperScannerConfigurer将只注册继承自markerInterface的接口。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="twm.mybatisdemo.mapper" />
   <property name="markerInterface" value=""twm.mybatisdemo.mapper.baseMapper"/>
</bean>

如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。也就是接口需要同时满足上述两个条件

sqlSessionFactoryBeanName:用于指定选择一个sqlSessionFactory对象。如果在前面定义了多个sqlSessionFactory,这里不指定的话,系统会出错,不知道使用哪个,所以必须指定一个。如果整个配置中只有一个sqlSessionFactory,就可以不用指定。

四、SqlSessionTemplate

上面都是针对Mapper接口(含用注解实现的接口)的配置。
在使用mybatis进行业务层开发中,我们还有一种不使用Mapper接口的方式,而是直接用sqlsession访问Mapper配置文件,在《【MyBatis学习03】调用Mapper映射的3种使用方式》可以看到:

SqlSession session = SqlSessionAssist.getSession();
session.insert("twm.mybatisdemo.mapper.User2Mapper.insert",aPerson);

因此,我们需要在代码中直接获取Sqlsession对象。
Mybatis-Spring为我们提供了一种直接使用SqlSession的方式,就是一个实现了SqlSession接口的SqlSessionTemplate类(它是线程安全的,可以被多个Dao同时使用)。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

然后我们在业务层调用:

ApplicationContext context = 
               new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
SqlSession session = context.getBean("sqlSession",SqlSession.class);
User userEntity=session.selectOne("twm.mybatisdemo.mapper.UserMapper.selectById",86);
System.out.println(userEntity.getUsername());

五、SqlSessionDaoSupport类

这一个不是配置,而是一个类。

如果继承该类的都可以通过this.getSqlSession()获取到SqlSession,进而进行业务操作。
它是一个抽象类,本身使用场景就是作为 DAO 的基类来使用的。它需要一个 SqlSessionTemplate 或一个 SqlSessionFactory ,若两者都设置了,则 SqlSessionFactory 会被忽略(实际上它接收了 SqlSessionFactory 后也会利用 SqlSessionFactory 创建一个 SqlSessionTemplate )。

public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    if (!this.externalSqlSession) {
        this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
    }
}

public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
    this.sqlSession = sqlSessionTemplate;
    this.externalSqlSession = true;
}

这样,我们在子类中就能通过调用 SqlSessionDaoSupport 类的 getSqlSession() 方法来获取这个 SqlSessionTemplate 对象。

来看一个例子:
映射器接口:

interface UserDaoService{
    public User selectUserById(int id);
}

DAO层:

class UserDaoServiceImpl extends SqlSessionDaoSupport implements User{
    SqlSession session;
    UserDaoServiceImpl(){
        session=this.getSqlSession();
    }

    public User selectUserById(int id){
        User userEntity = session.selectOne(
                "twm.mybatisdemo.mapper.UserMapper.selectById", id);
        return userEntity;
    }
}

Mapper配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="twm.mybatisdemo.mapper.UserMapper">
    <select id="selectById" parameterType="int" resultType="User" useCache="true">
        select * from user where id=#{id}  
    </select>
</mapper>

applicationContext.xml配置:

<bean id="userDaoServiceImpl" class="twm.mybatisdemo.DaoImpl.UserDaoServiceImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

本文博客地址:http://blog.csdn.net/soonfly/article/details/64495909 (转载请注明出处)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值