`

Spring和Mybatis整合时无法读取properties的处理方案

    博客分类:
  • Java
阅读更多

config.properties配置文件信息

Properties代码  收藏代码
  1. ##数据库(mysql|mssql|oracle...)  
  2. environment=mysql  
  3. jdbc.driver=com.mysql.jdbc.Driver  
  4. jdbc.url=jdbc:mysql://127.0.0.1:3306/portal?useUnicode=true&characterEncoding=utf8  
  5. jdbc.user=root  
  6. jdbc.password=root  
  7. #初始化连接(根据实际访问量设置大小)  
  8. jdbc.initialSize=10  
  9. #最大空闲连接(根据实际访问量设置大小)  
  10. jdbc.maxIdle=50  
  11. #最小空闲连接(根据实际访问量设置大小)  
  12. jdbc.minIdle=10  
  13. #最大连接数量(根据实际访问量设置大小)  
  14. jdbc.maxActive=200  

 Spring配置信息(截取部分)

Xml代码  收藏代码
  1. <context:property-placeholder location="classpath:config.properties" />  
  2.   
  3. <!--创建jdbc数据源 -->  
  4. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  5.     <property name="driverClassName" value="${jdbc.driver}"/>  
  6.     <property name="url" value="${jdbc.url}"/>  
  7.     <property name="username" value="${jdbc.user}"/>  
  8.     <property name="password" value="${jdbc.password}"/>  
  9.     <property name="initialSize" value="${jdbc.initialSize}"/>  
  10.     <property name="maxIdle" value="${jdbc.maxIdle}"/>  
  11.     <property name="minIdle" value="${jdbc.minIdle}"/>  
  12.     <property name="maxActive" value="${jdbc.maxActive}"/>  
  13.     <property name="removeAbandoned" value="true"/>    
  14.     <property name="removeAbandonedTimeout" value="120"/>  
  15.     <property name="maxWait" value="3000"/>  
  16. </bean>  
  17. <!-- 创建SqlSessionFactory,同时指定数据源 -->  
  18. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  19.     <property name="dataSource" ref="dataSource"/>  
  20.     <property name="configLocation" value="classpath:mybatis-config.xml"/>  
  21.        <property name="mapperLocations" value="classpath*:com.anly.portal.*.mapper/*Mapper.xml" />   
  22. </bean>  
  23. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  24.     <!-- 此处扫描的是Mapper接口 -->  
  25.     <property name="basePackage" value="com.anly.portal.*.mapper"/>  
  26.     <property name="sqlSessionFactory" ref="sqlSessionFactory"/>  
  27. </bean>  

 此时,启动会报异常,${jdbc.driver}这样的表达式获取不到properties里面的值,因为MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了,解决的办法如下:

 

方法一:

修改<property name="sqlSessionFactory" ref="sqlSessionFactory"/>为<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

原理:使用sqlSessionFactoryBeanName注入,不会立即初始化sqlSessionFactory, 所以不会引发提前初始化问题。

 

方法二:

直接删掉<property name="sqlSessionFactory" ref="sqlSessionFactory"/>

 

注意:在没有配置这一行时,必须配置一个以sqlSessionFactory命名的org.mybatis.spring.SqlSessionFactoryBean。

 

 

 

 

=====================================================================

 

mybatis配置多数据源本身很简单,和基本配置差别不大

但是如果要配置自动扫描mapper文件,可能会遇到一点儿问题

只有一个数据源时,只需要指定包就可以了,比如

 

1 <!-- 扫描映射器,自动创建 -->
2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
3     <property name="basePackage" value="...*" />
4 </bean>


而有多个数据源时,还需要指定使用哪一个sqlSession,在mybatis-spring的中文文档中,提到用sqlSessionFactory或sqlSessionTemplate属性来配置数据源,文档:

 

1 注意,没有必要去指定SqlSessionFactory或SqlSessionTemplate,因为MapperScannerConfigurer将会创建MapperFactoryBean,之后自动装配。但是,如果你使用了一个以上的DataSource(因此,也是多个的SqlSessionFactory),那么自动装配可能会失效。这种情况下,你可以使用sqlSessionFactory或sqlSessionTemplate属性来设置正确的工厂/模板。

 

 

配置为: 

1 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
2     <property name="basePackage" value="..." />
3             <property name="sqlSessionFactory" ref="fsasSqlSessionFactory"></property>
4 </bean>

 

当这样配置时,如果数据源DataSource的属性中使用了properties属性,那么就会报异常:

 

1 <!-- 配置dbcp连接池,注意要加入它的第三包jar包 -->
2 <bean id="fsasDataSource" class="org.apache.commons.dbcp.BasicDataSource"
3     destroy-method="close">
4     <property name="driverClassName" value="${jdbc.driverClassName}" />
5     <property name="url" value="${fsas.url}" />
6     <property name="username" value="${fsas.username}" />
7     <property name="password" value="${fsas.password}" />
8 </bean>

 

 

异常信息:

 

1 2011-11-19 20:37:57 WARN [com.mchange.v2.c3p0.DriverManagerDataSource:107] - Could not load driverClass ${jdbc.driverClass}
2 java.lang.ClassNotFoundException: ${jdbc.driverClass}



 


查看官方英文文档发现, 有专门提醒:
NOTE   sqlSessionFactoryBean  and  sqlSessionTemplateBean  properties were the only option available up to MyBatis-Spring 1.0.2 but given that the  MapperScannerConfigurer runs earlier in the startup process thatPropertyPlaceholderConfigurer there were frequent errors . For that purpose that properties have been deprecated and the new properties  sqlSessionFactoryBeanName  and  sqlSessionTemplateBeanName  are recommended.
 
大概意思是:MapperScannerConfigurer初始化的时候,PropertyPlaceholderConfigurer还没有将properties的参数值替换,所有导致直接将参数名,如“${jdbc.driverClassName}”设置到dataSource的字段属性中。
 
同时,官方已经弃用了采用 sqlSessionFactoryBean 和 SesionTemplateBean的方式进行配置,而推荐使用sqlSessionFactoryBeanName 和  sqlSessionTemplateBeanName
所以正确的配置应该为:
1 <!-- 扫描映射器,自动创建 -->
2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
3     <property name="basePackage" value="..." />
4     <property name="sqlSessionTemplateBeanName" value="fsasSqlSession" />
5 </bean>
分享到:
评论

相关推荐

    Spring+Mybatis 代码生成工具

    Spring 和 Mybatis 是两个在 Java 开发中广泛使用的框架,Spring 提供了全面的依赖注入和面向切面编程,而 Mybatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。当这两者结合时,可以创建高效...

    mybatis整合log4j

    在IT行业中,日志记录是不可或缺的一部分,尤其是在开发和维护复杂系统时,如MyBatis这样的持久层框架。Log4j是一个广泛使用的日志记录工具,它提供了灵活的日志配置和丰富的日志级别,便于调试、监控和问题排查。...

    SpringBoot+Mybatis整合项目

    SpringBoot+Mybatis整合项目是现代Java开发中的常见实践,它将Spring Boot的简洁与Mybatis的灵活性结合在一起,提供了一种高效、便捷的Web应用开发方式。在本项目中,我们将探讨Spring Boot的核心特性、Mybatis的...

    spring boot mybatis多数据源最简解决方案

    当我们的项目涉及到多数据源时,即需要连接并操作多个数据库,Spring Boot和MyBatis的整合就显得尤为重要。本文将深入探讨如何实现Spring Boot结合MyBatis的多数据源最简解决方案。 首先,我们来理解多数据源的需求...

    spring+mybatis+redis简单案例

    这是一个基于Spring、MyBatis和Redis的简单案例,旨在演示如何在Java应用中整合这三个关键技术。Spring是一个开源的Java框架,主要用于处理依赖注入和管理应用组件;MyBatis是一个持久层框架,它简化了数据库操作;...

    dubbo spring mybatis redis

    1. **配置**:项目会包含 dubbo、spring 和 mybatis 的配置文件,如 `application.properties` 或 `application.yml`,其中设置了各种服务端点、数据库连接和 Redis 设置。 2. **服务接口**:Dubbo 的服务接口定义了...

    springmvc+mybatis整合实例

    整合 Spring MVC 和 MyBatis 可以使开发更加便捷,通过 Spring 的依赖注入和事务管理,可以有效地组织代码,提高代码的可维护性。同时,MyBatis 的动态 SQL 功能和灵活的数据映射,能简化数据库操作,提升开发效率。

    springmybatis

    以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经...

    spring+springmvc+mybatis+结合前端easyUI框架,log4j日志文件配置

    同时,MyBatis的配置文件需包含数据源、事务管理器以及Mapper扫描器,确保能正确地读取和执行SQL。 关于log4j日志文件配置,它是软件开发中的重要一环,用于记录程序运行时的信息,便于调试和问题排查。log4j配置...

    spring-boot集成mybatis2

    在IT行业中,Spring Boot是一个非常流行的微服务框架,它简化了Spring应用的初始搭建以及开发过程...通过这个过程,开发者能够更好地理解Spring Boot与MyBatis的结合使用,以及如何处理常见的文件上传和数据解析任务。

    spring boot - mybatis

    Spring Boot简化了Spring应用程序的初始设置和配置,而MyBatis则是一个轻量级的持久层框架,它将SQL语句与Java代码分离,提供了更灵活的数据访问方式。下面,我们将深入讲解这两个技术的结合及其关键知识点。 1. **...

    Spring Boot+Mybatis图书管理系统源码.zip

    《Spring Boot+Mybatis图书管理系统源码》是一个基于Spring Boot框架和Mybatis持久层框架的项目,用于实现图书管理的功能。这个系统的核心是利用Spring Boot的便捷性与Mybatis的灵活性,构建一个高效、易维护的图书...

    基于spring+mybatis+redis 封装的高易用性的框架.zip

    "基于Spring+MyBatis+Redis封装的高易用性框架"是一种常见的技术栈,它整合了Java领域三大主流技术,用于实现高性能的数据处理和应用开发。下面我们将深入探讨这个框架的核心组成部分及其工作原理。 首先,Spring...

    springboot整合mybatis的demo

    在IT行业中,Spring Boot和MyBatis是两个非常流行的开源框架,它们分别简化了Java Web应用的开发和数据库操作。Spring Boot提供了快速构建应用程序的能力,而MyBatis则是一个轻量级的持久层框架,专注于SQL映射和...

    spring+springmvc+mybatis(CURD)

    本项目"spring+springmvc+mybatis(CURD)"显然旨在通过实践帮助开发者熟悉这三个框架的整合以及基本的数据库CRUD(创建、读取、更新和删除)操作。 首先,Spring框架是一个全面的企业级应用开发框架,它提供了依赖...

    Maven 整合 Spring mvc + Mybatis + Velocity 的实例

    在我们的实例中,Maven将帮助我们集成Spring MVC、Mybatis和Velocity,并确保所有必要的库都处于正确的位置。 **Spring MVC** Spring MVC是Spring框架的一个模块,专门用于处理Web应用的请求-响应模型。它提供了一...

    spring boot+mybatis+mysql+layui+maven整合实例

    在本项目中,我们主要探讨的是如何将Spring Boot、MyBatis、MySQL、Layui和Maven这五个关键组件整合在一起,构建一个完整的Web应用。这个实例将展示如何使用这些技术来实现基本的CRUD(创建、读取、更新、删除)操作...

    持久层开源工具MyBatis-Plus快速入门,Spring Boot整合MyBatis-Plus简化开发示例代码

    `MetaObject`是MyBatis中的一个辅助类,用于自动填充和读取对象属性,提高了开发效率。`OptimisticLocker`乐观锁机制,则是在多线程环境下防止数据并发更新时的数据冲突。 接下来,我们来看看如何在Spring Boot项目...

    springboot整合mybatis和mysql

    通过以上步骤,我们可以成功地将Spring Boot、MyBatis和MySQL整合在一起,构建一个能够读取数据库记录和属性文件信息的应用。这种集成方式使得开发过程更加便捷,同时保持了代码的清晰性和可维护性。在实际项目中,...

    SpringBoot整合mybatis,redis,亲测百分之百可运行,运行之前需安装redis并启动redist

    本文将详细阐述如何在Spring Boot项目中整合MyBatis和Redis,并确保其配置正确且可运行。 首先,我们需要理解Spring Boot的核心特性,它是基于Spring框架的简化版,提供了自动配置和起步依赖,使得开发者可以快速地...

Global site tag (gtag.js) - Google Analytics