注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-11-one2one,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星。

docsify文档地址在:https://damaer.github.io/Mybatis-Learning/#/

所谓一对一多表查询,举个例子:我们有很多国家,每一个国家只有一个领导人(假设),我们需要根据id查询国家信息,带上领导人的信息。

创建数据表

设计表的时候,我们需要考虑由于是一对多关系,我们需要在国家表里面使用一个字段对应领导人的信息。

#创建数据库CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;#创建数据表CREATE TABLE `test`.`country` ( `cid` INT(10) NOT NULL AUTO_INCREMENT ,`cname` VARCHAR(20) NOT NULL ,`mid` INT(10) NOT NULL,PRIMARY KEY(`cid`)) ENGINE = MyISAM;CREATE TABLE `test`.`minister` ( `mid` INT(10) NOT NULL AUTO_INCREMENT ,`mname` VARCHAR(20) NOT NULL,PRIMARY KEY(`mid`)) ENGINE = MyISAM;

#初始化数据表INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('1', 'aaa', '1'); INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('2', 'bbb', '2');INSERT INTO `country` (`cid`, `cname`, `mid`) VALUES ('3', 'ccc', '3'); 

INSERT INTO `minister` (`mid`, `mname`) VALUES ('1', 'sam'); INSERT INTO `minister` (`mid`, `mname`) VALUES ('2', 'jane'); INSERT INTO `minister` (`mid`, `mname`) VALUES ('3', 'jone'); 

数据表如下:

实体类

country对应的实体类:

public class Country { private Integer cid; private String cname; private Minister minister;

 public Integer getCid() {  return cid; }

 public void setCid(Integer cid) {  this.cid = cid; }

 public String getCname() {  return cname; }

 public void setCname(String cname) {  this.cname = cname; }

 public Minister getMinister() {  return minister; }

 public void setMinister(Minister minister) {  this.minister = minister; }

 @Override public String toString() {  return "Country{" +      "cid=" + cid +      ", cname='" + cname + '\'' +      ", minister=" + minister +      '}'; }}

Minister对应的实体类:

public class Minister { private Integer mid; private String mname; @Override public String toString() {  return "Minister [mid=" + mid + ", mname=" + mname + "]"; } public Integer getMid() {  return mid; } public void setMid(Integer mid) {  this.mid = mid; } public String getMname() {  return mname; } public void setMname(String mname) {  this.mname = mname; }

}

MybatisUtils工具类,用于获取单例的sqlSession对象:

public class MyBatisUtils {    static private SqlSessionFactory sqlSessionFactory;

    static public SqlSession getSqlSession() {        InputStream is;        try {            is = Resources.getResourceAsStream("mybatis.xml");            if (sqlSessionFactory == null) {                sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);            }            return sqlSessionFactory.openSession();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }}

mybatis.xml里面注册mapper文件:

<mappers>    <mapper resource="mapper/mapper.xml"/>mappers>

我们的两个接口(对应mapper文件中的两个sql语句):

public interface ICountryDao { Country selectCountryById(int cid); Country selectCountryById2(int cid);}

mapper文件,有两种写法,一种是嵌套结果,一种是嵌套查询

  • 嵌套结果的就是使用一条sql完成查询,需要在自己定义的resultMap里面使用来组织结果属性。

  • 嵌套查询也有一个,但是在最外面的标签并没有将所有需要的东西查询出来,而是在里面指定需要关联查询的sql语句的id,这样的方式就是懒加载:

<?xml  version="1.0" encoding="UTF-8"?>mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="dao.ICountryDao">

 <select id="selectMinisterByCountry" resultType="Minister"> select mid,mname from minister where mid=#{ooo} select> <resultMap type="Country" id="countryMapper">  <id column="cid" property="cid"/>  <result column="cname" property="cname"/>

  <association property="minister"select="selectMinisterByCountry"column="mid">  association> resultMap> <select id="selectCountryById" resultMap="countryMapper">  select cid,cname,mid  from country   where   cid=#{cid} select>

    <select id="selectCountryById2" resultMap="countryMapper2">        select * from country c,minister m where c.mid = m.mid and c.cid= #{cid}    select>    <resultMap id="countryMapper2" type="Country">        <id column="cid" property="cid"/>        <result column="cname" property="cname"/>        <association property="minister" javaType="Minister">   <id property="mid" column="mid"/>   <result property="mname" column="mname"/>  association>    resultMap>mapper>

单元测试:

public class MyTest {  private ICountryDao dao;  private SqlSession sqlSession;  @Before  public void Before(){    sqlSession=MyBatisUtils.getSqlSession();    dao=sqlSession.getMapper(ICountryDao.class);  }  @Test  public void TestselectCountryById(){    Country country=dao.selectCountryById(1);    System.out.println(country);  }

  @Test  public void TestselectCountryById2(){    Country country=dao.selectCountryById2(1);    System.out.println(country);  }

