First (一对一)

首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任。好吧这就是对于一对一的理解

怎么来实现呢?

这里我介绍了两种方式:

一种是:使用嵌套结果映射来处理重复的联合结果的子集

另一种呢是:通过执行另外一个SQL映射语句来返回预期的复杂类型

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样保证了namespace的值是唯一的-->
  5. <mapper namespace="com.yc.mybatis.test.classMapper">
  6.  
  7. <!--
  8. 方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
  9. 封装联表查询的数据(去除重复的数据)
  10. select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
  11. -->
  12.  
  13. <select id="getClass" parameterType="int" resultMap="getClassMap">
  14. select * from class c, teacher t where c.teacher_id = t.t_id and c.teacher_id=#{id}
  15. </select>
  16.  
  17. <!-- resultMap:映射实体类和字段之间的一一对应的关系 -->
  18. <resultMap type="Classes" id="getClassMap">
  19. <id property="id" column="c_id"/>
  20. <result property="name" column="c_name"/>
  21. <association property="teacher" javaType="Teacher">
  22. <id property="id" column="t_id"/>
  23. <result property="name" column="t_name"/>
  24. </association>
  25. </resultMap>
  26.  
  27. <!--
  28. 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
  29. SELECT * FROM class WHERE c_id=1;
  30. SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
  31. property:别名(属性名) column:列名 -->
  32. <!-- 把teacher的字段设置进去 -->
  33. <select id="getClass1" parameterType="int" resultMap="getClassMap1">
  34. select * from class where c_id=#{id}
  35. </select>
  36.  
  37. <resultMap type="Classes" id="getClassMap1">
  38. <id property="id" column="c_id"/>
  39. <result property="name" column="c_name"/>
  40. <association property="teacher" column="teacher_id" select="getTeacher"/>
  41. </resultMap>
  42. <select id="getTeacher" parameterType="int" resultType="Teacher">
  43. select t_id id,t_name name from teacher where t_id =#{id}
  44. </select>
  45. </mapper>

这里对assacation标签的属性进行解释一下:

property 对象属性的名称
javaType 对象属性的类型
column 所对应的外键字段名称
select 使用另一个查询封装的结果

这里ben层会发生变化 这个classes的被bean层会多一个Teacher的属性,并且增加的get,set方法。

Second (一对多)and (多对一)

一对多又是怎么样理解呢?

其实也很容易,一个顾客对应多个订单,而一个订单只能对应一个客户

而反过来也就是多对一的形式了

多个订单表可以对应一个顾客,一个顾客是可以拥有多个订单的

其实说到底就是有点类似多个一对一的情况,所以多对一的配置基本和一对一的配置保持一样

一对多的xml配置:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4. <mapper namespace="com.yc.mapper.CustomerMapper">
  5.  
  6. <resultMap type="com.yc.m.Customer" id="resultCustomerMap">
  7. <id column="id" jdbcType="INTEGER" property="id" />
  8. <result property="address" column="address"/>
  9. <result property="postcode" column="postcode"/>
  10. <result property="sex" column="sex"/>
  11. <result property="cname" column="cname"/>
  12. <collection property="orders" ofType="com.yc.m.Orders">
  13. <id property="id" column="id"/>
  14. <result property="code" column="code"/>
  15. </collection>
  16.  
  17. </resultMap>
  18.  
  19. <select id="getCustomer" resultMap="resultCustomerMap" parameterType="int">
  20. SELECT *
  21. FROM t_customer
  22. WHERE id=#{id}
  23. </select>
  24. </mapper>

在这里可以明显的看出多出了一个属性ofType,这个ofType的含义就是你collection所对应的是那个bean

当然在bean层中也会发生变化 ,这里在Customer的bean中嵌套一条语句

private List<Orders> orders;   //一个Customer 对应N多个Orders

Third (多对多)

多对多又怎么理解呢?

一个用户可以属于多个集体(家人,朋友,同学),当然一个集体也包含了多个用户

  1. <strong> <!--collection:聚集 用来处理类似User类中有List<Group> group时要修改group的情况 user代表要修改的是Group中的List<user> --></strong>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.yc.bean.Group">
  6. <!-- resultMap:结合标准javabean规范,能hashmap或arraylist所不能完成的更复杂的resultType -->
  7. <resultMap type="Group" id="groupMap">
  8. <id property="id" column="id" />
  9. <result property="name" column="name" />
  10. <result property="createTime" column="createdate" />
  11. </resultMap>
  12.  
  13. <resultMap type="Group" id="groupUserMap" <span style="color:#ff0000;"><strong>extends</strong></span>="groupMap">
  14. <collection property="user" ofType="User">
  15. <!--collection:聚集 用来处理类似User类中有List<Group> group时要修改group的情况 user代表要修改的是Group中的List<user> -->
  16. <id property="id" column="userId" />
  17. <result property="name" column="userName" />
  18. <result property="password" column="password" />
  19. <result property="createTime" column="userCreateTime" />
  20. </collection>
  21. </resultMap>
  22.  
  23. <select id="selectAllGroup" resultMap="groupMap">
  24. select * from group_info
  25. </select>
  26.  
  27. <!-- 根据Group表中的id或name查询组信息和组内用户信息 -->
  28. <select id="selectGroupUser" parameterType="Long"
  29. resultMap="groupUserMap">
  30. select u.id as userId,u.name as userName,
  31. u.password,u.createtime as userCreateTime,
  32. gi.id,gi.name,gi.createdate,gi.state from group_info gi left
  33. join user_group ug on gi.id=ug.group_id left join user u on
  34. ug.user_id=u.id where gi.id = #{id}
  35. </select>
  36. <!-- 删除组与组内成员之间的对应关系 -->
  37. <delete id="deleteGroupUser" parameterType="UserGroupLink">
  38. delete from user_group
  39. <where>
  40. <if test="user.id != 0">user_id = #{user.id}</if>
  41. <if test="group.id != 0">and group_id = #{group.id}</if>
  42. </where>
  43. </delete>
  44. </mapper>

