mybatis总概览(8)(spring和mybatis整合,dao和mapper自动扫描模式)


1  spring和mybatis整合

1.1     整合思路

需要spring通过单例方式管理SqlSessionFactory。
spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSession。(spring和mybatis整合自动完成)
持久层的mapper都需要由spring进行管理。

1.2     整合环境

创建一个新的java工程(接近实际开发的工程结构)

主要3部分jar包:

1,mybatis3.2.7相关的jar包
2,spring3.2.0相关的jar包
3,mybatis和spring的整合包(mybatis-spring-1.2.2.jar):早期ibatis和spring整合是由spring官方提供,现在mybatis和spring整合由mybatis提供。

全部jar包:

1.3   sqlSessionFactory

在applicationContext.xml配置sqlSessionFactory和数据源(sqlSessionFactory类在mybatis-spring的整合包(mybatis-spring-1.2.2.jar)下。)

 (ps:包括几个内容:1,加载资源标签;2,基础数据源类(BasicDataSource);3,sql会话工厂类(SqlSessionFactoryBean)(和只使用mybatis不是同一个类

<!-- 加载配置文件 -->
    <context:property-placeholder location="classpath:db.properties" />

    <!-- 数据源,使用dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    </bean>

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

1.4    原始dao开发(和spring整合后)

1.4.1     User.xml

在SqlMapconfig.xml中加载User.xml

 

1.4.2     dao(实现类继承SqlSessionDaoSupport)

 

dao接口实现类需要注入SqlSessoinFactory,通过spring进行注入。

这里spring声明配置方式,配置dao的bean:

让UserDaoImpl实现类继承SqlSessionDaoSupport(因为它提供了注入需要的属性(sqlSessionFactory工厂类)的set方法)

1.4.3     配置dao

在applicationContext.xml中配置dao。

 

(ps:dao模式,可以通过注解的方式,省略需要配置多个bean的情况)

1.4.4     测试程序

 

1.5     mapper代理开发

1.5.1     mapper.xml和mapper.java

 

1.5.2     通过MapperFactoryBean创建代理对象

(ps:mapper代理的方式,只定义了接口(自动生成的实现),使用spring框架要想得到代理实现,需要其提供的MapperFactoryBean类得到mapper代理对象)

 

此方法问题:

需要针对每个mapper进行配置,麻烦。

1.5.3     通过MapperScannerConfigurer进行mapper扫描(建议使用)

(ps:注入属性名称用sqlSessionFactoryBeanName而不是sqlSessionFactory是因为这个两个属性赋值的时机是不一样的,
   上面bean那个应该是被动调用执行,当前这个bean是自动扫描
注意:sqlSessionFactoryBeanName要用value而不用ref.

在mybatis-spring1.1.0以前,
是通过<property name="sqlSessionFactory" ref="sqlSessionFactory"/>将SqlSessionFactory对象注入到sqlSessionFactory,
这样做可能会有一个问题,就是在初始化MyBatis时,jdbc.properties文件还没被加载进来,
dataSource的属性值没有被替换,就开始构造sqlSessionFactory类,属性值就会加载失败。

在1.1.0以后,
MapperScannerConfigure提供了String类型的sqlSessionFactoryBeanName,这样将bean name注入到sqlSessionFactoryBeanName,
这样就会等到spring初始化完成后,再构建sqlSessionFactory。

(ps:spring自动扫描mapper接口和对应xml配置,那么mybatis中的对应映射(或者自动扫描包)就可以去掉了)

1.5.4     测试代码

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM