經過properties配置文件配置數據源,代碼以下:html
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="order" value="3" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="locations"> <list> <value>classpath:config/db.properties</value> <!-- 注意路徑寫法,上面寫法要加classpath,路徑前不能有/,此下面寫法properties文件要在WEB-INF目錄下,路徑前要有/ <value>/WEB-INF/test.properties</value> --> </list> </property> </bean> <!-- 自定義數據源 --> <bean id="dataSource" name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本屬性 url、user、password --> <property name="driverClassName" value="${db.jdbc.driverClassName}" /> <property name="url" value="${db.jdbc.url}" /> <property name="username" value="${db.jdbc.username}" /> <property name="password" value="${db.jdbc.password}" /> <!-- 配置初始化大小、最大鏈接數量 --> <property name="initialSize" value="${db.initialSize}"/> <property name="maxActive" value="${db.maxActive}"/> <!-- 鏈接最大等待時間 --> <property name="maxWait" value="${db.maxWait}" /> <property name="poolPreparedStatements" value="true" /> <property name="defaultAutoCommit" value="true" /> <!-- 鏈接池最大、最小空閒 --> <property name="maxIdle" value="${db.maxIdle}" /> <property name="minIdle" value="${db.minIdle}" /> <!-- 配置間隔多久才進行一次檢測,檢測須要關閉的空閒鏈接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}" /> <!-- 配置一個鏈接在池中最小生存的時間,單位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}" /> <!-- 校驗語句 --> <property name="validationQuery" value="select 1 from dual"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="true"/> <property name="testOnReturn" value="false"/> <!-- 配置監控統計攔截的filters --> <property name="filters" value="stat"/> </bean>
項目啓動報錯:java
org.springframework.beans.TypeMismatchException。。。。web
java.sql.SQLException: ${db.jdbc.driverClassName}spring
經查閱資料發現是此配置引發:sql
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xiaomu.**.dao" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
緣由:mybatis
MapperScannerConfigurer自定義了bean的初始化接口,在其初始化時placeholder還未初始化,致使properties值還沒注入進來而報錯app
解決:ui
MapperScannerConfigurer注入 sqlSessionFactory 的時候有兩種選擇一種是在spring配置的時候直接注入sqlSessionFactory對象,另外一種是sqlSessionFactoryBeanName經過名字來注入bean。url
故將<property name="sqlSessionFactory" ref="sqlSessionFactory" />改成<property name="sqlSessionFactoryBeanName" value="mybatisSqlSessionFactory" />便可,注意改事後value值不能使用原來的sqlSessionFactory名稱,由於是經過名稱注入,故使用sqlSessionFactory依然會報錯。spa
注:sqlSessionFactoryBeanName爲非必須標籤,單數據源時能夠不用配置
說明:
MapperScannerConfigurer做用和mappers標籤做用相似,都是掃描mapper肯定映射關係,mapper配置形式爲:
<mappers> <!-- sql文件配置方式一:指定文件路徑位置,sql.xml文件namespace能夠直接用dao名稱,注意此時sql.xml文件要在resource目錄下 --> <!-- <mapper resource="mybatis/sqlmap/user/brokerinfoMapper.xml"/> --> <!-- sql文件配置方式二:sql文件和dao接口放在同一個目錄下,只須要配置sql.xml文件和接口所在包路徑 , 可是sql.xml的namespace要是dao接口的完整路徑--> <!-- <package name="com.test.web.dao"/> --> </mappers>
參考原文地址:https://www.cnblogs.com/LionheartCGJ/p/7886423.html