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

栏目: 数据库 · 发布时间: 6年前

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

起因

在写毕业设计的过程中,设计了两张表,其中一张表是用户表User(uid,name,username,password),

还有一张表是菜单表Menu(mid,mname,menuContent,uid)。

而在主页显示菜品展示的时候,如下图

Mybatis表级联返回结果类型不唯一,如何使用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的形式,这样可以成功的遍历出你想要的结果。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX系统编程: 通信、并发与线程

UNIX系统编程: 通信、并发与线程

【美】Kay Robbins、Steve Robbins / 师蓉 / 电子工业出版社 / 2018-5 / 198

《UNIX系统编程: 通信、并发与线程》是一本基于最新UNIX标准的完备的参考书,对UNIX编程的要点进行了清晰易懂的介绍,从一些用于说明如何使用系统调用的短小代码段开始,逐渐过渡到能帮助读者扩展自己技能水平的实际项目中。《UNIX系统编程: 通信、并发与线程》中对通信、并发和线程问题进行了深入探讨,对复杂的概念(如信号和并发)进行了全面且清晰的解释,还覆盖了与文件、信号、信号量、POSIX线程和......一起来看看 《UNIX系统编程: 通信、并发与线程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具