MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之一:MyBitis入门实例

MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM)

MyBitis(iBitis)系列随笔之三:简单实现CRUD

MyBitis(iBitis)系列随笔之四:多表(多对一查询操作)

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)

MyBitis(iBitis)系列随笔之六:mybitis与spring集成

         这篇博文介绍的是多表中的一对多表关联查询
还是按照上一篇的步骤,先做一些准备工作;创建两张表:一张是用户,一张是用户所对应的移动手机,一户用户可以有部移动手机。
      这是用户t_user表

              
        这是移动电话t_mobile表
              
           在Java实体对象对中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合使用,稍后会做详细配置介绍

          创建表对应的JavaBean对象

Mobile  Bean

[java] view plain copy

 

  1. public class Mobile {  
  2.     private int id;  
  3.     private String telnumber;  
  4.   
  5.     public int getId() {  
  6.         return id;  
  7.     }  
  8.   
  9.     public void setId(int id) {  
  10.         this.id = id;  
  11.     }  
  12.   
  13.     public String getTelnumber() {  
  14.         return telnumber;  
  15.     }  
  16.   
  17.     public void setTelnumber(String telnumber) {  
  18.         this.telnumber = telnumber;  
  19.     }  
  20.   
  21. }  

User Bean

[java] view plain copy

 

  1. package com.jefry;  
  2.   
  3. import java.util.List;  
  4.   
  5. public class User {  
  6.     private int id;  
  7.     private String userName;  
  8.     private String password;  
  9.           private List<Mobile> mobiles; //这里也可以是Set集合  
  10.   
  11.     public List<Mobile> getMobiles() {  
  12.         return mobiles;  
  13.     }  
  14.   
  15.     public void setMobiles(List<Mobile> mobiles) {  
  16.         this.mobiles = mobiles;  
  17.     }  
  18.   
  19.     public String getUserName() {  
  20.         return userName;  
  21.     }  
  22.   
  23.     public void setUserName(String userName) {  
  24.         this.userName = userName;  
  25.     }  
  26.   
  27.     public String getPassword() {  
  28.         return password;  
  29.     }  
  30.   
  31.     public void setPassword(String password) {  
  32.         this.password = password;  
  33.     }  
  34.   
  35.     public int getId() {  
  36.         return id;  
  37.     }  
  38.   
  39.     public void setId(int id) {  
  40.         this.id = id;  
  41.     }  
  42.   
  43. }  

 

在上一篇的基础上改写映射文件:

[html] view plain copy

 

  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="user">  
  6.      <resultMap id="userResultMap" type="User">   
  7.         <id property="id" column="id" javaType="int" jdbcType="INTEGER" />  
  8.         <result property="userName" column="name" javaType="string" jdbcType="VARCHAR"/>  
  9.         <result property="password" column="pass" javaType="string" jdbcType="VARCHAR"/>  
  10.         <collection property="mobiles" column="userid" ofType="Mobile">    
  11.             <id property="id" column="id" javaType="int" jdbcType="INTEGER"/>    
  12.             <result property="telnumber" column="telnumber" javaType="string" jdbcType="VARCHAR"/>    
  13.         </collection>    
  14.      </resultMap>  
  15.       
  16.     <!--多表查询操作-->  
  17.     <select id="selectUser" parameterType="int"  resultMap="userResultMap" >  
  18.         <!--分别为mobile的主键id与user的主键id赋值别名,避免因为两个表字段名称相同而注入到对应对象名称冲突-->  
  19.         select m.id m_id,m.telnumber,u.id u_id,u.name,u.pass from t_mobile m,t_user u where m.userid = u.id and u.id = #{id}   
  20.     </select>  
  21. </mapper>  

 

最后,通过测试OK

 

