5.11 mybatis之returnInstanceForEmptyRow作用


mybatis的settings配置中有个属性returnInstanceForEmptyRow,该属性新增于mybatis的3.4.2版本,低于此版本不可用。该属性的作用官方解释为:当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。该属性默认配置为false。如何理解上面这句话?
假设有一个库表名字为CAR,该表有2列,分别为NAME和BRAND,其中有一条数据,NAME列和BRAND列都为NULL,当配置returnInstanceForEmptyRow=false时,返回的car对象也为NULL;当returnInstanceForEmptyRow=true时,返回的car对象是非NULL对象,只不过是这个实例对象中brand属性和name属性都为NULL。通过下面的例子就可明白

1. 当returnInstanceForEmptyRow=true时

我们以CAR表为例,表中有2条数据,其中有一条name列和brand列都为NULL。
在这里插入图片描述
下面查询name列为NULL的数据,对应的mapper如下所示

<select id="select2" resultType="com.lzj.bean.Car">
    select * from car where name is null
</select>

对应的DAO为

package com.lzj.dao;

import com.lzj.bean.Car;
import java.util.List;

public interface CarDao {
    public List<Car> select2();
}

然后修改配置文件如下所示,主要是配置returnInstanceForEmptyRow=true

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="returnInstanceForEmptyRow" value="true"/>
</settings>

一切就绪后执行下面的测试方法

public void sqlSessionTest2(){
    SqlSessionFactory factory = mybatisUtil.getFactory();
    SqlSession sqlSession = factory.openSession(true);  //true表示自动提交
    List<Car> cars = sqlSession.selectList("com.lzj.dao.CarDao.select2");
    System.out.println("个数: " + cars.size());
    System.out.println("cars: " + cars);
    sqlSession.close();
}

执行完测试方法后输出结果如下所示,通过日志可以看出,返回list中有1个car对象,对象中的name和brand属性都为null。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 79094208.
==>  Preparing: select * from car where name is null 
==> Parameters: 
<==    Columns: name, brand
<==        Row: null, null
<==      Total: 1
个数: 1
cars: [Car{name='null', brand='null'}]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4b6e1c0]

2 当returnInstanceForEmptyRow=false时

下面看一下当当returnInstanceForEmptyRow=false时返回的是什么对象,当然也可以不配置,因为该参数默认就是false的。还是以上面的例子来说,只是修改mybatis的配置文件如下所示

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <setting name="returnInstanceForEmptyRow" value="false"/>
</settings>

然后再次运行上面测试案例输出结果如下所示,返回的list中同样也是只有1个对象,不过这个对象是空对象null。到这里再回到上面理解最开始的解释就一目了然了。

Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
PooledDataSource forcefully closed/removed all connections.
Opening JDBC Connection
Created connection 1184248953.
==>  Preparing: select * from car where name is null 
==> Parameters: 
<==    Columns: name, brand
<==        Row: null, null
<==      Total: 1
个数: 1
cars: [null]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@46963479]

相关推荐

  1. Mybatis缓存

    2024-04-21 12:02:04       60 阅读
  2. MyBatis动态Sql

    2024-04-21 12:02:04       59 阅读
  3. MyBatis缓存

    2024-04-21 12:02:04       42 阅读
  4. MyBatis关联查询

    2024-04-21 12:02:04       53 阅读
  5. mybatis动态SQL

    2024-04-21 12:02:04       44 阅读
  6. MybatisSqlSession详解

    2024-04-21 12:02:04       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 12:02:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 12:02:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 12:02:04       87 阅读
  4. Python语言-面向对象

    2024-04-21 12:02:04       96 阅读

热门阅读

  1. 【Go】九、API 编写测试_实现一个用户模块的接口

    2024-04-21 12:02:04       32 阅读
  2. Python学习之-描述符详解

    2024-04-21 12:02:04       41 阅读
  3. 进来学习K8s中的网络资源对象Service!

    2024-04-21 12:02:04       88 阅读
  4. 如何在Python中使用matplotlib库进行数据可视化?

    2024-04-21 12:02:04       40 阅读
  5. * 玩转数据魔方Plotly Express实战8例

    2024-04-21 12:02:04       38 阅读
  6. scrapy爬虫实践(部分源代码)

    2024-04-21 12:02:04       181 阅读
  7. MATLAB初学者入门(8)—— 动态规划

    2024-04-21 12:02:04       38 阅读
  8. 顺序表的就地倒置(C语言)

    2024-04-21 12:02:04       40 阅读
  9. wx小程序-input事件改变数据

    2024-04-21 12:02:04       39 阅读