关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »MyBatis和Spring设置callSettersOnNulls

    MyBatis和Spring设置callSettersOnNulls

    2014-09-28 00:00:00 出处:aspnetdream
    分享

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

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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    windows 7应用程序无法启动出现窗口提示找不到应用程序

    SQL中数据类型转换函数的使用

    MySQL使用变量的注意事项

    SQL Server 锁自定义的示例演示

    如何在Linux命令行中创建以及展示演示稿

    windows 7任务栏显示标题的方法(windows 7任务栏缩略图不显示出

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。