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之多表关联查询的更多相关文章

  1. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  2. Mybatis【15】-- Mybatis一对一多表关联查询

    注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven ...

  3. MyBatis笔记----多表关联查询两种方式实现

    数据库 方式一:XML 按照下面类型建立article表 Article.java package com.ij34.model; public class Article { private int ...

  4. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  5. MyBatis学习总结(三)——多表关联查询与动态SQL

    在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...

  6. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  7. Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...

  8. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  9. MyBatis 多表关联查询

    多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...

随机推荐

  1. ML_R kNN

    邻近算法 K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. ...

  2. POJ 1019 Number Sequence

    找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...

  3. HDOJ 2929 Bigger is Better

    DP....好难的DP... Bigger is Better Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. getRow()方法

    getRow :不是返回行数,而是返回当前是哪一行

  5. PHP预编译处理技术简介

    1.提高数据库的效率:减少编译次数,减少连接次数.当出现当量操作sql语句,比如大量将数据插入数据库中,原来的那种单个执行sql语句或者批量执行sql语句的做法,显然是不可行的,因为无论是单个执行还是 ...

  6. DAY5 php + mysql 写一个简单的sql注入平台

    php mysql 在浏览器输入用户名,去数据库查询.查到则显示在浏览器,查不到则显示空. sql 里面三个字段 id username password create table t1 (id in ...

  7. [BZOJ1662][POJ3252]Round Numbers

    [POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...

  8. git 教程(2)--创建版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  9. [CQOI2011]动态逆序对

    (又是一道树套树……自己真是玩疯了……) (题意略) 从网上也看过题解,好像解法很多……比如CDQ+树状数组,树状数组套主席树,树状数组套平衡树……我用的是树状数组套splay. (我会说是因为我不会 ...

  10. 应用HTK搭建语音拨号系统2:创建单音素HMM模型

    选自:http://maotong.blog.hexun.com/6204849_d.html 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声明:版权所有,转载请注明作者和来源 该系 ...