MyBatis之多表关联查询
1使用resultType、ResultMap处理返回结果
处理返回结果
resultType:指定返回值结果的完全限定名,处理多表查询的结果。
多表查询需要定义vo封装查询的结果。
需求:查询部门和部门下对应的岗位
部门名称 岗位名称
办公室 职员
办公室 主人
1.1 建立Post的实体类
package org.guangsoft.entity;
/**
* 岗位的实体类
* @author guanghe
*/
public class Post
{
private Integer pid;
private String pname;
private String pdesc;
public Integer getPid()
{
return pid;
}
public void setPid(Integer pid)
{
this.pid = pid;
}
public String getPname()
{
return pname;
}
public void setPname(String pname)
{
this.pname = pname;
}
public String getPdesc()
{
return pdesc;
}
public void setPdesc(String pdesc)
{
this.pdesc = pdesc;
} }
1.2DeptMapper接口添加方法
package org.guangsoft.mapper; import java.util.List; import org.guangsoft.entity.Dept;
import org.guangsoft.vo.DeptVo; public interface DeptMapper
{
public List<DeptVo> getDeptPost(); public List<Dept> getDeptPostList();
}
1.3DeptMapperImpl中重写方法
package org.guangsoft.mapper.impl; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.guangsoft.entity.Dept;
import org.guangsoft.mapper.DeptMapper;
import org.guangsoft.vo.DeptVo; public class DeptMapperImpl implements DeptMapper
{ @Override
public List<DeptVo> getDeptPost()
{
//创建sqlSessionFactory对象
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
List<DeptVo> dlist = sqlSession.selectList("dept.getDeptPost");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
return dlist;
} @Override
public List<Dept> getDeptPostList()
{
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class.
getClassLoader().getResourceAsStream("MyBatis.xml"));
//产生SqlSesion兑现
SqlSession sqlSession = ssf.openSession();
//进行数据的crud操作
List<Dept> dlist = sqlSession.selectList("dept.getDeptPostList");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
return dlist;
} }
1.4建立Post岗位信息表
/*
Navicat MySQL Data Transfer Source Server : MySQL
Source Server Version : 50715
Source Host : localhost:3306
Source Database : test Target Server Type : MYSQL
Target Server Version : 50715
File Encoding : 65001 Date: 2016-12-13 20:50:00
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for post
-- ----------------------------
DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(255) DEFAULT NULL,
`pdesc` varchar(255) DEFAULT NULL,
`did` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`),
KEY `fk_did` (`did`),
CONSTRAINT `fk_did` FOREIGN KEY (`did`) REFERENCES `dept` (`did`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
1.5DeptMapper.xml定义操作
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dept">
<select id="getDeptPost" resultType="org.guangsoft.vo.DeptVo">
select did,dname,pname from dept inner join post on dept.did = post.did
</select>
<resultMap type="org.guangsoft.entity.Dept" id="deptPost">
<id property="did" column="did"></id>
<result property="dname" column="dname" javaType="java.lang.String"></result>
<collection property="posts" ofType="org.guangsoft.entity.Post">
<id property="pid" column="pid"></id>
<result property="pname" column="pname" javaType="java.lang.String"></result>
<result property="pdesc" column="pdesc" javaType="java.lang.String"></result>
</collection>
</resultMap>
<select id="getDeptPostList" resultMap="deptPost">
select * from dept inner join post
on dept.did = post.did
</select>
</mapper>
1.6添加测试方法
package org.guangsoft.test; import java.util.List; import org.guangsoft.entity.Dept;
import org.guangsoft.entity.Post;
import org.guangsoft.mapper.DeptMapper;
import org.guangsoft.mapper.impl.DeptMapperImpl;
import org.guangsoft.vo.DeptVo;
import org.junit.Test; public class TestDeptMapper
{
DeptMapper deptMapper = new DeptMapperImpl(); @Test
public void testGetDeptVo()
{
List<DeptVo> dlist = deptMapper.getDeptPost();
for(DeptVo deptVo : dlist)
{
System.out.println(deptVo.getDid() +
" " + deptVo.getDname() + deptVo.getPname());
}
} @Test
public void testGetDeptList()
{
List<Dept> dlist = deptMapper.getDeptPostList();
for(Dept dept : dlist)
{
System.out.println(dept.getDname());
List<Post> postList = dept.getPosts();
for(Post post : postList)
{
System.out.println(post.getPname());
}
}
} }
2返回值结果的处理总结
使用resultType:指定的是返回值类型的完全限定名,只能用在单表查询或者定义vo的情况,如果是定义vo不能将关联的数据封装为需要获得某个类的对象
使用resultMap:不需要定义vo类,将关联数据对应的类,作为另外一个类的属性。
第一步:定义resultMap
第二步:引用resultMap
使用resultMap:用来多表关联的复杂查询中,通过需要将关联查询的数据封装为某个实体类对象,如果有特殊业务需要或者说明需要将管理数据封装为实体类的对象,使用resultMap
MyBatis之多表关联查询的更多相关文章
- MyBatis 中两表关联查询MYSQL (14)
MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...
- Mybatis【15】-- Mybatis一对一多表关联查询
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven ...
- MyBatis笔记----多表关联查询两种方式实现
数据库 方式一:XML 按照下面类型建立article表 Article.java package com.ij34.model; public class Article { private int ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
随机推荐
- 第一个C++例子
#include <iostream> using namespace std; class Time { private: int hour; int minute; int secon ...
- Mac Pro 软件收藏
记录下Pro Mac中安装过的软件: 编号 软件名 功能说明 1 QQ 2 微信 3 搜狗输入法 4 Chrome 浏览器 Chrome 及其 插件“个性化设置”备份 5 360云盘 ...
- fileUpload1.HasFile的返回值永远都是false的问题处理
在aspnet项目中,如果有页面使用了fileupload,不巧你也在此页面使用了updatepanel局部刷新控件,那马就会出现一个很奇怪的问题:就是不管你选择文件了没有,fileUpload1.H ...
- 浅析for in 和for的区别
区别一: for in是javascript 1.0 中发布的. for each in是作为E4X标准的一部分在javascript 1.6中发布的,而它不是ECMAScript标准的一部分. 这将 ...
- jQuery对话框插件 ThickBox
http://baike.haosou.com/doc/7607201-7881296.html 项目已经停止维护,但该插件还是不错的! ThickBox是一个基于JQuery类库的扩展,它能在浏览器 ...
- Android内存性能优化(内部资料总结) eoe转载
刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...
- hdu4747——Mex
1.题目大意:对一个序列的每一个区间求Mex,最后所有的mex相加(mex就是SG的那个),力求nlogn... 2.分析:最近开始刷线段树了,还是有很多不会啊 首先把1-1 1-2 1-- 1-n这 ...
- 分析Masonry
一. 继承关系 1.MASConstraint (abstract) MASViewContraint MASComposisionConstraint 2. UIView NSLayoutConst ...
- ubuntu: NO_PUBKEY 8D5A09DC9B929006
最近使用ubuntu16.04时,运行 sudo apt-get update 时出现如下错误: W: GPG error: http://archive.ubuntukylin.com:10006/ ...
- 关于ubuntukylin安装后界面中英文混杂的问题
起因 一直使用的是ubuntu原版的系统,ubuntukylin出来后也没用使用过.一次去其论坛逛了一圈之后决定使用一下. 安装后的截面和ubuntu原版的差不多,还是挺漂亮的. 但是有一个问题是,安 ...