Spring与Mybatis配置问题

Spring和Mybatis的整合,主要借助于Spring的依赖注入和控制反转来简化Mybatis的配置,使用两个配置文件【注:此种配置文件网上已经有很多】

spring.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 6             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
 7             http://www.springframework.org/schema/context    
 8             http://www.springframework.org/schema/context/spring-context-3.1.xsd">
 9     
10     <context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="NEVER"/>
11     <!-- 自动扫描 -->
12     <context:component-scan base-package="com.zhu.test.service"></context:component-scan>        
13 </beans>

配置很简单,先使用<context:property-placeholder/>标签引入外部资源文件,再采用包扫描的方式加载com.zhu.test.service包下的所有类,因为其中的业务逻辑类使用了Spring注解,Spring会将其封装成bean供使用。

spring-mybatis.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" 
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:tx="http://www.springframework.org/schema/tx"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:context="http://www.springframework.org/schema/context"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 8             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
 9             http://www.springframework.org/schema/tx 
10             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
11             http://www.springframework.org/schema/context    
12             http://www.springframework.org/schema/context/spring-context-3.1.xsd 
13             http://www.springframework.org/schema/aop 
14             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
15     
16     <!-- 配置数据源 -->
17     <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
18         <!-- <property name="driverClassName" value="${driver}" /> -->
19         <property name="url" value="${url}" />
20         <property name="username" value="${username}" />
21         <property name="password" value="${password}" />
22         <!-- 初始化时建立物理连接的个数 -->
23         <property name="initialSize" value="0" />
24         <!-- 最大连接池数量 -->        
25         <property name="maxActive" value="20" />    
26         <!--minIdle: 最小空闲连接-->   
27         <property name="minIdle" value="0" />
28         <!-- 获取连接时最大等待时间 -->        
29         <property name="maxWait" value="60000" />
30         <!-- 用来检测连接是否有效的sql,要求是一个查询语句 -->
31         <property name="validationQuery" value="${validationQuery}" />
32         <!-- 是否申请连接时执行validationQuery检测连接是否有效 -->
33         <property name="testOnBorrow" value="false" />
34         <property name="testOnReturn" value="false" />
35         <property name="testWhileIdle" value="true" />
36         <property name="timeBetweenEvictionRunsMillis" value="60000" />
37         <property name="minEvictableIdleTimeMillis" value="25200000" />
38         <property name="removeAbandoned" value="true" />
39         <property name="removeAbandonedTimeout" value="1800" />
40         <property name="logAbandoned" value="true" />
41         <property name="filters" value="mergeStat" />
42     </bean>
43     
44     <!-- <context:annotation-config></context:annotation-config>  --> 
45     
46     <bean >
47         <property name="dataSource" ref="dataSource" />
48         <property name="mapperLocations" value="classpath:com/zhu/test/mapping/*.xml" />
49     </bean>
50     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
51         <property name="basePackage" value="com.zhu.test.dao" />
52         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 
53     </bean>    
54     
55     <bean >
56         <property name="dataSource" ref="dataSource" />
57     </bean>
58     <tx:advice >
59         <tx:attributes>
60             <tx:method name="add*" propagation="REQUIRED" />
61             <tx:method name="append*" propagation="REQUIRED" />
62             <tx:method name="insert*" propagation="REQUIRED" />
63             <tx:method name="save*" propagation="REQUIRED" />
64             <tx:method name="update*" propagation="REQUIRED" />
65             <tx:method name="modify*" propagation="REQUIRED" />
66             <tx:method name="edit*" propagation="REQUIRED" />
67             <tx:method name="delete*" propagation="REQUIRED" />
68             <tx:method name="remove*" propagation="REQUIRED" />
69             <tx:method name="repair" propagation="REQUIRED" />
70             <tx:method name="delAndRepair" propagation="REQUIRED" />
71 
72             <tx:method name="get*" propagation="SUPPORTS" />
73             <tx:method name="find*" propagation="SUPPORTS" />
74             <tx:method name="load*" propagation="SUPPORTS" />
75             <tx:method name="search*" propagation="SUPPORTS" />
76             <tx:method name="datagrid*" propagation="SUPPORTS" />
77 
78             <tx:method name="*" propagation="SUPPORTS" />
79         </tx:attributes>
80     </tx:advice>
81     <aop:config>
82         <aop:pointcut  />
83         <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
84     </aop:config>
85             
86 </beans>
View Code

该文件所做的工作是配置druid数据源,mybatis的Mapper扫描,扫描指定包下的所有mapper,如此便不用逐条加载mapper了,然后是Spring的事务管理。

不过,在配置Spring和Mybatis整合时出现了一些问题,记录之:

①一直报错

Spring与Mybatis配置问题

说白了,就是没找到com.zhu.test.dao包,这个问题折腾了一天多时间,百思不得解,最后无奈从别处复制粘贴,改一下路径和包名,结果就奇迹般的好了,最后终于找到了问题所在,截图为鉴【下次直接全部替换就不会有这样的问题了】:

Spring与Mybatis配置问题

1   [com.alibaba.druid.pool.DruidDataSource] - create connection error
2   java.sql.SQLException: Access denied for user 'Dada'@'localhost' (using password: YES)
3     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
4     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
5     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
6     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871)
7     at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
8     at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1215)

很显然,该错误说明没使用资源文件中的配置连接数据库,相反却使用了本机名不带密码访问数据库,关键在于spring.xml文件中的这句<context:property-placeholder location="classpath:jdbc.properties"/>,<context:property-placeholder />有一个system-properties-mode属性,默认为ENVIRONMENT,会先去系统变量中寻找,修改之<context:property-placeholder location="classpath:jdbc.properties" system-properties-mode="NEVER"/>,值NEVER表示不去寻找系统变量中的值,问题便解决了【参考自http://www.oschina.net/question/873438_234580】。

另外,关于<context:property-placeholder />:

 1【来自http://blog.csdn.net/ws_blog/article/details/46986051
<context:property-placeholder 2 location="属性文件,多个之间逗号分隔" 3 file-encoding="文件编码" 4 ignore-resource-not-found="是否忽略找不到的属性文件" 5 ignore-unresolvable="是否忽略解析不到的属性,如果不忽略,找不到将抛出异常" 6 properties-ref="本地Properties配置" 7 local-override="是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性,否则相反" 8 system-properties-mode="系统属性模式,默认ENVIRONMENT(表示先找ENVIRONMENT,再找properties-ref/location的),NEVER:表示永远不用ENVIRONMENT的,O VERRIDE类似于ENVIRONMENT" 9 order="顺序" 10/>

另外附上比较详细的讲解,参考自http://blog.csdn.net/Rickesy/article/details/50791534