世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a、依赖use-a、关联has-a,反映在数据库中,则是表与表之间的关系,比如外键

关联关系存在着以下几种类型:一对一关系;一对多和多对一关系;多对多关系

一对一关系:

    对象A和对象B一一对应,最直观的例子:人和身份证的关系,一个人只拥有一张身份证,而一张身份证只会属于一个人

一对多和多对一关系:

    一个班级可以有多个学生;一个人可以有多本书;一个用户可以有多个订单

多对多关系:

    用户和商品:多个用户可以购买同一种商品;一个用户也可以购买多种商品

MyBatis可以处理这几种关联关系

比如一个身份证表和一个人的表,查询一个人的时候,顺便就把他的身份证信息查出来,看下面的sql:

DROP TABLE IF EXISTS `idc`;
CREATE TABLE idc(
`pk` INT PRIMARY KEY AUTO_INCREMENT,
`id` VARCHAR(18) UNIQUE,
`name` VARCHAR(24),
`address` VARCHAR(64),
`birth` DATE
);
INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198501018376','王老五','A省B县','1985-01-01');
INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198304018376','郭小二','X省Y县','1983-04-01');
INSERT INTO idc(`id`,`name`,`address`,`birth`) VALUES('123456198807218376','李三','M省N县','1988-07-21'); DROP TABLE IF EXISTS `person`;
CREATE TABLE person(
`pk` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(24),
`age` INT,
`salary` INT,
`idc_pk` int UNIQUE,
FOREIGN KEY (idc_pk) REFERENCES idc(pk) /*将身份证idc表的主键作为人person表的外键*/
);
INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('王老五','32','7550','1');
INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('郭小二','34','8350','2');
INSERT INTO person(`name`,`age`,`salary`,`idc_pk`) VALUES('李三','29','5150','3');

实体类Person和IDC

package net.sonng.onetoone;

public class Person {
private int pk;
private String name;
private int age;
private int salary;
private IDC idc; //注意这跟表的idc_pk没有对应,而是映射到idc表里面的一条身份证信息记录
//省略getter和toString
}
package net.sonng.onetoone;

public class IDC {
private int pk;
private String id;
private String name;
private String address;
private String birth;
//省略getter和toString
}

下面是sql语句

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="net.sonng.onetoone.PersonDao">
<!-- 根据主键查询一条身份证信息 -->
<select id="selectIDCByPk" parameterType="int" resultType="net.sonng.onetoone.IDC">
SELECT * FROM idc WHERE pk=#{id}
</select>
<!-- 根据主键查询一个人,但不是直接映射到Person -->
<select id="selectPersonByPk" parameterType="int" resultMap="personMap">
SELECT * FROM person WHERE pk=#{id}
</select> <resultMap type="net.sonng.onetoone.Person" id="personMap"> <!-- 这个resultMap将数据库记录映射为一个Person对象 -->
<id property="pk" column="pk" /> <!-- id属性表示主键,result属性非主键 -->
<result property="name" column="name" />
<result property="salary" column="salary" />
<result property="age" column="age" />
<!-- 注意下行:将查询结果的idc_pk列的数据作为参数,用『selectIDCByPk』这条sql,到idc表中查询出一条记录,再封装成一个IDC对象,赋值给Person对象的idc属性。 -->
<association property="idc" column="idc_pk" select="selectIDCByPk" javaType="net.sonng.onetoone.IDC" />
<!-- Person对象的属性名 person表的字段名 用哪条sql 结果封装成哪个类的对象 -->
<!-- 用association属性完成了一对一的关联映射 -->
</resultMap>
</mapper>

PersonDao略

测试类:

package net.sonng.test;

import net.sonng.onetoone.Person;
import net.sonng.onetoone.PersonDao; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test {
public static void main(String[] args){
ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml");
PersonDao personDao=ac.getBean("personDao",PersonDao.class); Person per=personDao.selectPersonByPk(2);
System.out.println(per);
System.out.println(per.getIdc());
}
}

0049 MyBatis关联映射--一对一关系的更多相关文章

  1. mybatis关联映射一对一

    在项目开发中,会存在一对一的关系,比如一个人只有一个身份证,一个身份证只能给一个人使用,这就是一对一关系.一对一关系使用主外键关联. table.sql,在数据库中创建如下两个表并插入数据 CREAT ...

  2. Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

  3. MyBatis之级联——一对一关系

    在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...

  4. [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. MyBatis学习(七)MyBatis关联映射之多对多映射

    对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...

  6. spring boot(9)-mybatis关联映射

    一对多 查询type表的某一条数据,并且要同时查出所有typeid与之配置的user,最终要得到一个以下类型的Type对象 public class Type { String id; String ...

  7. Spring Boot (11) mybatis 关联映射

    一对多 查询category中的某一条数据,同时查询该分类下的所有Product. Category.java public class Category { private Integer id; ...

  8. mybatis关联映射一对多

    实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...

  9. mybatis关联映射多对多

    项目开发中,多对多关系也是非常常见的关系 在数据库中创建表的脚本 table.sql CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, ...

随机推荐

  1. 事务内执行sql修复的简易模板

    -- ============================================= -- Script Template -- ============================= ...

  2. 流畅的python第三章字典和集合学习记录

    什么是可散列的数据类型 如果一个对象是可散列的,那么在这个对象的生命周期中,他的散列值是不变的,而且这个对象需要实现__hash__()方法.另外可散列对象还要有__qe__()方法.这样才能跟其他键 ...

  3. 数组类型参数传递问题:$.ajax传递数组的traditional参数传递必须true

    数组类型参数传递: 若一个请求中包含多个值,如:(test.action?tid=1&tid=2&tid=3),参数都是同一个,只是指定多个值,这样请求时后台会发生解析错误,应先使用 ...

  4. http://blog.sina.com.cn/s/blog_4dd787e40102uysg.html

    http://blog.sina.com.cn/s/blog_4dd787e40102uysg.html

  5. scrapy中ROBOTSTXT_OBEY = True的相关说明

    在scrapy中创建项目以后,在settings文件中有这样的一条默认开启的语句: # Obey robots.txt rules ROBOTSTXT_OBEY = True 观察代码可以发现,默认为 ...

  6. appium-desktop使用

    Appium移动测试中有个很重新的组件Appium-Server,它主要用来监听我们的移动设备(真机或模拟器),然后将不同编程语言编写的 appium 测试脚本进行解析,然后,驱动移动设备来运行测试. ...

  7. [HTML5] Track First Contentful Paint with PerformanceObserver and Google Analytics

    "If you can't measure it, you can't improve it." The first step when doing performance wor ...

  8. Junit核心——测试集(TestSuite)

    关于测试集,实质就是包含若干个测试类的集合,通过一个具体的实例,让我们来了解一下Junit的测试集 package org.yezi.junit; public class Calcaute { pu ...

  9. 解决Xcode 6 编译Cocos2d-x iOS项目失败

    在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwrite ...

  10. JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤

    内容概述 本部分说明JGroups构建块接口RspFilter,具体提供一个简单示例来说明如何使用JGroups构建块RspFilter对群组通信返回消息进行过滤. 示例描述 我们知道构建块基于通道之 ...