其实一对一和一对多映射,在前面的配置中已经接触到,我没在日志里直接说明,是因为想要在之后写一篇总结日志(就是本篇),总结这些高级映射的配置。例如一对一查询在关联的嵌套结果集查询中就涉及到,一对多查询则在这个基础上再加上一个或多个嵌套结果集,它们可以是一个实体类,或者是一个集合。多对多查询稍微有点复杂,举个例子来说,一个商城管理系统中,一名顾客在一个购物清单中可以有多件商品,而一件商品可以被多名顾客选购,它们之间的关系是多对对。假设现在有这么一个需求,查询数据表库中,所有的顾客信息,包括它们的购物清单,以及清单里面的商品信息,怎么做?下面会说。
无论是一对一、一对多还是多对多查询,都涉及到不同表之间的数据交互,因为它们之间需要主外键关系来关联,例如顾客表和购物清单表都有顾客id属性,根据这个属性来查询不同顾客对应的购物清单,有了主外键关系后,就可以进行高级映射了。
为了展示三种映射示例,首先建立一个商场管理系统模型,里面有三张数据表,分别是顾客表user,购物车(商品清单)表shoppingcart和商品表products。顾客和商品清单之间是一对多的关系,因为一名顾客可以多次进商场购物,每一次购物生成一个购物清单(购物车),而每一张购物清单只属于一名顾客,所以顾客表和购物车表之间是一对多的关系。 还有商品表product,因为一张购物清单中可以有多件商品,所以商品表和购物车表为一对多的关系。因为一名顾客可以购买多件商品,一件商品也可以属于多名顾客,所以顾客和商品又构成多对多关系。我们在测试时,可以建立基本的三张表,:顾客表、购物车表和商品表(当然最好多加几张表,例如商品评价表),它们之间的查询可以组合出一对一、一对多以及多对多的关系,理清各张表的关系后,就可以进行测试了。
从上面的事例模型中可以看到,含一对一关系的两张表有,购物车表和用户表,要注意其中的顺序不要弄乱,购物车和顾客是一对一关系,但反过来不是,顾客和购物车是一对多的关系。在查询需求中,这种多表之间一对一查询的场景,典型的有:一对一嵌套结果集查询。举个例子,假如我们要查询购物车表中,某一张购物清单信息,以及对应的该名顾客的个人信息。有两种配置方式,或是说两种方法实现:
实现上面的一对一嵌套结果集查询,如果使用resultType来配置SQL映射的话,因为涉及到两张表的交互,且最后只能映射到一个实体类中,所以需要新建一个查询包装类,来包括其中含有的两张表的结果集字段对应的属性(这句话表述的不好- -、)。也就是说,新创建一个查询包装类,里面既含有购物车表中的字段对应的属性,也含有用户表中字段对应的属性,这样才能接收结果集中包含的两个表里的数据。来看看这个查询包装类:
// 购物车表一对多查询包装类
public class ShoppingCartInstance extends ShoppingCart implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String username; //顾客姓名
private String gender; //性别
private String province; //省会
private String city; //城市
public ShoppingCartInstance() {
}
public ShoppingCartInstance(int cartId, int userId, int productId,
String productName, int number,
double price, User user, String username, String gender, String province,
String city) {
super(cartId, userId, productId, productName, number, price);
this.username = username;
this.gender = gender;
this.province = province;
this.city = city;
}
// 省略get()和set()方法
}
我们的查询包装类采用继承的方式得到购物车实体类的所有属性,当然你也可以重新一个一个自己定义,这样来舍去一些不需要的属性。接着在查询包装类中追加顾客表中的属性,对应返回结果集中顾客数据表的字段。
数据包装类准备好后,接下来可以写我们的SQL语句和映射配置了:
<!-- 一对一查询:resultType实现 -->
<select id="queryShoppingCartInstance1" parameterType="int" resultType="ShoppingCartInstance">
SELECT
S.cartId, S.productName, S.userId, S.price, S.number,
U.id, U.username, U.gender, U.province, U.city
FROM ShoppingCart S left outer join user U on S.userId = U.id
WHERE S.cartId = #{id}
</select>
SQL语句根据id查询出购物清单,并根据外键,顾客id关联另一张数据表user顾客表。
public void TestAssociationQuery() throws IOException {
SqlSession sqlSession = dataConn.getSqlSession();
List<ShoppingCartInstance> resultList = sqlSession.selectList("queryShoppingCartInstance1", 2);
StringBuffer result = new StringBuffer();
double totalAmount;
System.out.println("顾客姓名: " + resultList.get(0).getUsername());
System.out.println("性别: " + resultList.get(0).getGender());
System.out.pr
文章浏览阅读1.1k次。Bcrypt百度百科:1、 bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。2、bcrypt算法相对来说是运算比较慢的算法,在密码学界有句常话:越慢的算法越安全。算法越算,黑客破解成本越高.通过salt和const这两个值来减缓加密过程,ta的加密时间(百ms级)远远超过md5(大概1..._写一个bcrypt
文章浏览阅读2.4w次,点赞14次,收藏87次。LaTeX中英文字体设置、混排,ctex宏包引用_latex英文字体
文章浏览阅读5.7k次,点赞2次,收藏20次。这里用的是uni-app自带的UniPush1.0(个推服务),所以只针对UniPush1.0介绍实现步骤。当然现在已经出了UniPush2.0(HBuilderX 3.5.1及其以上版本支持),新项目的话还是推荐使用UniPush2.0。如果要使用UniPush2.0,请移步 UniPush 2.0 使用指南。_uniapp消息推送功能
文章浏览阅读1.3w次,点赞41次,收藏217次。一、sort()sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数原型:sort(key,reverse=False)key:用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;reverse:是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。例如:1、list=[2,24,8,6,35,7,22,30]list.sort()pri_sort和sorted函数的区别
文章浏览阅读299次。同上一篇一样,这边摸鱼笔记也是关于分类和回归分支的权重设计。Mutual Supervision for Dense Object Detection(ICCV2021)阅读笔记_mutual supervision for dense object detection
文章浏览阅读354次,点赞5次,收藏4次。探索DLT645:一种智能电表通讯协议的实现项目地址:https://gitcode.com/WKJay/DLT645在能源管理领域,尤其是在智能家居和工业自动化中,高效、准确的数据采集至关重要。DLT645 是一个专注于实现中国国家标准GB/T 18039.2-2008的开源库,它提供了一种与智能电表进行通讯的标准化方式。通过这个项目,开发者可以轻松地整合智能电表数据到他们的应用中。项目简..._645协议智能电表采集
文章浏览阅读1.4w次,点赞7次,收藏16次。两个集合: a = [1,2,3,4,5,6] b = [3,5,7]1.求交集 方式一: intersection = [i for i in a if i in b] intersection = list(set(a).intersection(set(b))) 结果: [3, 5]2.求并集 union= list(set(a).u..._python计算四个数组的交集代码
文章浏览阅读1.1k次。谷歌在 I/O 2021开幕式的主题演讲中发布了 Android 12系统;目前 Android 12系统可用于谷歌的 Pixel 手机(Pixel3及以上),以及联想、一加、华硕、OPPO、realme、夏普、Tecno、vivo、TCL、小米和中兴等手机,国内的众多手机厂家即将上线,但是还没有荣耀的消息,华为肯定不要考虑,必然是鸿蒙系统。发布的Android 12第一个Beta版本,可以看到用..._微软手机安装鸿蒙
文章浏览阅读265次。并发编程之锁ReentrantLockReentrantReadWriteLockConditionReentrantLockReentrantReadWriteLockCondition
文章浏览阅读7.4k次,点赞11次,收藏45次。Apollo 携程Apollo配置中心目录导航 携程 Apollo 配置中心 | 学习笔记(一) | Apollo配置中心简单介绍 携程 Apollo 配置中心 | 学习笔记(二) | Windows 系统搭建基于携程Apollo配置中心单机模式 携程 Apollo 配置中心 | 学习笔记(三) | 自..._apollo分布式配置黑马学习笔记
文章浏览阅读1.1k次,点赞16次,收藏25次。人工智能 (AI) 是对人类智慧行为的仿真。它通常是设计用来感知环境、了解行为并采取行动的一台计算机或一个系统。想想自动驾驶汽车:此类 AI 驱动系统将机器学习和深度学习等 AI 算法集成到支持自动化技术的复杂环境。据麦肯锡预计,到 2030 年,AI 的全球经济价值将高达 13 万亿美元。这是因为在 AI 浪潮的影响下,几乎各行各业乃至每一个应用领域的工程环节都在转型。除了自动驾驶以外,AI 还广泛应用于以下领域:机器故障预测模型,告知何时需要进行机器保养;健康和传感器分析,如病患监护系统;
文章浏览阅读1.8k次,点赞3次,收藏8次。VueRouter安装和使用vue-router安装模块化中使用使用vue-router的步骤使用history模式router-link重定向/默认路由点击事件跳转路由动态路由路由懒加载路由嵌套参数传递(一)路由元信息全局导航守卫前置全局后置钩子组件内守卫路由独享的守卫keep-alive注意URL:协议://主机:端口/路径?查询(query)所有的组件都继承自Vue类的原型打包:npm run buildredirect:[ˌriːdəˈrekt ] 重定向replace:没有返回箭头_router及vue-router教程