内容简介: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构造函数?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。