0049 MyBatis关联映射--一对一关系
世上的事务总不是孤立存在的,表现在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关联映射--一对一关系的更多相关文章
- mybatis关联映射一对一
在项目开发中,会存在一对一的关系,比如一个人只有一个身份证,一个身份证只能给一个人使用,这就是一对一关系.一对一关系使用主外键关联. table.sql,在数据库中创建如下两个表并插入数据 CREAT ...
- Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)
hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
- MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...
- [原创]java WEB学习笔记84:Hibernate学习之路-- -映射 一对一关系 ,基外键的方式实现
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- MyBatis学习(七)MyBatis关联映射之多对多映射
对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...
- spring boot(9)-mybatis关联映射
一对多 查询type表的某一条数据,并且要同时查出所有typeid与之配置的user,最终要得到一个以下类型的Type对象 public class Type { String id; String ...
- Spring Boot (11) mybatis 关联映射
一对多 查询category中的某一条数据,同时查询该分类下的所有Product. Category.java public class Category { private Integer id; ...
- mybatis关联映射一对多
实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...
- mybatis关联映射多对多
项目开发中,多对多关系也是非常常见的关系 在数据库中创建表的脚本 table.sql CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, ...
随机推荐
- Kubernetes应用迁移问题定位
这个帖子记录所有的应用迁移中遇到的问题. 关于镜像无法启动后无法定位问题 在原有的Dockerfile中修改,加入 RUN echo "aaa" > /etc/a.log C ...
- Ceph源码解析:读写流程
转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ...
- java jar包 log4j不能输出解决方法
今天运行一个jar包,jar包中使用了springContext进行加载bean和log4j配置,但是发现不能正常输入日志. 代码中增加 Xxx.class.getResource("/&q ...
- [转]SQL SERVER 函数组合实现oracle的LPAD函数功能
本文转自:http://blog.csdn.net/a475701239/article/details/8295976 在写存储过程的时候遇到个问题,就是 将数字转成4位右对齐的字符串,不 ...
- 理解PHP的变量,值与引用的关系
--- title: 理解PHP的变量,值与引用的关系 createdDate: 2015-03-11 category: php --- PHP的变量与C++中的变量是两种截然不容的概念.如果没有理 ...
- iOS:ShareSDk的分享
使用分享类的SDK其实有很多,例如友盟.ShareSDK等等,参照他们的文档集成起来并不是很难,可能出的一些问题也就是配置文件的问题,这里我个人使用了ShareSDK分享,具体操作可出现的问题如下: ...
- Linux的进程间通信-文件和文件锁
前言 使用文件进行进程间通信应该是最先学会的一种IPC方式.任何编程语言中,文件IO都是很重要的知识,所以使用文件进行进程间通信就成了很自然被学会的一种手段.考虑到系统对文件本身存在缓存机制,使用文件 ...
- 常用命令(过滤、管道、重定向、ping 命令、netstat 命令、ps命令)
常用命令 过滤 过滤出 /etc/passwd 文件中包含 root 的记录 grep 'root' /etc/passwd 递归地过滤出 /var/log/ 目录中包含 linux 的记录 grep ...
- SQL如何将EXCEL导入到SQL数据库
1 新建一个EXCEL工作表,注意默认有三个工作簿,我们只在Sheet1中创建几个字段并存储若干值保存为TEST.xls 2运行Excel to MySQL软件,注意Sourece和Destinati ...
- WCF 之 初识WCF
在编程中服务的作用越来越大了,.net从2.0的 webservice,到3.5之后的WCF,服务的功能越来越强了.现在先从简单的看起,先看看WCF服务的发布. 现在来看看一步一步发布 WCF 服务. ...