Mybatis最入门---ResultMaps实例篇(一对多查询)

接上文,我们来演示在实际开发中,如何配置和使用resultMap实现一对多查询。

准备工作:

a.操作系统 :win7 x64

b.基本软件:MySQL,Mybatis,spring,SQLyog,Tomcat,web基础

特别的,作为演示程序,还请各位看官不要纠结数据库的细节内容

-------------------------------------------------------------------------------------------------------------------------------------

1.首先,复制上文工程,重命名为Mybatis05,工程结构图如下:


2.上文中,我们演示了:一个人对应一条个人信息。但是,如果我们根据部门来查询用户的话,就是典型的一对多的关系了。为了演示一对多关系查询的实现,我们需要现在数据库中,创建一个部门表。所有表结构如下:


各表中的数据如下:



3.鉴于篇幅的关系,重复的文件请各位看官参照上文创建,这里我们只说明有修改的文件。

4.新增Departments.Java文件,具体内容如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.csdn.ingo.entity;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.List;  
  5.   
  6. /** 
  7. *@author 作者 E-mail:ingo 
  8. *@version 创建时间:2016年4月21日下午9:07:15 
  9. *类说明 
  10. */  
  11. @SuppressWarnings("serial")  
  12. public class Departments implements Serializable{  
  13.       
  14.     private String id;  
  15.     private String departmentName;  
  16.     private List<UserInfo> userInfos;  
  17.     public String getId() {  
  18.         return id;  
  19.     }  
  20.     public void setId(String id) {  
  21.         this.id = id;  
  22.     }  
  23.     public String getDepartmentName() {  
  24.         return departmentName;  
  25.     }  
  26.     public void setDepartmentName(String departmentName) {  
  27.         this.departmentName = departmentName;  
  28.     }  
  29.     public List<UserInfo> getUserInfos() {  
  30.         return userInfos;  
  31.     }  
  32.     public void setUserInfos(List<UserInfo> userInfos) {  
  33.         this.userInfos = userInfos;  
  34.     }  
  35.     public Departments(String id, String departmentName, List<UserInfo> userInfos) {  
  36.         super();  
  37.         this.id = id;  
  38.         this.departmentName = departmentName;  
  39.         this.userInfos = userInfos;  
  40.     }  
  41.     public Departments() {  
  42.         super();  
  43.         // TODO Auto-generated constructor stub  
  44.     }  
  45.     @Override  
  46.     public String toString() {  
  47.         return "Departments [id=" + id + ", departmentName=" + departmentName + ", userInfos=" + userInfos.toString() + "]";  
  48.     }  
  49.       
  50. }  
5.新增DepartmentsDao.java文件,具体内容如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.csdn.ingo.dao;  
  2.   
  3. import com.csdn.ingo.entity.Departments;  
  4.   
  5. /** 
  6. *@author 作者 E-mail:ingo 
  7. *@version 创建时间:2016年4月21日下午9:09:33 
  8. *类说明 
  9. */  
  10. public interface DepartmentsDao {  
  11.     Departments findDepartmentById(String id);  
  12. }  
6.新增DepartmentsDaoMapper.xml文件,具体内容如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="com.csdn.ingo.dao.DepartmentsDao">  
  6.     <resultMap type="Departments" id="DepartmentsResult">  
  7.         <id property="id" column="id" />  
  8.         <result property="departmentName" column="departmentName" />  
  9.         <collection property="userInfos" column="id" select="com.csdn.ingo.dao.UserInfoDao.findUserInfoByDepartmentId"></collection>  
  10.     </resultMap>  
  11.     <select id="findDepartmentById" parameterType="String" resultMap="DepartmentsResult">  
  12.         select * from departments where id=#{id}  
  13.     </select>  
  14. </mapper>   
7.修改UserInfoDao.java,具体内容如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public interface UserInfoDao {  
  2.     UserInfo findUserInfoById(String id);  
  3.   
  4.     UserInfo findUserInfoByDepartmentId(String id);  
  5. }  
8.在UserInfoMapper.xml,新增如下内容:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <select id="findUserInfoByDepartmentId" parameterType="String" resultMap="UserInfoResult">  
  2.         select * from userinfo where department=#{id}  
  3.     </select>   
