MyBatis与Spring设置callSettersOnNulls

项目中集成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>

启动没报错,但是还没检验.应该没多大问题...

时间: 2024-10-13 15:33:34

MyBatis与Spring设置callSettersOnNulls的相关文章

MyBatis 与 Spring 是如何结合在一起工作的——mybatis-spring(version:1.2.2)

在MyBatis-Spring的项目中,我们一般会为MyBatis配置两个配置文件 beans-mybatis.xml 和 mybatis-config.xml.其中 beans-mybatis.xml 中配置的是MyBatis 和 Spring结合使用时委托给 spring 管理的 bean.mybatis-config.xml 中是MyBatis 自身的配置. 例:beans-mybatis.xml <bean id="sqlSessionFactory" class=&qu

mybatis与spring整合时读取properties问题的解决

在学习mybatis与spring整合是,想从外部引用一个db.properties数据库配置文件,在配置文件中使用占位符进行引用,如下: 1 <context:property-placeholder location="classpath:db.properties" /> 2 <bean id="dataSource" 3 class="org.springframework.jdbc.datasource.DriverManage

MyBatis整合Spring的实现(1)

目的     MyBatis是一个基于Java的持久层框架.也是很多程序员的最爱,因为自己控制的SQL时,写出一个好的SQL会大大的提高整体程序的性能.目前的项目一般都是MyBatis和Spring的整合,那么具体的逻辑是什么样子呢?下面就来分析一下具体的代码及逻辑. Spring的XML配置(样例): 对于上面XML的配置信息,也就是Spring对一个类进行了实例化.那我们就来看看SqlSeesionFactoryBean类到底做了什么操作呢? 先看一下类中有哪些属性: /** 日志类 */

Mybatis在Spring环境下的启动顺序

主要看三个类: mybatis-spring-1.2.2.jar包 -> org.mybatis.spring.SqlSessionFactoryBean mybatis-3.2.6.jar包 -> org.apache.ibatis.builder.xml.XMLConfigBuildermybatis-3.2.6.jar包 -> org.apache.ibatis.session.Configuration 1. 在spring的RootConfig配置类(或配置文件)里创建并返回一

重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改.但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成的SqlSessionFactoryBean类,一来是抱着试错的心态,二来也的确是有现实需要. 先说明两点: 通常来讲,重构是指不改变功能的情况下优化代码,但本文所说的重构也包括了添加功能 本文使用的主要jar包(版本):spring-*-4.3.3.RELEASE.jar.mybatis-3.4.1.jar.mybatis-spring-1.3.0.jar

【MyBatis学习14】MyBatis和Spring整合

前面十几篇博文总结了mybatis在开发中的相关技术,但在实际中都是和spring整合开发的,所以这里总结一下mybatis和spring的整合方法,并在整合后进行测试. 1. 整合的环境 这都是老掉牙的问题了,不管是开发还是整合,首先环境肯定得有,环境嘛,除了Java环境和开发环境外,那就是jar包咯,关于mybatis和spring整合的jar包,我已经上传到下载频道了==>传送门  http://download.csdn.net/detail/eson_15/9549624 将这些jar

Mybatis 和 Spring配置

一.使用的jar包就不详细讲解了,下载了Mybatis 和 Spring 的jar包基本上都添加上去了. 一图概括:(这是我使用的ar包,有些不是Mybatis 和 Spring 的 ) 二. web.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns

MyBatis整合Spring的实现(8)

?1 方法settingsElement private void settingsElement(XNode context) throws Exception {     if (context != null) {       Properties props = context.getChildrenAsProperties();       // Check that all settings are known to the configuration class       Met

MyBatis与Spring、SpringMVC整合

本文主要记录MyBaits与Spring.SpringMVC的整合步骤,并且有普通的整合方式到通过利用MyBatis动态代理的方式整合的比较好的方式的一步一步演化的步骤: 1.基本环境搭建 2.整合的思路 3.第一种整合方法 4.第二种整合方法 1.基本环境搭建 Mybatis3.2.7+spring3.2.0+springmvc3.2.0 获取的方式: 1.可以通过Maven依赖进行添加: 2.可以通过在官方网站上下载MyBatis与Spring的整合包: 总结来说,jar包内容包含如下: M