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

起因

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

这里写图片描述

此处显示的用户名字和菜单表不是在一个表中的,所以在用到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的形式,这样可以成功的遍历出你想要的结果。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值