mybatis(一)一对一,一对多,多对一

给出一个城市对应行政区域的业务场景,如天津市有南开区、红桥区,这样城市对应区是一对多,相反区对应城市是多对一,下面给出简单的数据库设计

-- 城市表
drop table if exists city;
create table city (
city_code tinyint(4) not null comment ‘城市代码 天津:1,北京:2‘,
city_name varchar(10) not null comment ‘城市名称 天津,北京‘,
create_time datetime not null default now() comment ‘创建时间‘,
modify_time datetime not null default now() comment ‘修改时间‘,
primary key (city_code)
) engine=innodb default charset=utf8 comment=‘城市表‘;

-- 行政区域表
drop table if exists area;
create table area (
id int(10) not null auto_increment comment ‘主键‘,
city_code tinyint(4) not null comment ‘城市代码 天津:1,北京:2‘,
area_code tinyint(4) unique not null comment ‘区域代码 南开区:1,朝阳区:2‘,
area_name varchar(10) not null comment ‘区域名称 南开区,朝阳区‘,
create_time datetime not null default now() comment ‘创建时间‘,
modify_time datetime not null default now() comment ‘修改时间‘,
primary key (id)
) engine=innodb default charset=utf8 comment=‘行政区域表‘;

-- sql init:
insert ignore into city (city_code, city_name) values (1, ‘天津市‘),(2, ‘北京市‘)
insert ignore into area (city_code, area_code, area_name) values (1, 1, ‘南开区‘),(1, 2, ‘和平区‘),(1, 3, ‘河西区‘),(2, 4, ‘朝阳区‘),(2, 5, ‘宣武区‘)

1.一对多:

一对多的话其实通常我们想要的结果是一个实体bean中含有多个另外实体bean的即(带有一个list属性),这个场景中我们应该返回两条数据(一条天津的一条北京的),先来看下一对多情况在数据库执行的情况:

select t1.city_code, t1.city_name, t2.area_code, t2.area_name from city t1
left join area t2 on t1.city_code = t2.city_code

很明显,数据库中返回5个对象不是我们想要的结果,但是相同的sql在mybatis中执行,会得到我们想要的结果

<resultMap id="City" type="cn.yyyyy.example.entity.City">
    <id column="city_code" jdbcType="INTEGER" property="cityCode" />
    <result column="city_name" jdbcType="VARCHAR" property="cityName" />
    <collection property="areaList" resultMap="Area" />
</resultMap>

<resultMap id="Area" type="cn.yyyyy.example.entity.Area">
    <id column="area_code" jdbcType="INTEGER" property="areaCode" />
    <result column="area_name" jdbcType="VARCHAR" property="areaName" />
</resultMap>

<select id="listCity" resultMap="City">
    select t1.city_code, t1.city_name, t2.area_code, t2.area_name from city t1
    left join area t2 on t1.city_code = t2.city_code
</select>

得出结果:

[City{cityCode=1, cityName=‘天津市‘, areaList=[Area{areaCode=1, areaName=‘南开区‘, cityCode=null}, Area{areaCode=2, areaName=‘和平区‘, cityCode=null}, Area{areaCode=3, areaName=‘河西区‘, cityCode=null}]}, City{cityCode=2, cityName=‘北京市‘, areaList=[Area{areaCode=4, areaName=‘朝阳区‘, cityCode=null}, Area{areaCode=5, areaName=‘宣武区‘, cityCode=null}]}]

给出相关实体bean代码:

package cn.yyyyy.example.entity;

import java.util.List;

public class City {

    private Integer cityCode;

    private String cityName;

    private List<Area> areaList;

    public Integer getCityCode() {
        return cityCode;
    }

    public void setCityCode(Integer cityCode) {
        this.cityCode = cityCode;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public List<Area> getAreaList() {
        return areaList;
    }

    public void setAreaList(List<Area> areaList) {
        this.areaList = areaList;
    }

    @Override
    public String toString() {
        return "City{" +
                "cityCode=" + cityCode +
                ", cityName=‘" + cityName + ‘\‘‘ +
                ", areaList=" + areaList +
                ‘}‘;
    }
}

