Mybatis resultMap空值映射问题解决

Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的age字段没有值,Mybatis返回的map中只映射了 name和sex字段,而age字段则没有包含。

网上找到两种解决办法:

一、使用Mybatis config配置

创建configuration.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
      <setting name="callSettersOnNulls" value="true"/>
  </settings>
</configuration>

配置Mybatis的SqlSessionFactoryBean

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:/META-INF/spring/configuration.xml" />
    <property name="mapperLocations"
    value="classpath:/META-INF/spring/mybatis/modelMap/*.xml" />
</bean>

在这种配置中,age将以null值映射到map中。

二、如果想要配置age的默认值,则可以建立一个类,实现Mybatis的TypeHandler接口

public class EmptyStringIfNull implements TypeHandler<String> {

    @Override
    public String getResult(ResultSet rs, String columnName) throws SQLException {
        return (rs.getString(columnName) == null) ? "" : rs.getString(columnName);
    }

    @Override
    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        return (rs.getString(columnIndex) == null) ? "" : rs.getString(columnIndex);
    }

    @Override
    public String getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return (cs.getString(columnIndex) == null) ? "" : cs.getString(columnIndex);
    }

    @Override
    public void setParameter(PreparedStatement ps, int arg1, String str,
            JdbcType jdbcType) throws SQLException {
    }
}; 

继续在resultMap中使用,即可配置age的默认值(上述代码中age的默认值为"")

<resultMap id="list" type="java.util.LinkedHashMap">
    <result property="name" column="name" />
    <result property="sex" column="sex" />
    <result property="age" column="age"     typeHandler="com.demo.EmptyStringIfNull"/>
</resultMap>
时间: 2024-10-11 05:23:32

Mybatis resultMap空值映射问题解决的相关文章

Mybatis resultMap空值映射问题

参考博客:https://www.oschina.net/question/1032714_224673 http://stackoverflow.com/questions/22852383/how-to-change-valuenull-to-empty-string-from-query-when-using-mybatis Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 n

mybatis和Dao映射的配置文件xml,中什么时候需要用resultType .什么时候用resultMap,及resultType和resultMap的区别

区别: 两者都可以用于映射文件中的<select>语句的返回值,但是两者在返回值上面是有区别的 如下面的两个例子: 使用resultType的 举个例子吧,例子以ibatis为例: 你有个User 对象, 拥有两个字段id,name. 1.你要获取id为123的name String name = (String) queryForObject("getUserNameByID", id); <select id="getUserNameByID"

MyBatis——Mapper.xml映射文件

Mapper.xml映射文件 转载:http://loveshisong.cn/mybatis/2015/01/22/MyBatis(%E4%B8%89)Mapper.xml%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6.html 本文结构 select 语句简介 insert update delete 简介 Parameters 参数 ResultMap select 语句简介 查询语句是 MyBatis 中最常用的元素之一,先来个例子 <select id="

hao947 : Mybatis resultMap配置插入和主键自增返回 : 好947

映射配置文件  好947  <!-- type:映射实体类的数据类型 id:resultMap的唯一标识 -->  <resultMap type="person" id="BaseResultMap">   <!-- column:库表的字段名 property:实体类里的属性名 -->   <id column="person_id" property="personId" /&g

mybatis实现继承映射

ORM框架的优势在于能让我们利用面向对象的思维去操作数据库,hibernate作为重量级的ORM框架对面向对象的支持很强大.作为半自动化的mybatis,对面向对象的支持也是很完备的.这篇文章就来讨论一下如何利用mybatis实现继承映射. 类图 有一个机动车父类,它有两个子类:Car和Bus 关系模型(t_vehicle) ORM映射有一个原则:对象模型细粒度,关系模型粗粒度.所以我们将所有的车都存储一张表里(t_vehicle),通过鉴别字段vType来区分车的类型("c"代表Ca

MyBatis的SQL映射文件

1.使用MyBatis实现条件查询 (1)sql映射文件 mapper:映射文件的根元素节点,只有一个属性namespace,其作用如下: <1>用于区分不同的mapper,全局唯一 <2>绑定DAO接口,即面向接口编程.当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句.因此namespace的命名必须要跟接口同名. cache:配置给定命名空间的缓存 cache-ref:从其他命名空间

Mybatis中输入输出映射和动态Sql

一.输入映射 我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型.POJO.HashMap等数据类型 1.简单类型 2.POJO包装类型 ①这是单表查询的时候传入的POJO包装类型,即可以直接传入实体类,但是当多表查询的时候,就需要自定义POJO类型 ②我们使用自定义POJO类型来具体的了解一下 先设计 包装类型如下,其中UserPOJO是除了User本身之外的添加的其他跟User相关的属性的包装类,UserVo是用于视图层面的包装类型,同样也是作为Map

MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射

最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使用collection标签实现查询结果一对多映射. 1. 使用collection标签 需求:根据用户id查询用户信息的同时获取用户拥有的角色,一个用户可以拥有1个或多个角色. 一般情况下,不建议直接修改数据库表对应的实体类. 所以这里我们延用之前博客中新建的类SysUserExtend,并添加如下代码,如下

mybatis一对一关联关系映射

mybatis一对一关联关系映射 在关联关系中,有一对一,一对多,多对多三种关联关系. 一对一关系:在操作上,任意一方引入对方的主键作为外键. 一对多关系:在"多"的一方添加"一"的一方的主键作为外键. 多对多关系:产生中间表引入两张表的主键作为外键,将两个主键作为联合主键或者引入新的字段作为这个中间表的主键. 一对一关联关系 例如person和IDcard,一个人只有一个身份证号,而一个身份证号只对应一个人. 以上是person表和IDcard表. public