mybatis查询结果为空时的返回值问题
先贴出配置文件
<select id="queryUserGroupByName" resultType="UserGroupModel">
select * from user_group where roleName='user' and groupName=#{groupName}
</select>
对应的mapper
List<UserGroupModel>queryUserGroupByName(String groupName);
在写逻辑的时候发现,如果数据为空时,返回值并不是null
@ResponseBody
@RequestMapping("/addGroup")
public WebResultDto insertUserGroup(String groupName,String stoArea){
WebResultDto webResultDto = null;
if(userInfoService.queryUserGroupByName(groupName) != null) {
//已有重复用户名
System.out.println(userInfoService.queryUserGroupByName(groupName));
webResultDto = new WebResultDto("", "N", "此用户名已被注册!");
}else {
userInfoService.insertUserGroup(groupName, stoArea);
webResultDto = new WebResultDto("","Y","");
}
return webResultDto;
}
例如上述代码 userInfoService.queryUserGroupByName(groupName)就不可能为null。
网上查了一下,在mybatis中
如果返回值是Java集合类型,如List、Map,会先初始化(new一个集合对象),再把结果添加进去。
如果返回值是普通对象,查询不到时,返回值是null。
解决方案:service层稍做处理
@Override public List<UserGroupModel> queryUserGroupByName(String groupName) { // TODO Auto-generated method stub List<UserGroupModel> res = dao.queryUserGroupByName(groupName); if(res.size() == 0) { return null; } return res; }
评论区有朋友好奇如果是基本类型,会出现什么情况?
做了一个简单的测试
@Select("select id from tb_box where box_no = #{name}") int selectId(@Param("name")String name);
如果数据不存在,返回的依然是null,用基本类型来接收则会报错如下:
所以为了健壮性,在mybatis中,除了统计数据,不要用基本类型来接收结果,最好都用包装类型。