数据库E-R关系

实体类

public class City {
Long id;
String name;
Long countryId;
Date lastUpdate;
}
public class Country {
Long id;
String name;
Date lastUpdate;
}
public class CityPlus {
Long id;
String name;
Long countryId;
Date lastUpdate;
Country country;
}
public class CountryPlus {
Long id;
String name;
Date lastUpdate;
List<City> cityList;
}

一对一关联查询

  一对一关联查询可采用的方式有:

  1. 单步查询,通过级联属性赋值

    • result标签级联属性赋值
    • association标签级联属性赋值
  2. 分步查询

单步查询

  • 数据模型:一个实体Bean中包含另外一个实体Bean
  • SQL查询:关联SQL 查询语句,如inner join、left join、right join
  • 具体实现方式:
    • 为级联属性赋值
    • association标签

采用相同的select标签

    <select id="selectCityPlusById" resultMap="cityPlusResultMap">
select city_id,city,city.country_id as country_id,city.last_update as last_update,
country.country_id as country_country_id,country,country.last_update as country_last_update
from city,country
where city.country_id = country.country_id and city_id=#{id}
</select>

result标签级联属性赋值

        <id column="city_id" property="id"/>
<result column="city" property="name"/>
<result column="country_id" property="countryId"/>
<result column="last_update" property="lastUpdate"/>
<result column="country_country_id" property="country.id"/>
<result column="country" property="country.name"/>
<result column="country_last_update" property="country.lastUpdate"/>
</resultMap>

 association标签级联属性赋值

  • 需要指定级联实体Bean在上级Bean中的属性名称,即association标签的property属性;
  • 需要指定级联实体Bean的类型,即association标签的javaType属性;
  • association标签的内部和resultMap标签内部具有相同的结构;
  • association标签也可以嵌套association标签;
    <resultMap id="cityPlusResultMap" type="canger.study.chapter04.bean.CityPlus">
<id column="city_id" property="id"/>
<result column="city" property="name"/>
<result column="country_id" property="countryId"/>
<result column="last_update" property="lastUpdate"/>
<association property="country" javaType="canger.study.chapter04.bean.Country">
<id column="country_country_id" property="id"/>
<result column="country" property="name"/>
<result column="country_last_update" property="lastUpdate"/>
</association>
</resultMap>

分步查询

  分步查询是指通过两次(或更多次)的查询,来为一个一对一关系的实体Bean赋值。

  • 数据模型:一个实体Bean中包含另外一个实体Bean
  • SQL查询:简单SQL语句,不存在关联查询
  • 只能通过association标签实现;

第一步查询

    <select id="selectCityPlusByIdUnderStep" resultMap="cityPlusResultMapStep">
select city_id,city,country_id
from city
where city_id=#{id}
</select>

association标签:

  • 需要指定级联实体Bean在上级Bean中的属性名称,即association标签的property属性;
  • 需要指定下一步查询需要使用的select语句,即association标签的select属性,该属性值为Mapper接口查询方法的全限定名;
  • 需要使用column属性,用于指定第二步查询的输入参数,第二步查询只有一个输入参数时,使用第一步查询结果的column名称即可;
    <resultMap id="cityPlusResultMapStep" type="canger.study.chapter04.bean.CityPlus">
<id column="city_id" property="id"/>
<result column="city" property="name"/>
<result column="country_id" property="countryId"/>
<result column="last_update" property="lastUpdate"/>
<association property="country"
select="canger.study.chapter04.mapper.CountryMapper.selectCountryById"
column="country_id">
</association>
</resultMap>

第二步查询

    <select id="selectCountryById" resultMap="countryResultMap">
select *
from country
where country_id=#{id}
</select>
    <resultMap id="countryResultMap" type="canger.study.chapter04.bean.Country">
<id column="country_id" property="id"/>
<result column="country" property="name"/>
<result column="last_update" property="lastUpdate"/>
</resultMap>

分步查询中,第二步查询需要多个参数

当第二步查询需要多个参数时,column属性的设置方式为  {param1=column1,param2=column2},其中param1,param2...为第二步查询的mapper映射文件的SQL语句中所使用的引用参数名称,column1,column2...为第一步查询返回的列名称,示例如下:

第一步

    <select id="selectCityPlusByIdUnderStep" resultMap="cityPlusResultMapStep">
select city_id,city,country_id, "Spain" as countryName
from city
where city_id=#{id}
</select>
    <resultMap id="cityPlusResultMapStep" type="canger.study.chapter04.bean.CityPlus">