9.新增单元测试方法:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2.     public void testSeletDepartment() {  
  3.         DepartmentsDao userDao = sqlSession.getMapper(DepartmentsDao.class);  
  4.         String id = "2";  
  5.         Departments curUser = userDao.findDepartmentById(id);  
  6.         if(curUser!=null){  
  7.             log.info("成功找到用户:"+curUser.toString());  
  8.         }  
10.测试方法,运行单元测试方法,观察控制台有如下输出:


[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 成功找到用户:Departments [id=2, departmentName=销售部, userInfos=[UserInfo [userid=customer, department=2, position=售前, mobile=33334444, gender=1, email=customer@email.com], UserInfo [userid=customer2, department=2, position=售后, mobile=55556666, gender=1, email=customer@email.com]]]  
  2.  INFO [main] - 方法执行后调用  
鉴于截图大小的关系,我们单独给出运行结果,请各位读者做参考。

--------------------------------------------------------------------------------------------------------------------------------------------------------

特别的:请读者特别关注表之间的关系,resultMap的书写方式,collection的书写方式,column的配置,如有疑问,请参考前面《Mybatis最入门---ResultMaps高级用法(上)》中的内容

--------------------------------------------------------------------------------------------------------------------------------------------------------
如果又细心的读者,或许已经发现,我们设计的表结构关系是user表--->userinfo表--->departments表。换句话说,我们使用user表中的变量是无法查到部门表的信息的。另外,我们实际也遇到这样的例子,人员的属性中存在多个集合属性,如,基本信息是一个集合,兴趣爱好是一个集合等等。有时为了完整的描述一个对象,需要使用多个集合属性来描述。因此,我们在这里在演示一个对象中多个集合的查询操作的实现。

1.首先,我们要在User中增加department属性,如下:【注意:我们只修改对象,并没有修改数据库】

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @SuppressWarnings("serial")  
  2. public class User implements Serializable{  
  3.       
  4.     private String id;  
  5.     private String password;  
  6.     private UserInfo userInfo;  
  7.     private Departments department;  
  8. //....set  
  9. //...get  
  10. //...构造函数  
  11. //..toString()  
  12. }  
2.修改UserMapper.xml中的resultMap,修改之后的内容为:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <resultMap type="user" id="UserResult">  
  2.         <id property="id" column="id" />  
  3.         <result property="password" column="password" />  
  4.         <association property="userInfo" column="userid"  
  5.             select="com.csdn.ingo.dao.UserInfoDao.findUserInfoById"></association>  
  6.         <association property="department" column="department"  
  7.             select="com.csdn.ingo.dao.DepartmentsDao.findDepartmentById"></association>  
  8.     </resultMap>  
3.新建单元测试方法,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Test  
  2. public void testSeletDepartmentAndInfo() {  
  3.     try{  
  4.     UserDao userDao = sqlSession.getMapper(UserDao.class);  
  5.     String id = "admin";  
  6.     User curUser = userDao.findUserInfoById(id);  
  7.     if(curUser!=null){  
  8.         log.info("成功找到用户:"+curUser.toString());  
  9.     }  
  10.     }catch(Exception e){  
  11.         e.printStackTrace();  
  12.     }  
  13. }  

4.测试方法:运行单元测试,观察控制台输出,有如下结果;


完整输出为:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 成功找到用户:User [id=admin, password=admin, userInfo=UserInfo [userid=admin, department=1, position=工程师, mobile=11112222, gender=1, email=admin@email.com], department=Departments [id=1, departmentName=开发部, userInfos=[UserInfo [userid=admin, department=1, position=工程师, mobile=11112222, gender=1, email=admin@email.com]]]]  
  2.  -   
输出内容仅供参考,各位看官只要看到类似输出即可。
-------------------------------------------------------------------------------------------------------------------------------------

至此,Mybatis最入门---ResultMaps实例篇(一对多查询)结束


特别备注:

这两篇的实例,请各位看官一定手动敲一遍,遇到不懂配置的地方请查看前文详细说明。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值