配置项目过程中,习惯性的先把框架跑起来,后面在把修改的参数放到配置中。发现替换不成功,报错无效${username}
。
1.配置
<!-- 读入配置属性文件 -->
<!-- 引入方式1:读数据库连接配置文件db.properties,如果需要配置多个则应使用locations属性,多个值用逗分隔 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name="locations">
<value>classpath:jdbc.properties</value>
</property>
</bean>
<!--引入方式2 <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/> -->
<!-- 配置要扫描的包 -->
<context:component-scan base-package="cn.hicard" />
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://192.168.1.110:3306/ecard_test?useUnicode=true&characterEncoding=utf-8"></property>
<property name="username" value=" ${username}"></property>
<property name="password" value="123456"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.hicard.dao" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
2.原因
MapperScannerConfigurer 的加载是先于读取properties文件。导致占位符不生效。
解决方案:
1.修改 MapperScannerConfigurer 里面的sqlSessionFactory
为 sqlSessionFactoryBeanName
2.上面的不行就直接把第二行属性<property name="sqlSessionFactory" ref="sqlSessionFactory" />
干掉。
改为生成多一个mybatis配置的文件。
<!-- 2. mybatis的SqlSession的工厂: SqlSessionFactoryBean dataSource:引用数据源 MyBatis定义数据源,同意加载配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:spring/mybatis-config.xml" />
</bean>
<!-- 3. mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory
basePackage:指定sql映射文件/接口所在的包(自动扫描),spring自扫描所有dao包并把其下的所有mybatis接口文件装配入容器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.hicard.dao"></property>
</bean>
mybatis-config.xml配置内容为mybatis常规配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 配置数据库字段映射成实体字段规则, 数据字段是带下划线而实体是驼峰方式,配置此属性可转成驼峰方式 ,-->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!-- 返回map类型字段值为空时也返回字段 -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
<!-- 实体类,简称 -设置别名 -->
<typeAliases>
<typeAlias alias="User" type="cn.hicard.entity.User" />
</typeAliases>
<!-- 实体接口映射资源 -->
<!-- 说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml -->
<!-- <mappers>
<mapper resource="classpath:mybatis/mapper/userMapper.xml" />
</mappers> -->
</configuration>
当然。如果你想指定放你的username.xml到指定的文件夹里面。在配置上加上,或者在mybatis-config.xml对应下面加,默认是不加就放到接口同级目录下。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:spring/mybatis-config.xml" />
<property name="mapperLocations">
<list>
<value>classpath:mybatis/mapper/*.xml</value>
</list>
</property>
</bean>