<id column="city_id" property="id"/>
<result column="city" property="name"/>
<result column="country_id" property="countryId"/>
<result column="last_update" property="lastUpdate"/>
<association property="country"
select="canger.study.chapter04.mapper.CountryMapper.selectCountryByIdAndName"
column="{id=country_id,name=countryName}">
</association>
</resultMap>

第二步

    <select id="selectCountryByIdAndName" resultMap="countryResultMap">
select *
from country
where country_id=#{id} and country=#{name}
</select>
    <resultMap id="countryResultMap" type="canger.study.chapter04.bean.Country">
<id column="country_id" property="id"/>
<result column="country" property="name"/>
<result column="last_update" property="lastUpdate"/>
</resultMap>

MyBatis关联查询,一对一关联查询的更多相关文章

  1. Mybatis学习4——一对一关联查询方法2------实体作为属性

    实体order和user采用resultMap order package pojo; import java.util.Date; public class Order { private Inte ...

  2. Mybatis学习4——一对一关联查询方法1--创建实体

    创建一个实体继承两个实体之一,另一个实体作为属性 实体1. order package pojo; import java.util.Date; public class Order { privat ...

  3. 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置

    新建Account实体类 生成getter和setter还有toString方法 先创建dao类 全局的配置,这里要改成package 创建多对一的关系 在查询的时候输出user这个对象的内容 建立查 ...

  4. mybatis学习:mybatis注解开发一对一的查询配置

    实体类: public class Account { private Integer id; private Integer uid; private Double money; private U ...

  5. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

  6. MyBatis:一对一关联查询

    MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...

  7. 【Mybatis】MyBatis之表的关联查询(五)

    本章介绍Mybatis之表的关联查询 一对一关联 查询员工信息以及员工的部门信息 1.准备表employee员工表,department部门表 CREATE TABLE `employee` ( `i ...

  8. mybatis的动态sql编写以及一对一关系查询和一对多的查询

    创建mybatis数据库,运行以下sql语句 /* SQLyog Ultimate v8.32 MySQL - 5.5.27 : Database - mybatis **************** ...

  9. Hibernate多对多单向关联和双向关联 --Hibernate框架

    Hibernate关联关系中相对比较特殊的就是多对多关联,多对多关联与一对一关联和一对多关联不同,多对多关联需要另外一张映射表用于保存多对多映射信息.本例介绍多对多单向关联和双向关联.单向关联 :指具 ...

  10. mybatis一对一关联查询——(八)

    1.需求 查询所有订单信息,关联查询下单用户信息. 注意: 因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则为一对多查 ...

随机推荐

  1. WorldWind源码剖析系列:缓冲类Cache

    缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...

  2. linux 设置默认网关永久

    .永久添加 1 2 vim /etc/sysconfig/network GATEWAY=192.168.1.4

  3. Python3与Python2的差异

    基于python3浅谈python3与python2的差异.由于现今主流Python3,但是之前用Python2做的项目,还得维护,所以作为python工作者,不免要了解其中差异,其中,Python2 ...

  4. Arduino入门笔记(7):利用1602、1302实现时钟和定时器

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 常常听到老妈在做饭时说“开锅15分钟后叫我一下”,为何不做个定时器,来提醒老妈呢 ...

  5. 【LeetCode5】Longest Palindromic Substring★★

    1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...

  6. 阿里云Linux系统基线检查优化

    1.用户权限配置文件的权限优化 描述:设置用户权限配置文件的权限 操作时建议做好记录或备份 chown root:root /etc/passwd /etc/shadow /etc/group /et ...

  7. Nginx日常报错处理总结

    在Nginx错误日志中,有大量的下列信息: Upstream timed out (110: Connection timed out) while reading response header f ...

  8. React学习-React初识

    一.前言 为什么要去学习React呢,关于前端三大框架Angular,Vue,React其实都得去学吧,因为大家都在用啊,大家都再谈论啊,面试什么的都要求,没办法,曾几何时,大家都说求求大佬们别坑新了 ...

  9. AppStore下载Xcode的文件

    有的时候团队开发,手机系统一升级,那么对应的Xcode也就需要升级了,由于团队开发,可能一下要把所有人的都升级一下,那么最简单的就是下好一份Xcode然后分享给大家. 但是有的时候你就会发现,通过Ap ...

  10. (功能篇)回顾Bug管理系统Mantis优化改造经历

    共分为两篇,功能篇和技术篇. 时间大约是2016年冬天. 考虑搭一个用于Bug管理和追踪的系统. 综合比较下,选择了小巧的开源工具,Mantis. 在源码基础上,做代码修改,完成了定制版的优化改造. ...