Mybatis 一对一,一对多,多对一,多对多的理解
First (一对一)
首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任。好吧这就是对于一对一的理解
怎么来实现呢?
这里我介绍了两种方式:
一种是:使用嵌套结果映射来处理重复的联合结果的子集
另一种呢是:通过执行另外一个SQL映射语句来返回预期的复杂类型
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样保证了namespace的值是唯一的-->
<mapper namespace="com.yc.mybatis.test.classMapper"> <!--
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1
--> <select id="getClass" parameterType="int" resultMap="getClassMap">
select * from class c, teacher t where c.teacher_id = t.t_id and c.teacher_id=#{id}
</select> <!-- resultMap:映射实体类和字段之间的一一对应的关系 -->
<resultMap type="Classes" id="getClassMap">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" javaType="Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
</association>
</resultMap> <!--
方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
property:别名(属性名) column:列名 -->
<!-- 把teacher的字段设置进去 -->
<select id="getClass1" parameterType="int" resultMap="getClassMap1">
select * from class where c_id=#{id}
</select> <resultMap type="Classes" id="getClassMap1">
<id property="id" column="c_id"/>
<result property="name" column="c_name"/>
<association property="teacher" column="teacher_id" select="getTeacher"/>
</resultMap>
<select id="getTeacher" parameterType="int" resultType="Teacher">
select t_id id,t_name name from teacher where t_id =#{id}
</select>
</mapper>
这里对assacation标签的属性进行解释一下:
property | 对象属性的名称 |
javaType | 对象属性的类型 |
column | 所对应的外键字段名称 |
select | 使用另一个查询封装的结果 |
这里ben层会发生变化 这个classes的被bean层会多一个Teacher的属性,并且增加的get,set方法。
Second (一对多)and (多对一)
一对多又是怎么样理解呢?
其实也很容易,一个顾客对应多个订单,而一个订单只能对应一个客户
而反过来也就是多对一的形式了
多个订单表可以对应一个顾客,一个顾客是可以拥有多个订单的
其实说到底就是有点类似多个一对一的情况,所以多对一的配置基本和一对一的配置保持一样
一对多的xml配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yc.mapper.CustomerMapper"> <resultMap type="com.yc.m.Customer" id="resultCustomerMap">
<id column="id" jdbcType="INTEGER" property="id" />
<result property="address" column="address"/>
<result property="postcode" column="postcode"/>
<result property="sex" column="sex"/>
<result property="cname" column="cname"/>
<collection property="orders" ofType="com.yc.m.Orders">
<id property="id" column="id"/>
<result property="code" column="code"/>
</collection> </resultMap> <select id="getCustomer" resultMap="resultCustomerMap" parameterType="int">
SELECT *
FROM t_customer
WHERE id=#{id}
</select>
</mapper>
在这里可以明显的看出多出了一个属性ofType,这个ofType的含义就是你collection所对应的是那个bean
当然在bean层中也会发生变化 ,这里在Customer的bean中嵌套一条语句
private List<Orders> orders; //一个Customer 对应N多个Orders
Third (多对多)
多对多又怎么理解呢?
一个用户可以属于多个集体(家人,朋友,同学),当然一个集体也包含了多个用户
<strong> <!--collection:聚集 用来处理类似User类中有List<Group> group时要修改group的情况 user代表要修改的是Group中的List<user> --></strong>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yc.bean.Group">
<!-- resultMap:结合标准javabean规范,能hashmap或arraylist所不能完成的更复杂的resultType -->
<resultMap type="Group" id="groupMap">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="createTime" column="createdate" />
</resultMap> <resultMap type="Group" id="groupUserMap" <span style="color:#ff0000;"><strong>extends</strong></span>="groupMap">
<collection property="user" ofType="User">
<!--collection:聚集 用来处理类似User类中有List<Group> group时要修改group的情况 user代表要修改的是Group中的List<user> -->
<id property="id" column="userId" />
<result property="name" column="userName" />
<result property="password" column="password" />
<result property="createTime" column="userCreateTime" />
</collection>
</resultMap> <select id="selectAllGroup" resultMap="groupMap">
select * from group_info
</select> <!-- 根据Group表中的id或name查询组信息和组内用户信息 -->
<select id="selectGroupUser" parameterType="Long"
resultMap="groupUserMap">
select u.id as userId,u.name as userName,
u.password,u.createtime as userCreateTime,
gi.id,gi.name,gi.createdate,gi.state from group_info gi left
join user_group ug on gi.id=ug.group_id left join user u on
ug.user_id=u.id where gi.id = #{id}
</select>
<!-- 删除组与组内成员之间的对应关系 -->
<delete id="deleteGroupUser" parameterType="UserGroupLink">
delete from user_group
<where>
<if test="user.id != 0">user_id = #{user.id}</if>
<if test="group.id != 0">and group_id = #{group.id}</if>
</where>
</delete>
</mapper>
这里还需要对user和group这两个bean之间的映射关系进行描述一下:
package com.yc.deom; import java.util.Date; import com.yc.bean.Group;
import com.yc.bean.User; /**
* @describe: 描述User和Group之间的映射关系
*/
public class UserGroupLink { private User user; private Group group; private Date createTime; public Date getCreateTime() {
return createTime;
} public void setCreateTime(Date createTime) {
this.createTime = createTime;
} public Group getGroup() {
return group;
} public void setGroup(Group group) {
this.group = group;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
}
}
Mybatis 一对一,一对多,多对一,多对多的理解的更多相关文章
- mybatis 一对一 一对多 多对多
一对一 一对多 多对多
- mybatis 一对多,(多对一,一对一
多对一,和一对一是同一种写法,每种写法又分在数据库关联和在mybatis关联 1,多对一,一对一数据库关联 2,多对一,一对一mybatis关联 3,一对多,数据库关联,注意,Java type改of ...
- Mybatis一对一、一对多、多对多查询。+MYSQL
场景:使用三张数据表:student学生表.teacher教师表.position职位表 一个学生可以有多为老师.一位老师可以有多个学生.但是一个老师只能有一个职位:教授.副教授.讲师:但是一个职位可 ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- 初学者易上手的SSH-hibernate04 一对一 一对多 多对多
这章我们就来学习下hibernate的关系关联,即一对一(one-to-one),一对多(one-to-many),多对多(many-to-many).这章也将是hibernate的最后一章了,用于初 ...
- day 69-70 一对一 一对多 多对一联表查询
day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...
- mybatis的一对多,多对一,以及多对对的配置和使用
1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧 2.首先我们开始对mybatis的一对多的探究 根据这个应用场景 ...
- JPA级联(一对一 一对多 多对多)注解【实际项目中摘取的】并非自己实际应用
下面把项目中的用户类中有个:一对一 一对多 多对多的注解对应关系列取出来用于学习 说明:项目运行正常 问题类:一对多.一对一.多对多 ============一对多 一方的设置 @One ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
随机推荐
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
- shell脚本学习(四)
1.文件权限 1.1 用户有一个称为setuid(S)的特殊权限,它出现在执行权限(x)的位置,setuid权限允许用户以拥有者的权限来执行可执行文件,即使这个可执行文件是由 其他用户运行的. 具有s ...
- 玩玩RMI
今天在看代理设计模式,java中远程代理的实现一定会用到RMI的,很久没有温习过RMI的知识了,今天就重新过一遍这个知识点来让自己加深印象,构建一个简单的RMI小程序需要用到一下几个类: java.r ...
- Java中的Unsafe
在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过.所以花了点时间google了一下. Unsafe的源码:http://www.docjar.com ...
- iOS页面间传值的六种方式
一般ios页面间的传值方式分为6种:1.属性传值:2.block:3.delegate:4.UserDefault:5.单例:6.通知. 0&1.block 先说我最常用的block吧,属性传 ...
- SQL函数学习(二):DATEADD() 函数
DATEADD() 函数在日期中添加或减去指定的时间间隔. 语法 DATEADD(datepart,number,date) date 参数是合法的日期表达式.number 是您希望添加的间隔数:对于 ...
- java编写简单的累加程序
编程思路:1.建立类包demo: 2.在类包中建立CommanParameter类: 3.利用for循环通过强制类型转换将在后台中输入的String类型的字符转换为整型并进进累加操作: package ...
- Strusts2--课程笔记5
数据验证: 输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证. 分为以下四种情况: (1)手工编写代码,对所有Ac ...
- ios隐藏键盘的方式简单应用
iOS开发中经常要用到输入框,默认情况下点击输入框就会弹出键盘,但是必须要实现输入框return的委托方法才能取消键盘的显示,对于用户体验来说很不友好,我们可以实现点击键盘以外的空白区域来将键盘隐藏, ...
- 【01-14】hibernate时间生成
package rugal.sample.core.entity; import java.util.Date; import java.util.UUID; import javax.persist ...