项目中集成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了, 由于是企业内网server,不能訪问 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>

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

补充: 还是不起作用,于是没法子了,仅仅好拆开Mybatis的源代码,找到类 org.apache.ibatis.session.Configuration ,然后,在自己的文件夹下把源代码拷出来, 自己在test文件夹建一个包,建一个类,和Configuration一模一样,然后改动 callSettersOnNulls 的默认值为 true,然后找到编译好的3个class文件(有内部类),替换到mybatis-3.2.7.jar中去,OK,成功解决。

按理说应该是编译整个mybatis的,但是maven有点坑,眼下还不想这样做

看了 mybatis高级应用系列一:分页功能 这篇文章,发觉冤枉 MyBatis了,事实上是 Mybatis-Spring挖下的坑, 校验的时候不走Mybatis的默认通道, 而是自己解析了相应的XML文件,还要去网上搜索dtd文件,巨坑无比啊.

给了 configurationProperties 这么个选项,却不使用,真是不好。

附上一篇, 怎样解决Spring附加组件中dtd的这样的坑

MyBatis与Spring设置callSettersOnNulls的更多相关文章

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

    在MyBatis-Spring的项目中,我们一般会为MyBatis配置两个配置文件 beans-mybatis.xml 和 mybatis-config.xml.其中 beans-mybatis.xm ...

  2. 重构Mybatis与Spring集成的SqlSessionFactoryBean(1)

    一般来说,修改框架的源代码是极其有风险的,除非万不得已,否则不要去修改.但是今天却小心翼翼的重构了Mybatis官方提供的与Spring集成的SqlSessionFactoryBean类,一来是抱着试 ...

  3. Mybatis 与 spring mvc

    本文是用来小结一下自己mybatis 和spring mvc 学习过程. 在写的过程中发现 http://www.phperz.com/article/15/0127/48684.html 这篇文章里 ...

  4. Mybatis 和 Spring配置

    一.使用的jar包就不详细讲解了,下载了Mybatis 和 Spring 的jar包基本上都添加上去了. 一图概括:(这是我使用的ar包,有些不是Mybatis 和 Spring 的 ) 二. web ...

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

    在学习mybatis与spring整合是,想从外部引用一个db.properties数据库配置文件,在配置文件中使用占位符进行引用,如下: <context:property-placehold ...

  6. MyBatis 与 Spring 整合

    MyBatis-Spring 项目 目前大部分的 Java 互联网项目,都是用 Spring MVC + Spring + MyBatis 搭建平台的. 使用 Spring IoC 可以有效的管理各类 ...

  7. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程

    1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...

  8. SpringBoot与Mybatis整合的设置

    Mybatis和Spring Boot的整合有两种方式: 第一种:使用mybatis官方提供的Spring Boot整合包实现,地址:https://github.com/mybatis/spring ...

  9. mybatis与Spring

    提问1:如果没有spring-mybatis,我们如何在spring中使用定义bean,如何使用事务? mybatis-Spring为我们带来多种方式的Mapper接口的注册,扫描,识别. 如果不使用 ...

随机推荐

  1. 本科非cs菜鸟计算机面试实录

    两年制小硕,本硕期间差不多都打酱油的.本科非cs专业,硕士cs,编程基础一般,专业基础尚可.研究生期间分析分析了pgsql数据库的源码:同时实验室一些杂项目:自己业余为了应试读了些计算机书.自己当时q ...

  2. ECSHOP如何增加红包序列号字符

    ECSHOP系统线下发放红包时系统生成的红包序列号是在10000的基础上增加四位随机数字.如果当我们要发放大额度红包的时候,这样的序列号规 则难免给人不安全的感觉,万一有无聊的人,蒙几个红包序列号出来 ...

  3. ProductHunt,TechCrunch和AppStore的差的值

    ProductHunt(产品狩猎)硅谷社区的新产品,起初只存在一个技术性的房子维修.然后进入YC训练营已经收到了几百美元的融资2. 这款产品的形式非常easy.粗产物似乎是一个节目的部位,加上一些评论 ...

  4. hibernate 批量处理数据

    批量处理数据是指处理大量数据的一个单独的事务. 在应用层批处理操作, 主要有以下方式: 通过 Session 通过 HQL 通过 StatelessSession 通过 JDBC API(仅仅要会用这 ...

  5. 从零開始学android&lt;RelativeLayout相对布局.十六.&gt;

    相对布局管理器指的是參考某一其它控件进行摆放,能够通过控制,将组件摆放在一个指定參考组件的上.下.左.右等位置,这些能够直接通过各个组件提供的属性完毕. 以下介绍一下各个方法的基本使用 No. 属性名 ...

  6. Windows下一个JSP环境配置

    一.首先安装JDK 门户: http://write.blog.csdn.net/postedit/39999433 二.安装Myeclipse 事实上也能够安装eclipse然后再安装Myeclip ...

  7. 我的学习笔记_Windows_HOOK计划 2009-12-03 11:19

    一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...

  8. 潜水 java类加载器ClassLoader

    类加载器(class loader)用于装载 Java 类到 Java 虚拟机中.一般来说.Java 虚拟机使用 Java 类的方式例如以下:Java 源程序(.java 文件)在经过 Java 编译 ...

  9. Mono+CentOS+Jexus

    在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). ...

  10. 标准I/O缓冲:全缓冲、行缓冲、无缓冲

    说明:我仅仅对网络资源进行了整合,方便学习-.- 基于流的操作终于会调用read或者write函数进行I/O操作.为了使程序的执行效率最高,流对象一般会提供缓冲区,以降低调用系统I/O库函数的次数. ...