package cn.yyyyy.example.entity;

public class Area {

    private Integer areaCode;

    private String areaName;

    private Integer cityCode;

    public Integer getAreaCode() {
        return areaCode;
    }

    public void setAreaCode(Integer areaCode) {
        this.areaCode = areaCode;
    }

    public String getAreaName() {
        return areaName;
    }

    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    public Integer getCityCode() {
        return cityCode;
    }

    public void setCityCode(Integer cityCode) {
        this.cityCode = cityCode;
    }

    @Override
    public String toString() {
        return "Area{" +
                "areaCode=" + areaCode +
                ", areaName=‘" + areaName + ‘\‘‘ +
                ", cityCode=" + cityCode +
                ‘}‘;
    }
}

2.多对一,一对一

之所以把一对一归到多对一是因为可以把一对一看做多对一的一种特例,还是现在数据库中看下结果:

select t1.area_code, t1.area_name, t2.city_code, t2.city_name from area t1 left join city t2 on t1.city_code = t2.city_code

<resultMap id="City" type="cn.yyyyy.example.entity.City">
    <id column="city_code" jdbcType="INTEGER" property="cityCode" />
    <result column="city_name" jdbcType="VARCHAR" property="cityName" />
</resultMap>

<resultMap id="Area" type="cn.yyyyy.example.entity.Area">
    <id column="area_code" jdbcType="INTEGER" property="areaCode" />
    <result column="area_name" jdbcType="VARCHAR" property="areaName" />
    <association property="city" resultMap="City" />
</resultMap>
<select id="listArea" resultMap="Area">
    select t1.area_code, t1.area_name, t2.city_code, t2.city_name from area t1
    left join city t2 on t1.city_code = t2.city_code
</select>

结果:[Area{areaCode=1, areaName=‘南开区‘, cityCode=null, city=City{cityCode=1, cityName=‘天津市‘, areaList=null}}, Area{areaCode=2, areaName=‘和平区‘, cityCode=null, city=City{cityCode=1, cityName=‘天津市‘, areaList=null}}, Area{areaCode=3, areaName=‘河西区‘, cityCode=null, city=City{cityCode=1, cityName=‘天津市‘, areaList=null}}, Area{areaCode=4, areaName=‘朝阳区‘, cityCode=null, city=City{cityCode=2, cityName=‘北京市‘, areaList=null}}, Area{areaCode=5, areaName=‘宣武区‘, cityCode=null, city=City{cityCode=2, cityName=‘北京市‘, areaList=null}}]

实体bean代码:

package cn.yyyyy.example.entity;

public class Area {

    private Integer areaCode;

    private String areaName;

    private Integer cityCode;

    private City city;

    public City getCity() {
        return city;
    }

    public void setCity(City city) {
        this.city = city;
    }

    public Integer getAreaCode() {
        return areaCode;
    }

    public void setAreaCode(Integer areaCode) {
        this.areaCode = areaCode;
    }

    public String getAreaName() {
        return areaName;
    }

    public void setAreaName(String areaName) {
        this.areaName = areaName;
    }

    public Integer getCityCode() {
        return cityCode;
    }

    public void setCityCode(Integer cityCode) {
        this.cityCode = cityCode;
    }

    @Override
    public String toString() {
        return "Area{" +
                "areaCode=" + areaCode +
                ", areaName=‘" + areaName + ‘\‘‘ +
                ", cityCode=" + cityCode +
                ", city=" + city +
                ‘}‘;
    }
}

package cn.yyyyy.example.entity;

import java.util.List;

public class City {

    private Integer cityCode;

    private String cityName;

    private List<Area> areaList;

    public Integer getCityCode() {
        return cityCode;
    }

    public void setCityCode(Integer cityCode) {
        this.cityCode = cityCode;
    }

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public List<Area> getAreaList() {
        return areaList;
    }

