1.mybatis和spring整合的思路
1.让spring管理SqlSessionFactory
2.让spring管理mapper对象和dao
使用spring和mybatis整合开发mapper代理及原始dao接口。
自动开启事务,自动管理sqlsession
3.让spring管理数据源(即数据库连接池)
2.准备工作
2.1创建整合工程
新建项目,拷贝前一天所建mybatis的项目,现在的项目结构为:
2.2.导入jar包
1.mybatis3.x本身的jar包
2.数据库驱动包
3.spring3.xjar包
4.spring和mybatis的整合包:从mybatis官方下载mybatis-spring-1.2.2.jar
2.3.SqlMapConfig.xml
mybatis的配置文件:设置别名、mappers。如下
mybatis和spring整合后,mybatis配置文件中的<mappers>
标签便可以去掉,因为我们在spring配置文件中进行对mapper的配置;别名配置标签<typeAliases>
也可以去掉,因为我们也可以在spring配置文件中对pojo全限定性类名的别名进行配置。
2.4.applicationContext.xml
spring配置文件中需要配置的内容有:1.数据源(用的是dbcp连接池,数据库的连接配置写在src路径下的db.properties文件中)。2.SqlSessionFactory。3.mapper或dao。如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 1.加载数据库的配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 2.配置数据库连接池 -->
<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="maxIdle" value="5" />
</bean>
<!-- 3.配置SqlsessionFactory,引入的是mybatis和sqlsession整合包下的SqlSessionFactoryBean类 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 下面才是mybatis和spring整合最重要的步骤:a.注入数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- b.mybati全局s配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
</bean>
<!-- 4.配置mapper
MapperFactoryBean:用于生成mapper代理对象
-->
<!--<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!--<property name="mapperInterface" value="mapper.UserMapper"/>-->
<!--<property name="sqlSessionFactory" ref="sqlSessionFactory"/>-->
<!--</bean>-->
<!--
MapperScannerConfigurer:mapper的扫描器,将包下边的mapper接口自动创建代理对象,
自动创建到spring容器中,bean的id是mapper的类名(首字母小写)
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置扫描包的路径
如果要扫描多个包,中间使用半角逗号分隔
要求:Mapper.java与Mapper.xml文件在同一个目录下
-->
<property name="basePackage" value="mapper"/>
<!-- 使用sqlSessionFactoryBeanName -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
到此处,我们便完成了mybatis与spring的整合,接下来便可以进行测试了。从整合后的mybatis配置文件和spring的配置文件来来,整合后的mybatis配置文件中的内容基本都被移到了spring的配置文件中。
3.整合开发原始dao接口
3.1配置SqlSessionFactory
在applicationContext.xml中配置SqlSessionFactory,为上图的:
3.2开发原始dao
将dao接口的实现类UserDaoImpl.java继承SqlSessionDaoSupport.java,该父类中有属性的set方法并已经声明SqlSessionFactory对象,所以我们在UserDaoImpl.java中只需要写如下代码:
然后需要在spring配置文件中配置dao:
测试:
控制台中成功打印出结果:
4.整合开发mapper代理方法
首先在mapper包下创建UserMapper.java和UserMapper.xml文件,利用mybatis和spring整合开发mapper的方式有两种。
4.1使用MapperFactoryBean
该类是整合jar包下的一个类,它的内部已经继承SqlSessionDaoSupport类,首先我们需要在spring配置文件中进行Mapper对象的配置:
然后便可以进行测试:
这样就完成了对mapper的开发,使用这种方式的缺点就是对于项目中的每个mapper我们都需要配置上述内容,比较繁琐。接下来看看下面这种开发mapper代理的方式。
4.2使用MapperScannerConfigurer(扫描mapper)
该类同样是整合jar包中的一个类。在spring配置文件中加入如下配置:
然后进行测试:同样正常运行。
使用这种方式的优点:使用扫描器自动扫描mapper,生成代理对象比较方便。
5.出现异常总结
使用MapperFactoryBean的方式不会报错,但是使用这样扫描包的方式,上述代码我完全是照搬的教程代码,可是运行时会出现org.springframework.beans.factory.BeanDefinitionStoreException
的报错。
出现这个异常的原因你不用多想,绝对是因为你的spring 版本与开发工具的jdk版本不兼容!之前在单独开发spring框架中使用到<content:component-scan base-package="包名"
注解扫描声明整个pojo包下的类时也出现了这个错误,那时候我将spring3.x.jar包换成spring4.x.jar包后成功解决,因为我的开发工具IDEA默认jdk版本是1.8,所以我要升级jar包版本才能实现兼容。
整合spring和mybatis时又出现了这个错误!所以这里我决定像之前那样将spring3.x换成sring4.x,可是我已经导入的jar包太多太多实在分不清了,经过很多的轮回换jar包后又出现了更多的异常。我为这个异常真是头疼了几天几夜,经过几天的不断研究找资料才发现原因是因为我用的spring 3.x的jar包,与IDEA的jdk1.8不兼容,解决方法有两种:
- 1.将jdk版本调为1.7,我用的开发工具为IDEA,它默认下的JDK使用1.8版本,所以我需要在三个地方将jdk的版本改过来(前提是你已经下载了jdk1.7版本),修改IDEA配置中Project的jdk版本、Modules的jdk版本、SDKs的版本,如果你用到leTomcat还需要修改Tomcat配置的jdk版本。这样jdk1.7与spring3.x才兼容。
- 2.将spring3.x.jar换成spring4.x.jar包。这种方式比较繁琐,建议大家使用第一种方式。spring4.x与jdk1.8才兼容。
写到这里,我们便成功的完成了spring3.x与mybatis3.x的整合。整合完后我们便可以从mybatis的配置文件中删掉对mapper的配置了,因为我们已经在spring配置文件中用mapper扫描器对mapper进行了配置。
2018.3.19更
欢迎加入我的Java交流1群:659957958。
2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。
6.联系
If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.