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; //接口的抽象方法 下面是对应接口的 ...
随机推荐
- spark
http://www.cnblogs.com/shishanyuan/p/4723604.html?utm_source=tuicool spark presto2.0计算引擎 http://blog ...
- git/gitLab
gitlab安装:http://www.360doc.com/content/15/0603/14/21631240_475362133.shtml http://www.cnblogs.com/wi ...
- POJ 1947 Rebuilding Roads
树形DP..... Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: ...
- Ubuntu 14 安装Java(JRE、JDK)
JRE vs OpenJDK vs Oracle JDK JRE(Java Runtime Environment),它是你运行一个基于Java语言应用程序的所正常需要的环境.如果你不是一个程序员的话 ...
- [Asp.net MVC]Asp.net MVC5系列——第一个项目
目录 概述 创建第一个项目 添加控制器 总结 概述 本教程是个人一步一步学习的总结,希望能帮到正在进入ASP.Net MVC5方向的朋友,个人也是准备进入ASP.NET MVC5领域,虽然艰辛,但是乐 ...
- Android学习笔记(十八)——再谈升级数据库
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 之前我们为了保证数据库中的表是最新的,只是简单地在 onUpgrade()方法中删除掉了当前所有的表,然后强制 ...
- phpstorm的调试工具xdebug
1.需求 知道xdebug的使用方法 2.安装xdebug http://www.awaimai.com/1290.html 3.配置phpstorm http://www.awaimai.com/1 ...
- [COJ0528]BJOI幸运数
[COJ0528]BJOI幸运数 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试 ...
- JQGrid 参数、属性API
JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...
- C语言 homework(4)
#include <stdio.h> int main(){ ; i=; ) { sum+=i; i++; } printf("sum=%d\n",sum); ; } ...