    public void setAreaList(List<Area> areaList) {
        this.areaList = areaList;
    }

    @Override
    public String toString() {
        return "City{" +
                "cityCode=" + cityCode +
                ", cityName=‘" + cityName + ‘\‘‘ +
                ", areaList=" + areaList +
                ‘}‘;
    }
}

3.tips

(1)重写toString方法可以使用json形式,这样在实体bean追加属性的时候可以不用再修改toString方法,这里用到的是fastJson,给出maven坐标:

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

(2)打印sql,使用logback,在配置中加入

<logger name="cn.yyyyy.example.dao" level="DEBUG" />

2019-01-10 09:43:22.622 [] DEBUG cn.yyyyy.example.dao.CityDao.listArea - ==> Preparing: select t1.area_code, t1.area_name, t2.city_code, t2.city_name from area t1 left join city t2 on t1.city_code = t2.city_code
2019-01-10 09:43:22.651 [] DEBUG cn.yyyyy.example.dao.CityDao.listArea - ==> Parameters:
2019-01-10 09:43:22.668 [] DEBUG cn.yyyyy.example.dao.CityDao.listArea - <== Total: 5

原文地址:https://www.cnblogs.com/yyyyy-1988/p/10247948.html

时间: 2024-08-08 18:53:18

mybatis(一)一对一,一对多,多对一的相关文章

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

django mysql 表的一对一 一对多 多对多

表结构的设计 一对一 多对一  将key写在多 多对多 外键: 描述  多对一的关系 写在多的一方 class Book(models.Model) title = models.CharField(max_length=32,unique=Ture) publisher = models.ForeignKey (to=Publisher,on_deleete=models.CASADE) publisher = models.ForeignKey(to='Publisher', on_dele

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

SpringBoot使用Mybatis注解进行一对多和多对多查询 GitHub的完整示例项目地址kingboy-springboot-data 一.模拟的业务查询 系统中的用户user都有唯一对应的地址信息address,每个用户可以有多量车car,类似如下结构 |-- user |-- address |-- carList |-- car1 |-- car2 二.对应的实体类如下 /省略setter/getter public class Address { private Long id;

多对多 一对一 一对多 主从 关联 字典

 "订单"表中的主键.  "产品"表中的主键.  一个订单可以包含多种产品 ...   ... 且每种产品可以出现在多个订单上.   课程文本 在多对多关系中,一个表中的一个记录与第二个表中的多个记录相关,第二个表中的一个记录与第一个表中的多个记录相关. 这种类型的关系需要一个称为连接表的第三个表.连接表包含另两个表中的主键,并将它们用作其外键. 例如,"订单"表和"产品"表具有多对多关系.一个订单可以包含多种产品,每种产品可

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str

MyBatis的一对一关联关系映射

原文链接:http://www.yiidian.com/mybatis/one-to-one.html 1 什么是一对一.一对多映射? 以用户和订单举例, 一对一 : 一个订单只属于一个用户 ==> 订单对用户是一对一关系 一对多 : 一个用户可以拥有多个订单 ==> 用户对订单是一对多关系 注意:在MyBatis中,如果要完成多对多关系,其实就是两个一对多映射! 接下来先讲解MyBatis的一对一映射如何实现. 2 建立表结构 2.1 创建用户表 CREATE TABLE `t_user`

MyBatis之级联——一对多关系

上次我们讲到了MyBatis的一对一关系的表示,简单回顾一下一对一关系就是一个学生只有一个学生证.那么什么是一对多关系呢?一个学生有多个课程这就是一对多的关系.我们结合上一章中的学生和学生证,在此基础上新增一个课程表和课程成绩表.学生对应课程表是一对多的关系,在学生确定的情况下课程表对应课程成绩是一对一的关系.我们先来看看我们所假设的场景数据结构的设计. 数据库的ER图如下(因为对数据库还处于菜鸟阶段--所以可能ER图绘制有误,但不影响我们讲解MyBatis一对多关系的级联): 再看看数据库的物