MyBatis之多表关联查询


1使用resultType、ResultMap处理返回结果

处理返回结果

resultType:指定返回值结果的完全限定名,处理多表查询的结果。

多表查询需要定义vo封装查询的结果。

需求:查询部门和部门下对应的岗位

部门名称     岗位名称

办公室        职员

办公室        主人

1.1 建立Post的实体类

 1 package org.guangsoft.entity;  2 /**
 3  * 岗位的实体类  4  * @author guanghe  5  */
 6 public class Post  7 {  8     private Integer pid;  9     private String pname; 10     private String pdesc; 11     public Integer getPid() 12  { 13         return pid; 14  } 15     public void setPid(Integer pid) 16  { 17         this.pid = pid; 18  } 19     public String getPname() 20  { 21         return pname; 22  } 23     public void setPname(String pname) 24  { 25         this.pname = pname; 26  } 27     public String getPdesc() 28  { 29         return pdesc; 30  } 31     public void setPdesc(String pdesc) 32  { 33         this.pdesc = pdesc; 34  } 35     
36 }

1.2DeptMapper接口添加方法

 1 package org.guangsoft.mapper;  2 
 3 import java.util.List;  4 
 5 import org.guangsoft.entity.Dept;  6 import org.guangsoft.vo.DeptVo;  7 
 8 public interface DeptMapper  9 { 10     public List<DeptVo> getDeptPost(); 11 
12     public List<Dept> getDeptPostList(); 13 } 

1.3DeptMapperImpl中重写方法

 1 package org.guangsoft.mapper.impl;  2 
 3 import java.util.List;  4 
 5 import org.apache.ibatis.session.SqlSession;  6 import org.apache.ibatis.session.SqlSessionFactory;  7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;  8 import org.guangsoft.entity.Dept;  9 import org.guangsoft.mapper.DeptMapper; 10 import org.guangsoft.vo.DeptVo; 11 
12 public class DeptMapperImpl implements DeptMapper 13 { 14     
15  @Override 16     public List<DeptVo> getDeptPost() 17  { 18         //创建sqlSessionFactory对象
19         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); 20         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class. 21                 getClassLoader().getResourceAsStream("MyBatis.xml")); 22         //产生SqlSesion兑现
23         SqlSession sqlSession = ssf.openSession(); 24         //进行数据的crud操作
25         List<DeptVo> dlist = sqlSession.selectList("dept.getDeptPost"); 26         //提交事务
27  sqlSession.commit(); 28         //释放资源
29  sqlSession.close(); 30         return dlist; 31  } 32 
33  @Override 34     public List<Dept> getDeptPostList() 35  { 36         SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder(); 37         SqlSessionFactory ssf = ssfb.build(DeptMapperImpl.class. 38                 getClassLoader().getResourceAsStream("MyBatis.xml")); 39         //产生SqlSesion兑现
40         SqlSession sqlSession = ssf.openSession(); 41         //进行数据的crud操作
42         List<Dept> dlist = sqlSession.selectList("dept.getDeptPostList"); 43         //提交事务
44  sqlSession.commit(); 45         //释放资源
46  sqlSession.close(); 47         return dlist; 48  } 49 
50 }

1.4建立Post岗位信息表

 1 /*
 2 Navicat MySQL Data Transfer  3 
 4 Source Server : MySQL  5 Source Server Version : 50715  6 Source Host : localhost:3306  7 Source Database : test  8 
 9 Target Server Type : MYSQL 10 Target Server Version : 50715 11 File Encoding : 65001 12 
13 Date: 2016-12-13 20:50:00 14 */
15 
16 SET FOREIGN_KEY_CHECKS=0; 17 
18 -- ----------------------------
19 -- Table structure for post
20 -- ----------------------------
21 DROP TABLE IF EXISTS `post`; 22 CREATE TABLE `post` ( 23   `pid` int(11) NOT NULL AUTO_INCREMENT, 24   `pname` varchar(255) DEFAULT NULL, 25   `pdesc` varchar(255) DEFAULT NULL, 26   `did` int(11) DEFAULT NULL, 27   PRIMARY KEY (`pid`), 28   KEY `fk_did` (`did`), 29   CONSTRAINT `fk_did` FOREIGN KEY (`did`) REFERENCES `dept` (`did`) 30 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

1.5DeptMapper.xml定义操作

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="dept">
 4     <select id="getDeptPost" resultType="org.guangsoft.vo.DeptVo">
 5  select did,dname,pname from dept inner join post on dept.did = post.did  6     </select>
 7     <resultMap type="org.guangsoft.entity.Dept" id="deptPost">
 8         <id property="did" column="did"></id>
 9         <result property="dname" column="dname" javaType="java.lang.String"></result>
10         <collection property="posts" ofType="org.guangsoft.entity.Post">
11             <id property="pid" column="pid"></id>
12             <result property="pname" column="pname" javaType="java.lang.String"></result>
13             <result property="pdesc" column="pdesc" javaType="java.lang.String"></result>
14         </collection>
15     </resultMap>
16     <select id="getDeptPostList" resultMap="deptPost">
17  select * from dept inner join post 18  on dept.did = post.did 19     </select>
20 </mapper>

1.6添加测试方法

 1 package org.guangsoft.test;  2 
 3 import java.util.List;  4 
 5 import org.guangsoft.entity.Dept;  6 import org.guangsoft.entity.Post;  7 import org.guangsoft.mapper.DeptMapper;  8 import org.guangsoft.mapper.impl.DeptMapperImpl;  9 import org.guangsoft.vo.DeptVo; 10 import org.junit.Test; 11 
12 public class TestDeptMapper 13 { 14     DeptMapper deptMapper = new DeptMapperImpl(); 15     
16  @Test 17     public void testGetDeptVo() 18  { 19         List<DeptVo> dlist = deptMapper.getDeptPost(); 20         for(DeptVo deptVo : dlist) 21  { 22             System.out.println(deptVo.getDid() + 
23                 " " + deptVo.getDname() + deptVo.getPname()); 24  } 25  } 26     
27  @Test 28     public void testGetDeptList() 29  { 30         List<Dept> dlist = deptMapper.getDeptPostList(); 31         for(Dept dept : dlist) 32  { 33  System.out.println(dept.getDname()); 34             List<Post> postList = dept.getPosts(); 35             for(Post post : postList) 36  { 37  System.out.println(post.getPname()); 38  } 39  } 40  } 41     
42

2返回值结果的处理总结

使用resultType:指定的是返回值类型的完全限定名,只能用在单表查询或者定义vo的情况,如果是定义vo不能将关联的数据封装为需要获得某个类的对象

使用resultMap:不需要定义vo类,将关联数据对应的类,作为另外一个类的属性。

      第一步:定义resultMap

      第二步:引用resultMap

      使用resultMap:用来多表关联的复杂查询中,通过需要将关联查询的数据封装为某个实体类对象,如果有特殊业务需要或者说明需要将管理数据封装为实体类的对象,使用resultMap

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM