MyBatis與Spring設置callSettersOnNulls
來源:程序員人生 發布時間:2014-10-04 08:00:00 閱讀次數:2610次
項目中集成Mybatis與Spring,使用的是Mybatis3.2.7,以及Spring4.0.5,mybatis-spring-1.2.2;
因為項目組成員想要偷懶,將數據從DB中查詢出來時需要將字段映射為Map,而不想封裝成Bean.
默認情況下,Mybatis對Map的解析生成, 如果值(value)為null的話,那么key也不會被加入到map中.
于是對Map遍歷時,key就遍歷不到,因為前端工具的需要,必須有這個key,網上搜索后發現需要設置
callSettersOnNulls 這個屬性.
那就設置唄, 在
sqlSessionFactory 的定義中,指定
configLocation 屬性,指向另一個文件,如下所示
文件清單:
mybatis-env-setting.xml<?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">
<!--
如果內網機器報錯,請使用下面這種笨辦法
-->
<!--
<!DOCTYPE configuration
PUBLIC "-//www.mybatis.org//DTD Config 3.0//EN"
"E:/bao/tomcat/apache-tomcat-6.0.14/webapps/pmsys/WEB-INF/classes/mybatis/mybatis-3-config.dtd">
-->
<configuration>
<settings>
<!-- 只設置需要的,其他使用默認值 -->
<!-- 開啟緩存,默認就是開啟的,2層開關,需要在Mapper文件中也指定 cache 標簽才會真正使用緩存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 在null時也調用 setter,適應于返回Map,3.2版本以上可用 -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
然后使用,一切正常,OK.
過了幾天, 實施項目時出BUG了, 因為是企業內網服務器,不能訪問
mybatis.org,于是啟動出錯.
【Mybatis 這個渣渣,在啟動時會去獲取并校驗DTD,目前還不知道在哪里配置讓其不進行校驗.】
網上搜索半天,沒有好的解決辦法, 看到有方法說將dtd下載到本地,然后直接指定路徑,就像上面注釋掉的那部分一樣。
問題也算是解決了,可是很土,而且各個機器不一定都有同樣的目錄,這種掉渣的方法肯定會遭人詬病的。
于是百度谷歌又搜索了半天,沒找到辦法,根本沒有人提這茬。
于是想著自己翻源碼看看:
public class SqlSessionFactoryBean
implements FactoryBean<SqlSessionFactory>, InitializingBean,
ApplicationListener<ApplicationEvent> {
private static final Log logger = LogFactory.getLog(SqlSessionFactoryBean.class);
// 這里可以配置configLocation資源
private Resource configLocation;
private Resource[] mapperLocations;
private DataSource dataSource;
private TransactionFactory transactionFactory;
// 這里可以配置configurationProperties屬性
private Properties configurationProperties;
......
protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
Configuration configuration;
XMLConfigBuilder xmlConfigBuilder = null;
// 先查找 configLocation 屬性
if (this.configLocation != null) {
xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), null, this.configurationProperties);
configuration = xmlConfigBuilder.getConfiguration();
} else {
if (logger.isDebugEnabled()) {
logger.debug("Property 'configLocation' not specified, using default MyBatis Configuration");
}
// 如果找不到configLocation,就只使用 configurationProperties
configuration = new Configuration();
configuration.setVariables(this.configurationProperties);
}
......
看到了
configurationProperties 這個屬性,可是 該怎么設置呢,總算找到了一篇很靠譜的學習筆記: Spring的Bean之設置Bean值
于是,抄襲之,自己設置了一下相應的屬性
形成的配置文件片段如下所示:
<!-- myBatis配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 表示在mybatis.mapping包或以下所有目錄中,以 Mapper.xml結尾所有文件 -->
<property name="mapperLocations">
<value>classpath:com/cncounter/dao/oracle/**/*Mapper.xml</value>
<!--
<list>
<value>classpath:com/cncounter/dao/oracle/res/*Mapper.xml</value>
<value>classpath:com/cncounter/dao/oracle/user/*Mapper.xml</value>
</list>
-->
</property>
<!--
<property name="configLocation">
<value>classpath:mybatis/mybatis-env-setting.xml</value>
</property>
-->
<!-- 切換一種方式,不配置configLocation -->
<property name="configurationProperties">
<props>
<prop key="cacheEnabled">true</prop>
<prop key="callSettersOnNulls">true</prop>
</props>
</property>
</bean>
啟動沒報錯,但是還沒檢驗.應該沒多大問題...
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