0
点赞
收藏
分享

微信扫一扫

Mybatis表级联返回结果类型不唯一,如何使用HashMap完成表级联


起因

在写毕业设计的过程中,设计了两张表,其中一张表是用户表User(uid,name,username,password),
还有一张表是菜单表Menu(mid,mname,menuContent,uid)。
而在主页显示菜品展示的时候,如下图

Mybatis表级联返回结果类型不唯一,如何使用HashMap完成表级联_hashmap

此处显示的用户名字和菜单表不是在一个表中的,所以在用到Mybatis时需要将两个表级联,让结果集中含有用户表中的用户名,而此处遇到的问题是Mybatis的映射文件中返回的结果集合应该写什么?返回了两种类型。。

解决方案

在Mybatis的mapper.xml中,我们可以采用快捷便利的面向接口化编程,不采用去配置一大堆表中和实体的属性对应关系,所以代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sy.graduation.dao.MenuDao">
<!-- 目的:为DAO接口方法提供sql语句配置 -->

<!-- 此处用HashMap可以完成表的级联查询,结果集放入HashMap<String,Object>中 -->
<select id="queryAll" resultType="java.util.HashMap">
select a.*,b.name as name from menu a left join user b on a.uid = b.uid
</select>
</mapper>

采用了面向接口化的编程方式,我们需要在mapper后的属性配置上命名空间,让他扫描我们对应的Dao层,同时select后的id属性对应你Dao层中写的方法名称,例如我这里id=queryAll,那么我的MenuDao层中就是有一个queryAll的方法的。

通过此处的resultType=”java.util.HashMap”,返回的结果集放入hashmap中,这样就达到了不同返回值的类型想要的结果。

对应来看DAO层:

public interface MenuDao {

/**
* 查询全部菜谱
* @return
*/
List<HashMap<String,Object>> queryAll();
}

对应的Service的实现类:

@Service
//这里做了一个事务层
@Transactional
public class MenuServiceImpl implements MenuService{

@Autowired
private MenuDao menuDao;

//查询所有菜谱
@Override
public List<HashMap<String,Object>> queryAll() {
List<HashMap<String,Object>> list = menuDao.queryAll();
return list;
}
}

Controller层:

@Controller
@RequestMapping("/foodshare")
public class foodShareController {


@Autowired
private MenuService menuSerivce;

//查询所有菜谱,显示在首页上
//此处因为queryAll中级联了另一张表的uname,所以返回类型使用List<HashMap<String,Object>>
@RequestMapping("/index")
public String queryAll(Model model){
List<HashMap<String,Object>> list = menuSerivce.queryAll();
model.addAttribute("list", list);
return "index";
}

这样配置完成后,Controller返回的list中就可以包含了对应sql语句中的级联后的结果,然后将list放入“list”,最终在jsp上可以通过el表达式去将我想要的用户名显示在前端网页上。

JSP,通过遍历将结果集取出来:

<c:forEach var="menu" items="${list}" >
<div class="col-xs-6 col-sm-4">
<img src="/pic/${menu.fileinputurl}" class="img-responsive" />
<p>
<a href="<%=basePath%>foodshare/${menu.menuid}/showDetailMenu">${menu.menuname}</a>
</p>
<p>
by <a href="<%=basePath%>foodshare/personalCenter">${menu.name}</a>
</p>
</div>
</c:forEach>

结论

若用Mybatis遇到表的级联时,而返回的结果集并非唯一,我们可以采用返回类型为HashMap的形式,这样可以成功的遍历出你想要的结果。


举报

相关推荐

0 条评论