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

那么如何将age字段映射到map中呢。提供四种解决方法:

方法一:

MyBatis 不知道你传入的 null 参数对应的 jdbc 类型是什么,因为在 MyBatis 看来,null 在数据库中可以为多种类型(例如,可以为 CHAR、VARCHAR、DATE 等),于是 MyBatis 就傻眼了,解决办法自然是你要告诉 MyBatis 这个 null 对应的 jdbc 类型是什么。于是得出的答案如下:

  在你相应的 Mapper 中,传入该参数的地方写明 jdbc 类型即可,比如原来传参数是这样写的:#{myNullParameter},把它改成这样写即可:#{myNullParameter, jdbcType=VARCHAR}

方法二:

使用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 {

@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> 网上有些资料中提到可以使用 defaultValue 和 nullValue的配置,但是这中配置是ibatis的用法,在Mybatis中已经移除。

方法四:

<!-- 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空字段null字段不返回的更多相关文章

  1. 解决sql语句中参数为空(null)不会更新参数的问题

    用的mybatis自动生成的 情景: 修改页面中,修改某个字段,修改前有数据,修改后为空. mybatis中一般用到 如:(这种直接忽略为空的字段,不能更新空字段参数) <update id=& ...

  2. MyBatis查询两个字段,返回Map,一个字段作为key,一个字段作为value的实现

    1. 问题描述 在使用MyBatis,我们经常会遇到这种情况:SELECT两个字段,需要返回一个Map,其中第一个字段作为key,第二个字段作为value.MyBatis的MapKey虽然很实用,但并 ...

  3. 返回json格式 不忽略null字段

    返回json格式 不忽略null字段  发布于 353天前  作者 king666  271 次浏览  复制  上一个帖子  下一个帖子  标签: json 如题,一个实体的某个字段如果为null,在 ...

  4. Mybatis:解决调用带有集合类型形参的mapper方法时,集合参数为空或null的问题

    此文章有问题,待修改! 使用Mybatis时,有时需要批量增删改查,这时就要向mapper方法中传入集合类型(List或Set)参数,下面是一个示例. // 该文件不完整,只展现关键部分 @Mappe ...

  5. mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,

      在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...

  6. Jackson 转换JSON,SpringMVC ajax 输出,当值为null或者空不输出字段@JsonInclude

    当我们提供接口的时候, Ajax 返回的时候,当对象在转换 JSON (序列化)的时候,值为null或者为“” 的字段还是输出来了.看上去不优雅. 现在我叙述三种方式来控制这种情况. 注解的方式( @ ...

  7. mybatis——解决属性名和数据库字段名不一致问题(注解方式)

    当我们使用注解开发时有时会遇到数据库字段名与实体类属性名不一致的问题.xml方式开发可以通过结果集映射的方式解决,那注解方式开发要怎么解决呢? 注解解决方式: @Results()注解 Results ...

  8. int不可为null引发的 MyBatis做持久层框架,返回值类型要为Integer问题

    MyBatis做持久层框架,返回值类型要为Integer MyBatis 做持久层时,之前没注意,有时候为了偷懒使用了int类型做为返回的类型,这样是不可取的,MyBatis做持久层框架,返回值类型要 ...

  9. 解决比较Oracle中CLOB字段问题

    解决比较Oracle中CLOB字段问题   Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...

随机推荐

  1. CentOS 6.8重新安装yum

    问题来源:我在虚拟机上安装vncserver,输入yum install tigervnc tigervnc-server出现问题,所以就重新安装了一遍yum. 具体的过程看如下这个链接:http:/ ...

  2. webpack热更新问题和antd design字体图标库扩展

    标题也不知道怎么写好,真是尴尬.不过话说回来,距离上一次写文快两个月了,最近有点忙,一直在开发新项目, 今天刚刚闲下来,项目准备提测.借这个功夫写点东西,把新项目上学到的一些好的干活分享一下,以便之后 ...

  3. 【NOI复习】树链剖分

    简介 树链剖分通常用来解决一类维护静态树上路径信息的问题, 例如:给定一棵点带权树, 接下来每次操作会修改某条路径上所有点的权值(修改为同一个值或是同加上一个值等) , 以及询问某条路径上所有点的权值 ...

  4. Java开源博客My-Blog(SpringBoot+Docker)系列文章

    My Blog 1.Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦 2.My-Blog搭建过程:如何让一个网站从零到可以上线访问 3.将数据的初始化放到 ...

  5. 支持多个版本的ASP.NET Core Web API

    基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept- ...

  6. centos下-MariaDB的安装

    安装命令: yum install mariadb mariadb-server 服务命令: systemctl start|stop|restart mariadb root用户密码设置 mysql ...

  7. python函数(1):初始函数

    在学了前面很多python的基础类型后,我们终于可以进入下一阶段,今天我们将走进一个函数的新世界. 预习: 1.写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 2.写函数, ...

  8. linux查看是否安装Apache,mysql,python等

    1.Apache httpd -v service httpd start 启动 service httpd restart 重新启动 service httpd stop 停止服务 2.mysql ...

  9. css3-d ,动画,圆角

    一.3D 开启元素3D transform-style: preserve-3d; Z轴 正数 屏幕外,反之屏幕内 近大远小 perspective: length (必须大于等于0) -- 在3D元 ...

  10. spring实现文件上传(图片解析)

    合抱之木,生于毫末,千里之行,始于足下,要想了解spring的文件上传功能,首先要知道spring是通过流的方式将文件进行解析,然后上传.那么是不是所有需要用的文件上传的地方都要写一遍文件解析器呢? ...