【随手记】解决mybatis返回List<map>类型的数据时 无序 并且 不能返回空值

返回结果无序

希望表格的列能根据数据库查出来的数据保持一致,但是返回页面的结果集是无序

在mybatis中使用List<Map>结构接收数据,发现输入的sql语句结果并不是按照输入的字段名顺序返回的。

例如输入

select col1,col2,col3 from table

却返回

col2 col3 col1
* * *
* * *

字段顺序和输入的完全不一样

原因

原来我的查询返回resultType = "map", 也就是这个map,打乱了顺序。因为map并不能保证存入取出数据一致。

解决

将原来的map

<select id="test" resultType="map">

改为LinkedHashMap

<select id="test" resultType="java.util.LinkedHashMap">

返回结果没有空值

返回的结果无序解决了 又发现一个新的问题,当我将结果集遍历到表格时,发现有两列数据是乱的。看后台打印才发现当结果中为null值时,是不返回的,key和value都没有。

原因

当使用MyBatis或其他ORM框架查询数据库时,返回的Map是不会包含空值的。这是因为Java的Map数据结构是不允许空值的。

在 MyBatis 中,如果查询的结果集中某些字段值为 null,那么这些字段在返回的 List 中就不会显示。这是因为 MyBatis 使用了一个默认的 ResultSetHandler 实现类 DefaultMapResultHandler 来处理查询结果,这个实现类在遍历结果集时会忽略值为 null 的字段。

解决

如果需要显示空值,可以考虑自定义 ResultSetHandler 实现类,或者在 SQL 中使用 COALESCE 或 IFNULL 等函数来替换为默认值。

示例:假设查询结果集中存在字段值为 null 的情况,我们可以使用如下 SQL:

SELECT COALESCE(DICT_ID, '') AS 编号,
       COALESCE(STATUS, '') AS 状态,
       COALESCE(CREATE_TIME, '') AS 创建时间,
       COALESCE(CREATE_BY, '') AS 创建者,
       COALESCE(DICT_TYPE, '') AS 类型,
       COALESCE(DICT_NAME, '') AS 名称
FROM sys_dict_type

上述 SQL 使用了 COALESCE 函数来将值为 null 的字段替换为空字符串,这样就能保证在返回的 List 中显示所有字段了。


不过我的项目中是使用动态sql查询的,所有这个方法并不能满足需求,而且结果集中连key都没有返回

因为Mybatis默认忽略null值和空字符串

<configuration>
  <settings>
    <setting name="callSettersOnNulls" value="true"/>
  </settings>
</configuration>

callSettersOnNulls是在null值和空字符串时也调用setter方法。

在这个配置文件中添加后,再次运行查询语句,就可以看到空值和相应的key了。

posted @ 2023-04-12 14:03  Cloong  阅读(2186)  评论(0)    收藏  举报