世上的事务总不是孤立存在的,表现在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());
}
}

最新文章

  1. bzoj4750: 密码安全
  2. Linux下的C编程实战
  3. CIQRCodeGenerator Core Image Filter Reference
  4. SCAU 1138 代码等式
  5. 《深入剖析Tomcat》阅读(二)
  6. [转] 不要被C++“自动生成”所蒙骗
  7. Android 物理按键
  8. jquery.ajax提交多值(数组)
  9. rsyslog+LogAnalyzer 日志收集
  10. C语言函函数嵌套
  11. [开源]MasterChief 快速开发辅助类库
  12. PHP多进程的实际处理
  13. git速度太慢
  14. 超级wifi
  15. 在Unity中使用Lua脚本
  16. JS前端创建CSV或Excel文件并浏览器导出下载
  17. Docker添加镜像加速器
  18. C++中如何强制inline函数(MSVC, GCC)
  19. Hadoop学习(二) Hadoop配置文件参数详解
  20. (十二)Jmeter之Bean Shell的使用(一)

热门文章

  1. Eclipse中执行maven命令
  2. InternalError: (pymysql.err.InternalError) (1205, u&#39;Lock wait timeout exceeded; try restarting transaction&#39;)
  3. C++中模块(Dll)对外暴露接口的方式
  4. 【转载】【Todo】电商架构相关技术分析
  5. python利用opencv去除水印方法
  6. 破解MyEclipse2015 stable3.0
  7. 【Other】ASCII Text Art
  8. 切换样式.toggleClass()
  9. MyEclipse 集成 Gradle开发环境
  10. unicode 编码在线转换工具