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 测试代码