  @After  public void after(){    if(sqlSession!=null){      sqlSession.close();    }  }

}

结果:

[service] 2018-07-12 15:23:38,971 - dao.ICountryDao.selectCountryById -537  [main] DEBUG dao.ICountryDao.selectCountryById  - ==>  Preparing: select cid,cname,mid from country where cid=? [service] 2018-07-12 15:23:39,004 - dao.ICountryDao.selectCountryById -570  [main] DEBUG dao.ICountryDao.selectCountryById  - ==> Parameters: 1(Integer)[service] 2018-07-12 15:23:39,037 - dao.ICountryDao.selectMinisterByCountry -603  [main] DEBUG dao.ICountryDao.selectMinisterByCountry  - ====>  Preparing: select mid,mname from minister where mid=? [service] 2018-07-12 15:23:39,037 - dao.ICountryDao.selectMinisterByCountry -603  [main] DEBUG dao.ICountryDao.selectMinisterByCountry  - ====> Parameters: 1(Integer)[service] 2018-07-12 15:23:39,040 - dao.ICountryDao.selectMinisterByCountry -606  [main] DEBUG dao.ICountryDao.selectMinisterByCountry  - <====      Total: 1[service] 2018-07-12 15:23:39,041 - dao.ICountryDao.selectCountryById -607  [main] DEBUG dao.ICountryDao.selectCountryById  - <==      Total: 1Country{cid=1, cname='aaa', minister=Minister [mid=1, mname=sam]}

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~


- END -

elasticsearch多表关联查询_Mybatis【15】 Mybatis如何实现一对一的情况多表关联查询?...相关推荐

  1. mybatis mysql 模糊查询_MyBatis Oracle、MySQL、DB2、SQLServer的like模糊查询

    Oracle数据库: select * from t_user where name like '%'||#{search_name}||'%' 或者 select * from t_user whe ...

  2. 手把手教你用站长工具综查询网站域名在各个平台的权重情况 站长工具综查询

    网站权重是根据流量值来判断网站的权重值.权重值是属于第三方评估就有参考的意义. 了解网站的权重可以助于SEO专员找到工作的方向.使用站长工具综合查询可以看到网站在各个平台的权重情况. 用站长工具综合查 ...

  3. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    视频地址:http://edu.51cto.com/sd/be679 在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实 ...

  4. mybatis多条件批量查询_Mybatis【14】 Mybatis如何实现一对多查询?

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

  5. mybatis02映射动态sql关联查询spring整合mybatis

    2019独角兽企业重金招聘Python工程师标准>>> 输入映射和输出映射: 动态sql: 关联查询_一对一: 关联查询_一对多: 一对一,一对多操作的区别: 一对一,resultM ...

  6. mysql一次查询无关联多个表_面试官:为什么mysql不建议执行超过3表以上的多表关联查询?...

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 概述 前段时间在跟其他公司DBA交流时谈到了mysql跟PG之间在多表关联查询上的一些区别,相比之下mysql只有一种表连接类型:嵌套循环 ...

  7. mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)

    mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...

  8. mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优

    作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...

  9. c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...

    目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...

最新文章

  1. tomcat高并发的配置
  2. Korn Shell: typeset
  3. 回溯法+奇偶剪枝——Hdu 1010 Tempter of the Bone
  4. 隐式马可夫模型(hidden markov model,HMM)
  5. c++冒泡排序(附完整源码)
  6. 腾讯云,物联网通信产品,动态注册步骤
  7. CLR运行时细节 - 继承多态的实现
  8. 牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案
  9. 玩转Python? 一文总结30种Python的窍门和技巧,不可错过哈!
  10. 让人欲罢不能的量子学
  11. a标签写链接地址跳转到下载企业微信app页面
  12. Spring cloud实现服务注册及发现
  13. String.GetEnumerator 方法的C#例子
  14. Confluence 6 配置数字格式
  15. Axure RP 8.1最新激活码
  16. 中科大EPC课程查询自动选课
  17. 网站资源:分享7个实用好玩的在线网站,值得收藏!
  18. 商家门店会员管理,只要这五步,稳步提升销售额
  19. placement new 讲解
  20. .NET 对于构建系统应用的探索历程

热门文章

  1. linux之pid文件
  2. 把字符串转换为日期时间
  3. 【有奖辩论】工程师和销售创业谁更有优势?
  4. Kubernetes vs Docker:了解2021年的容器
  5. 网络DevOps探索与实践
  6. 再见了,公司的“烂系统”
  7. 小记 | 从 0 到 1,看我玩弄千万日志于股掌
  8. 从 MySQL 执行原理告诉你:为什么分页场景下,请求速度非常慢?
  9. 嘿嘿,我就知道面试官接下来要问我 ConcurrentHashMap 底层原理了,看我怎么秀他...
  10. 一次 MySQL 千万级大表的优化过程