Java中 DAO查询数据用list map接收,诺是没有数据,则list map是null 还是空?

本文通过SSM框架和Junit单元测试,探讨了当SQL查询未返回数据时,list、map和数组的表现形式。实验结果显示,list会返回空集合而非null,map在未查询到数据时返回null,而数组则返回空数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在实际开发中,我们经常用list map 数组来存放SQL查出来的数据。

那问题是:诺是数据库没有到数据,此时的list,map,数组,是null还是空呢?

准备:使用mysql数据库,建立一个user表,字段  id,name,sex ,sex的值是1,

        使用ssm框架,使用Junit单元测试。

先看list测试吧:

    这是测试代码:

//list测试
	@Test
	public void testJunit(){
		User user = new User();
		user.setSex(2);
		//sex=2查不到数据
		List<User> listUser = ud.queryListUserBySex(user);
		System.out.println(listUser);
		if (null!=listUser) {
			System.out.println("ssa");
		}
	}

这是console打印的内容:

[]
ssa

这说明 list集合是存在的 但是集合里边没有数据,所以我们在判断的有没有查到数据的时候不能简单的用null来判断 使用list,size()==0

在看map吧

	//map测试
	@Test
	public void testJunit2(){
		User user = new User();
		user.setSex(2);
		//sex=2查不到数据
		Map<String, User> map = ud.queryListUserBySexMap(user);
		System.out.println(map);
		if (null==map) {
			System.out.println("ssb");
		}
	}

看console打印内容

null
ssb

这说明此处map是null 不是空,所以可以用null来做判断,看DAO是不是从数据库查到了数据

最后看一下数组吧

	//数组测试
	@Test
	public void testJunit3(){
		User user = new User();
		user.setSex(2);
		//sex=2查不到数据
		 User[] array = ud.queryListUserBySexArray(user);
		 System.out.println(array);
		if (null!=array) {
			System.out.println("ssc");
		}
	}

看console打印结果

[Lcom.go.entity.User;@2ccc6372
ssc
这个说明数组不是null,数组是空的,所以在使用数组的时候应该使用数组的长度来判断是不是从数据库查到了数据

### 问题分析 当 DAO 层返回 `List<Map>` 类型的结果集,如果查询未返回任何数据,则可能会触发 `java.lang.IndexOutOfBoundsException` 异常。这是因为代码尝试访问列表中的第一个元素(索引为 0),但在结果集中没有任何条目的情况下,这种操作会导致数组越界异常。 根据提供的引用内容以及常见场景,以下是可能的原因及其解决方案: - **原因一**:SQL 查询未能匹配到任何记录,导致返回的 `List<Map>` 是集合,在后续逻辑中试图通过索引访问其内容抛出了异常[^1]。 - **原因二**:某些框架(如 MyBatis 或 EasyPoi)在处理复杂映射关系可能出现不一致的行为,尤其是在构造器参数数量与 SQL 返回字段数不符的情况下[^2][^3]。 - **原因三**:分页查询可能导致 LIMIT 子句限制了返回的数据量,从而引发类似的异常[^4]。 --- ### 解决方案 #### 方法一:检查并验证 SQL 查询 确保 SQL 查询能够正常运行,并且不会因为条件过滤而导致无结果的情况发生。可以通过日志打印或调试工具查看实际执行的 SQL 和传入参数。 ```sql SELECT * FROM table_name WHERE condition; ``` 如果确实存在无结果的可能性,则应在业务逻辑层面增加判断机制来避免直接访问列表的内容。 #### 方法二:增强健壮性的代码实现 在获取结果之前先校验 `List<Map>` 是否为或者长度是否满足需求,以此防止潜在的下标越界风险。 ```java if (result != null && !result.isEmpty()) { Map<String, Object> firstRecord = result.get(0); // 对 firstRecord 进一步处理... } else { System.out.println("No records found."); } ``` 上述代码片段展示了如何安全地从 `List<Map>` 中提取首个元素。 #### 方法三:调整分页策略 对于涉及分页的操作,建议采用成熟的第三方库替代手动编写带有 LIMIT 的 SQL 语句。例如使用 MyBatis 分页插件 PageHelper 可有效规避此类问题。 ```java PageHelper.startPage(pageNum, pageSize); List<Student> students = studentMapper.selectByIdDesc("id"); // 自动封装好的分页对象包含了总记录数等信息 PageInfo<Student> pageInfo = new PageInfo<>(students); System.out.println(pageInfo.getList()); ``` 此方式不仅简化了开发流程还增强了系统的可维护性和扩展性。 #### 方法四:优化实体类设计 针对特定场景下的特殊需求(如同步导出 Excel 文件),需仔细审查相关 DTO/VO 定义是否存在不合理之处。必要可以重构这些模型以便更好地适配现有技术栈的功能特性。 ```java @Data public class PartnerDto { @ExcelIgnore private Long id; @Excel(name = "昵称", needMerge = true) private String name; @Excel(name = "邮箱", needMerge = true) private String email; @ExcelCollection(name = "关联公司") private List<String> companyList; public PartnerDto(String name, String email, List<String> companyList) { this.name = name; this.email = email; this.companyList = Optional.ofNullable(companyList).orElse(Collections.emptyList()); } } ``` 这里引入了 Java 8 的 `Optional` 工具类用于初始化默认值,减少因输入参数缺失引起的隐患。 --- ### 总结 综上所述,解决 DAO 层返回 `List<Map>` 导致 `IndexOutOfBoundsException` 的核心在于加强前置检验措施、改进底层架构设计以及合理选用辅助组件等方面共同努力才能达到预期效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值