[java] view plain copy

 

  1. public class Test {  
  2.     static String resource = "mybatis-config.xml";  
  3.   
  4.     public static void main(String[] args) throws IOException {  
  5.         InputStream inputStream = Resources.getResourceAsStream(resource);  
  6.         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
  7.         SqlSession session = sqlSessionFactory.openSession();  
  8.         try {  
  9.             User user = session.selectOne("user.selectUser", 1);  
  10.             List<Mobile> mobiles = user.getMobiles();  
  11.             for(Mobile mobile : mobiles) {  
  12.                 System.out.println("user:" + user.getUserName() + ",tel:" + mobile.getTelnumber());  
  13.             }  
  14.               
  15.               
  16.         } finally {  
  17.             session.close();  
  18.         }  
  19.     }  
  20.   
  21. }  

源码下载:http://download.csdn.net/detail/jefry_xdz/5229451

http://blog.csdn.net/jefry_xdz/article/details/8767358

 http://www.cnblogs.com/yinkh/p/5564033.html

时间: 2024-09-21 07:50:38

MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)的相关文章

NHibernate之旅(10):探索父子(一对多)关联查询

本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NHibernate查询语言(HQL,NHibernate Query Language).条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况).原生SQL(Literal SQL,T-SQL.PL/SQL).这一节分别使用这三种方式来

mysql一对多关联查询的时候筛选条件

  mysql实现users 表和 logoin_log表是一对多, 现在是把user的信息找出来 关联上一些 logoin_log表的数据, 因为a表是多的一方,要多他的数据进行一些条件匹配,这个sql目的是查出每个用户的最新的log记录 有的人建议进行表连接来进行筛选,不过那样很麻烦,小涛我断然拒绝了,然后我采用了另一个巧妙的方法: 列表的时候采用先查一个表,这里查的是users表,然后再传值到方法,该方法进行封装查询logoin_log,此时要通过id倒序排列,返回相应的值,这样就可以获得

数据库中几个表之间的关联查询

数据|数据库    在数据库操作中,有很多时候不是对某一个表进行数据库操作,通常还会把其他表的字段的值也传递过来.不过这连个表不是没有关系的.通常通过索引或者健关联起来        如下为一个例子.        表一.表名称tb1.其中studentID为主索引.外健. studentID studentName studentGender studntAge 3102079014 刘永相 男 25 3102079015 赵某某 男 23        表二.表名称tb2.其中teacher

【T-SQL系列】临时表、表变量

原文:[T-SQL系列]临时表.表变量 临时表临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Server的系统日志,虽它们在Tempdb中体现,是分配在内存中的,它们也支持物理的磁盘,但用户在指定的磁盘里看不到文件. 临时表分为本地和全局两种,本地临时表的名称都是以"#"为前缀,只有在本地当前的用户连接中才是可见的,当用户从实例断开连接时被删除.全局临时表的名称都

【SSH系列】Hibernate映射 -- 一对多关联映射

     映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个外键,指向一的一段,关联关系都是在多的一端进行维护,只是我们在写映射的时候发生了变化.       一对多和多对一的映射原理是一样的,但是她们之间也存在着小小的区别,毕竟世界上没有两片完全相同的叶子,她们之间的区别就是维护的关系不同,我们先来看多对一,多端维护一端的关系,在加载多端的时候,可以将一

SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识.   通过前面几篇文章介

[NHibernate]一对多关系(关联查询)

目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关系的关联查询.前面文章中也介绍的nhibernate的查询:HQL,条件查询,原生SQL查询. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernat

HTAP数据库 PostgreSQL 场景与性能测试之 4 - (OLAP) 大表OUTER JOIN统计查询

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

sql查询-java 一对多分页 查询 如何实现

问题描述 java 一对多分页 查询 如何实现 有四个表,主表a,子表b c d,a和b是一对多,a和c是一对多,b和d是一对多,想要对主要a做分页查询, 同时查询出字表b c d的数据,用mybits,如何查询?是先查主表a,再分别查询子表,也就是一共四个sql查询,还是用表连接查询呢? 解决方案 http://www.oschina.net/question/144009_146528?sort=time http://blog.csdn.net/zhangweiwtmdbf/article