内容简介: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的形式,这样可以成功的遍历出你想要的结果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- objective-c -gdb remote返回错误:E08调用完成块时(EXC_BAD_ACCESS)
- C# 永远不会返回的方法真的不会返回
- iOS之导航返回上上个控制器或指定返回某个控制器
- MyBatis返回Map
- (译)从路由返回数据
- c++ 为什么在返回从函数的返回类型派生的类型的本地对象时,没有选择move构造函数?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++ Primer Plus
Stephen Prata / Addison Wesley / 2011-10-18 / GBP 39.99
C++ Primer Plus, Sixth Edition New C++11 Coverage C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible an......一起来看看 《C++ Primer Plus》 这本书的介绍吧!