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

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

内容简介: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的形式,这样可以成功的遍历出你想要的结果。


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

查看所有标签

猜你喜欢:

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

Head First Python

Head First Python

Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99

Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码