mybatis之关联关系映射(一对多和多对多关系)
今日目标:
- 一对多关联关系
- 多对多关联关系
本篇博客是在前四篇的基础上在进行进一步开发的
(四) | mybatis集成ehcache&&mybatis集成redis_m0_58525944的博客-CSDN博客 |
(三) | mybatis整合spring&&spring整合mybatis分页插件_m0_58525944的博客-CSDN博客 |
(二) | mybatis之动态sql&&模糊查询&&结果集处理&&mybatis分页&&特殊字符处理_m0_58525944的博客-CSDN博客 |
(一) | MyBatis入门(逆向生成&&增删改查案例)_m0_58525944的博客-CSDN博客 |
目录结构:
准备工作(使用逆向生成工具生成mapper及model)数据库中所需的数据库表,五张表
使用逆向生成工具生成mapper和model
<table schema="" tableName="t_hibernate_order" domainObjectName="Order"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_book" domainObjectName="Hbook"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_category" domainObjectName="Category"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table><table schema="" tableName="t_hibernate_book_category" domainObjectName="HbookCategory"enableCountByExample="false" enableDeleteByExample="false"enableSelectByExample="false" enableUpdateByExample="false"></table>
一对多关联关系
利用order和orderitem两个表,来展示一对多的关联关系,一个订单中有多个订单项,多个订单项对应一个订单
1 建立两个vo类来存储一对多的关联属性(OrderVo:订单一方,OrderItemVo:订单项多方)
orderVo
package com.lgs.vo;
import com.lgs.model.Order;
import com.lgs.model.OrderItem;import java.util.ArrayList;
import java.util.List;//vo类是为了不破坏本身的类的封装性,跟数据库中的字段一一映射的
public class OrderVo extends Order {
// 一个订单中有多个订单项,所以用集合private List<OrderItem> orderItems = new ArrayList<>();public List<OrderItem> getOrderItems() {return orderItems;}public void setOrderItems(List<OrderItem> orderItems) {this.orderItems = orderItems;}
}
OrderItemVo
package com.lgs.vo;
import com.lgs.model.Order;
import com.lgs.model.OrderItem;public class OrderItemVo extends OrderItem {
// 一个订单项对应一个订单private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}}
2 分别在OrderMapper.xml、OrderItemMapper.xml中添加映射关系配置 和 连表查,所以需要两边都要添加一个dao方法及配置sql语句
OrderMapper.xml
<!--映射--><!--property:实体类的属性 column:表字段--><resultMap id="OrderVoMap" type="com.lgs.vo.OrderVo" ><result property="orderId" column="order_id"></result><result property="orderNo" column="order_no"></result><collection property="orderItems" ofType="com.lgs.model.OrderItem"><result property="orderItemId" column="order_item_id"/><result property="oid" column="oid"></result><result property="productId" column="product_id"></result><result property="quantity" column="quantity"></result></collection></resultMap><!--查询语句--><select id="queryOrderVoByOrderId" resultMap="OrderVoMap" parameterType="java.lang.Integer">select * from t_hibernate_order o,t_hibernate_order_item oiwhere o.order_id = oi.oidand o.order_id = #{orderId}</select>
OrderItemMapper.xml
<!--多方的配置-->
<resultMap id="OrderVoMap" type="com.lgs.vo.OrderItemVo" ><result property="orderItemId" column="order_item_id"></result><result property="oid" column="oid"></result><result property="productId" column="product_id"></result><result property="quantity" column="quantity"></result><association property="order" javaType="com.lgs.model.Order"><result property="orderId" column="order_id"></result><result property="orderNo" column="order_no"></result></association></resultMap><select id="queryOrderItemVoByOrderItemId" resultMap="OrderVoMap" parameterType="java.lang.Integer">select * from t_hibernate_order o,t_hibernate_order_item oiwhere o.order_id = oi.oidand oi.order_item_id = #{orderItemId}</select>
2 OrderMapper.java: 和 OrderItemMapper.java:的配置
OrderMapper.java:
OrderVo queryOrderVoByOrderId(@Param("orderId") Integer orderId);
OrderItemMapper.java:
OrderItemVo queryOrderItemVoByOrderItemId(@Param("orderItemId") Integer orderItemId);
3 建立One2ManyService.java类:
package com.lgs.service;
import com.lgs.vo.OrderItemVo;
import com.lgs.vo.OrderVo;
public interface One2ManyService {//通过查询订单关联查询出对应的订单项信息OrderVo queryOrderVoByOrderId(Integer orderId);//查询订单项,关联查询出所属的订单OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId);
}
4 建立One2ManyServiceImpl.java实现类:
package com.lgs.service.impl;
import com.lgs.mapper.OrderItemMapper;
import com.lgs.mapper.OrderMapper;
import com.lgs.service.One2ManyService;
import com.lgs.vo.OrderItemVo;
import com.lgs.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class One2ManyServiceImpl implements One2ManyService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate OrderItemMapper orderItemMapper;@Overridepublic OrderVo queryOrderVoByOrderId(Integer orderId) {return orderMapper.queryOrderVoByOrderId(orderId);}@Overridepublic OrderItemVo queryOrderItemVoByOrderItemId(Integer OrderItemId) {return orderItemMapper.queryOrderItemVoByOrderItemId(OrderItemId);}
}
5 测试
package com.lgs.service.impl;
import com.lgs.model.OrderItem;
import com.lgs.service.One2ManyService;
import com.lgs.vo.OrderItemVo;
import com.lgs.vo.OrderVo;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class One2ManyServiceImplTest extends TestCase {@Autowiredprivate One2ManyService one2ManyService;@Testpublic void queryOrderVoByOrderId() {OrderVo orderVo = this.one2ManyService.queryOrderVoByOrderId(10);System.out.println(orderVo);for (OrderItem orderItem : orderVo.getOrderItems()) {System.out.println(orderItem);}}@Testpublic void queryOrderItemVoByOrderItemId() {OrderItemVo orderItemVo = this.one2ManyService.queryOrderItemVoByOrderItemId(49);System.out.println(orderItemVo);System.out.println(orderItemVo.getOrder());}}
通过查询订单关联查询出对应的订单项信息
查询订单项, 关联所属的订单
多对多关联关系
前面介绍了一对多的关系,那么接下来多对多的映射关系就简单多了,用两个connection配置
为展示多对多的关联关系,利用一本书对应多种类别,一种类别对应多本书的概念
1 建立两个vo类来存储多对多的关联属性(HBookVo:书籍,CategoryVo:书籍种类 都是多方,所以都用集合)
HBookVo.java:
package com.lgs.vo;
import com.lgs.model.Category;
import com.lgs.model.Hbook;
import java.util.ArrayList;
import java.util.List;
public class HbookVo extends Hbook {private List<Category> categories = new ArrayList<>();public List<Category> getCategories() {return categories;}public void setCategories(List<Category> categories) {this.categories = categories;}
}
CategoryVo.java:
package com.lgs.vo;
import com.lgs.model.Category;
import com.lgs.model.Hbook;
import java.util.ArrayList;
import java.util.List;
public class CategoryVo extends Category {private List<Hbook> hbooks = new ArrayList<>();public List<Hbook> getHbooks() {return hbooks;}public void setHbooks(List<Hbook> hbooks) {this.hbooks = hbooks;}
}
2 在HBookCategoryMapper.xml中添加映射关系配置 和 连表查,所以需要添加一个dao方法及配置sql语句
HBookCategoryMapper.xml(配置两个多对多和连表查的SQL):
<resultMap id="HbookVoMap" type="com.lgs.vo.HbookVo"><result property="bookId" column="book_id"></result><result property="bookName" column="book_name"></result><collection property="categories" ofType="com.lgs.model.Category"><result property="categoryId" column="category_id"></result><result property="categoryName" column="category_name"></result></collection></resultMap><resultMap id="CategoryVoMap" type="com.lgs.vo.CategoryVo"><result property="categoryId" column="category_id"></result><result property="categoryName" column="category_name"></result><collection property="hbooks" ofType="com.lgs.model.Hbook"><result property="bookId" column="book_id"></result><result property="bookName" column="book_name"></result></collection></resultMap><select id="queryByBookId" resultMap="HbookVoMap" parameterType="java.lang.Integer">select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category cwhere b.book_id = bc.bid and bc.cid = c.category_id and b.book_id = #{bookId}</select><select id="queryByCid" resultMap="CategoryVoMap" parameterType="java.lang.Integer">select * from t_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category cwhere b.book_id = bc.bid and bc.cid = c.category_id and c.category_id=#{cid}</select>
3 HBookCategoryMapper.java(添加两个查询方法):
HbookVo queryByBookId(@Param("bookId") Integer bookId);CategoryVo queryByCid(@Param("cid") Integer cid);
4 建立Many2ManyService.java类:
package com.lgs.service;
import com.lgs.vo.CategoryVo;
import com.lgs.vo.HbookVo;
import org.apache.ibatis.annotations.Param;
public interface Many2ManyService {HbookVo queryByBookId(Integer bookId);CategoryVo queryByCid(Integer cid);
}
5 建立Many2ManyServiceImpl.java实现类:
package com.lgs.service.impl;import com.lgs.mapper.HbookCategoryMapper;
import com.lgs.service.Many2ManyService;
import com.lgs.vo.CategoryVo;
import com.lgs.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class Many2ManyServiceImpl implements Many2ManyService {@Autowiredprivate HbookCategoryMapper hbookCategoryMapper;@Overridepublic HbookVo queryByBookId(Integer bookId) {return hbookCategoryMapper.queryByBookId(bookId);}@Overridepublic CategoryVo queryByCid(Integer cid) {return hbookCategoryMapper.queryByCid(cid);}}
6 测试
package com.lgs.service.impl;
import com.lgs.model.Category;
import com.lgs.model.Hbook;
import com.lgs.service.Many2ManyService;
import com.lgs.vo.CategoryVo;
import com.lgs.vo.HbookVo;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class Many2ManyServiceImplTest extends TestCase {@Autowiredprivate Many2ManyService many2ManyService;@Testpublic void queryByBookId() {HbookVo hbookVo = many2ManyService.queryByBookId(8);System.out.println(hbookVo);for (Category category : hbookVo.getCategories()) {System.out.println(category);}}@Testpublic void queryByCid() {CategoryVo categoryVo = many2ManyService.queryByCid(8);System.out.println(categoryVo);for (Hbook hbook : categoryVo.getHbooks()) {System.out.println(hbook);}}
}
根据书的id查看书有哪些类别
根据类别查询此书类别的书还有哪些
OK!到这就结束了,希望能帮到你!!!
mybatis之关联关系映射(一对多和多对多关系)相关推荐
- 6.2 、MyBatis 高级映射(resultMap 标签多表联查 , 一对多,多对一关系)
文章目录 一.创建表结构,添加数据,实现表中数据的关联关系 二. association 标签:用于一对一.多对一场景使用 1.实现一对一,多对一关系结果集映射 1.1 按照查询嵌套处理 1.2 按照 ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射--一对多(多对一) 我们以客户(Customer)与 ...
- SpringDataJpa的使用 -- 一对一、一对多、多对多 关系映射
SpringDataJpa的使用 – 一对一.一对多.多对多 关系映射 本文主要讲述 @OneToOne.@OneToMany.@ManyToOne.@ManyToMany 这四个关系映射注解的使用, ...
- EF里一对一、一对多、多对多关系的配置和级联删除
EF里一对一.一对多.多对多关系的配置和级联删除 本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个Per ...
- 【数据库】一对一、一对多、多对多关系
图解数据库一对一.一对多.多对多关系 一.一对一 如上图:人与身份证存在1:1关系 存储时,不论是围绕人还是围绕身份证建表,一行数据代表一条关系,通常建立员工表(身份证作为一个属性) 二.一对多 如上 ...
- mysql一对多、多对多关系表的建立与查询
夏梦,只写最简洁最有效的教程-欢迎关注 在实际的开发场景中,我们会建立非常多的表,其中一对多和多对多关系表的建立和查询对与一些刚接触的人来说可能会有些疑惑,所以为了解决这些疑惑,有了这篇文章. 注意: ...
- 数据库中一对一,一对多,多对多关系总结
由于最近在学数据库的东西,又想到了大一是老师交的如何通过数据库关系见表,下面就来说一下这三种关系的使用 数据库一对一.一对多.多对多关系 一.首先给出三种关系的实例 1.一对一关系实例 一个人对应一张 ...
- 【数据表间关联关系】 一对多、多对一、一对一、多对多
关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系: 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角度来说多个球员属于一个球队 即为多对一 数据表间 ...
- mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)
mybatis框架练习 mybatis框架中,包括实体类(这些实体类与数据库中的字段属性相对应),mybatis的配置文件(即mybatis-config.xml,这个配置文件用于连接实体类和orm( ...
- Mybatis之关联关系映射
目录 一.一对多 1.Mybatis的关联关系和Hibernate的关联关系大同小异. 2.关于一对多的关系: 3.关于Mybatis一对多的关系配置步骤:(以Order和OrderItem为例) 3 ...
最新文章
- tensorflow 1.0 学习:十图详解tensorflow数据读取机制
- 【报告】2014年移动端二次元用户调查报告:进击的90后
- OpenCV_008-OpenCV 中的图像算术运算
- Yahoo Mail,慢功出细活〔转载〕
- jsp mysql优点_asp、php、asp.net、jsp的介绍和各自的优缺点
- 【资源】史上最全数据集汇总
- 信息学奥赛C++语言:百钱买百鸡
- python练习题1
- android 获取gpio电平值_使用GPIO实现SPI协议操作OLED
- windows系统远程桌面相关内容
- 罗永浩:我今年四十八岁,还可以承受无数次的失败;iOS14 或将推出系统级「小程序」功能;​ PyCharm新版发布| 极客头条...
- 让画面更逼真!这个强化超分辨率GAN让老游戏迎来第二春 | 代码+论文+游戏MOD...
- vs2010使用svn--浅谈AnkhSvn
- Java高级:面试题-1
- 二维码扫一扫java开发
- HTML5拖放(drag和drog)
- c语言中的面积和体积计算器,C语言编程问题(面积计算器)——新手问题
- python与医学统计_python简单数据分析——医药数据分析
- h3c交换机配置远程管理_h3c 交换机配置VLAN和远程管理
- Excel常用技巧笔记
热门文章
- python pprint用法_如何使用pprint使用内置的str(self)方法打印对象?
- 雅虎天气的图片URL格式
- iOS开发 顶部状态栏的隐藏
- java 自定义message类_Java 自定义异常类
- Kubernetes安全专家认证 (CKS)1.20模拟题答案中文版
- 第10放映室 看片笔录
- 【蓝桥杯备赛系列 | 简单题】十六进制转八进制、十六进制转十进制、十进制转十六进制 (手撕)
- 上海内推 | 上海人工智能实验室招聘大语言模型算法研究实习生
- SSD训练的优化器们
- [AMBA]AHB总线协议简介