这里还需要对user和group这两个bean之间的映射关系进行描述一下:

  1. package com.yc.deom;
  2.  
  3. import java.util.Date;
  4.  
  5. import com.yc.bean.Group;
  6. import com.yc.bean.User;
  7.  
  8. /**
  9. * @describe: 描述User和Group之间的映射关系
  10. */
  11. public class UserGroupLink {
  12.  
  13. private User user;
  14.  
  15. private Group group;
  16.  
  17. private Date createTime;
  18.  
  19. public Date getCreateTime() {
  20. return createTime;
  21. }
  22.  
  23. public void setCreateTime(Date createTime) {
  24. this.createTime = createTime;
  25. }
  26.  
  27. public Group getGroup() {
  28. return group;
  29. }
  30.  
  31. public void setGroup(Group group) {
  32. this.group = group;
  33. }
  34.  
  35. public User getUser() {
  36. return user;
  37. }
  38.  
  39. public void setUser(User user) {
  40. this.user = user;
  41. }
  42. }

Mybatis 一对一,一对多,多对一,多对多的理解的更多相关文章

  1. mybatis 一对一 一对多 多对多

    一对一 一对多 多对多

  2. mybatis 一对多,(多对一,一对一

    多对一,和一对一是同一种写法,每种写法又分在数据库关联和在mybatis关联 1,多对一,一对一数据库关联 2,多对一,一对一mybatis关联 3,一对多,数据库关联,注意,Java type改of ...

  3. Mybatis一对一、一对多、多对多查询。+MYSQL

    场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...

  4. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  5. 初学者易上手的SSH-hibernate04 一对一 一对多 多对多

    这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...

  6. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  7. mybatis的一对多,多对一,以及多对对的配置和使用

    1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧   2.首先我们开始对mybatis的一对多的探究   根据这个应用场景 ...

  8. JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用

    下面把项目中的用户类中有个:一对一  一对多  多对多的注解对应关系列取出来用于学习      说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...

  9. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

随机推荐

  1. PostgreSQL ----- No relations found.

    本篇文章可能有错,尚未细细研究 运行\d出错: No relations found. \d只显示可见的表,也就是该数据库的schema在search_path中. SHOW search_path; ...

  2. hdu_5963_朋友(找规律)

    题目链接:hdu_5963_朋友 题意: 中文,不解释 题解: 把样例拿出来看看,你会发现以x为节点是否能赢,就是与x相连的边权值的和或者异或是否为奇数. #include<bits/stdc+ ...

  3. 关于CSS样式的那些事_导航条菜单讲解

    最近开始忙着开自己的个人博客了,自己的前端确实是渣渣.没办法,一步步来,从慕课网上慢慢学着先. 首先带来的是一个导航栏的设计: 垂直导航栏的设计: 直接上代码: <!DOCTYPE html P ...

  4. web.py 学习(二)Worker

    Rocket Server 启动一个线程监听客户端的连接,收到连接将连接放置到队列中.线程池中的Worker会以这个连接进行初始化.Rocket中Worker的基类是: class Worker(Th ...

  5. OpenLayer

    <html> <head> <meta charset="utf-8"> <title>GIS开发样例-V1.0</title ...

  6. 9.创建一个三角形类,成员变量三边,方法求周长,创建类主类A来测试它。

    package com.hanqi.test; public class Triangle { private double a,b,c; public Triangle(double d,doubl ...

  7. php 实现简易模板引擎

    1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Model(模型)表示应用程序核心 ...

  8. 12C expdp issue

    issue 1: 使用expdp时遭遇ora-31650 D:\oracle\diag\rdbms \trace>expdp \"/ as sysdba\"  schemas ...

  9. json处理三部曲之第三曲:利用Gson处理json

    需要导入gson-xxx.jar包 <dependency> <groupId>com.google.code.gson</groupId> <artifac ...

  10. 嵌套json的查询

    postgres=# SELECT  t.data->'objects'->1->'src' AS ctFROM   reports as t     , json_array_el ...