00:00
这节课我们来讲一下绑定表,绑定表是建立在多表关联的基础上的,前面我们对多表关联做了插入的操作,那么这堂课呢,我们对多表关联做查询操作,我们的需求是查询每个订单的订单号和总的订单金额,那因为我们的查询数据呢,要封装在一个对象里面,所以呢,我们就创建一个对象叫做order VO,这个order VO对象里面呢,封装了order number,也就是订单号和总的订单金额,我们先把这个VO对象创建出来。在entity当中。我们先来创建这个微。好,我们先创建一个类型的order number,然后呢,我们再创建一个big decimal类型的amount。
01:03
接下来呢,我们为我们刚才的需求。添加一个map方法,那么这个方法呢,需要我们去同步的配置一个查询语句,所以呢,我们来看一看这个怎么写。打开map。我们找到order map,因为查的最终是订单相关的数据哈,我们就写在map里面,那么在里面呢,我们写一个list,最后查询的数据呢是order,那么我们给它起个名字,比如说就叫get order amount。好,我们查询的是所有的订单的订单号和订单金额的一个列表,所以呢,我们的返回值呢,就是一个列表,那么在这个select注解当中,我们可以直接配置所要查询的SQL语句,那么这里面要求的是一个数组哈,那为什么是数组呢?因为你的SQ语句可能会很长,那如果很长的话呢,你可能会换行去编写,那么它在这里面的每一行,其实最终呢,都会给你用空格呢连接起来,最终呢,组成一个完整的SQ语句,啊是这个样子的,那在这个地方写SQL语句呢,不是特别方便,事先对我们SQL语句的正确性进行测试,所以呢,我们先把SQL语句呢写在我们的。
02:23
Circle的查询分析器当中,那我们现在要查的呢是两张表,所以我们先临时写一个星吧,然后先确定一下要查的两张表,我们要查的一张表呢是t order表,当然这是我们的逻辑表明,所以呢,现在我们真正要执行一个查询测试,我们就先写一个实际的表明,那假设说我们查T0。然后呢,我们给这个表呢,写一个别名叫O啊,那我们去做一个转转t order item,零,那我们给这个表呢,也起个别名叫I,好,它们的连接条件呢是order number,所以是O点。
03:11
等于I点这个呢,就是我们的连接条件好,然后接下来呢。我们要查询的是。每个订单的订单号和订单总金额,那么所以呢,我们需要把订单号呢查询出来,那么订单号呢,就是o.number好,订单总金额呢,我们需要做一个计算,那怎么计算呢?因为我们每一笔订单。下面呢,都会有若干个订单项,比如说像。艾特硅谷五这个订单,那下面呢,有三个订单项,那这样的话,我们要求订单总金额的话,首先我们应该用订单的价格乘以订单的商品数量,然后呢,再把每一个相同的订单号的订单的价格和商品数量相乘之后呢,再把它们加起来,啊要做这样一个操作,所以呢,这面呢,我们应该去做一个分组。
04:13
那这块呢,是有一个group bed,根据订单号来进行分组,所以是o.order number,好分完组之后呢,在这个地方我们就可以做一个统计了,那么点。和I点相乘。然后我们把它。做一个别名呢,应该我们这个。好,那这是我们整个的SQL语句,我们先测试一下它能不能在我们当前的server order0这个数据库的t item0和t order0这个表当中呢去有效的执行。
05:07
好,那现在呢,我们就正确的执行了这个方法,我们来验证一下它的结果对不对哈。艾特硅谷六这个订单呢,它的总的订单金额呢,应该是27,我们来看一看对不对。那么order item里面艾特硅谷六一共有三条记录,那这三条记录呢,每一条记录都有一个价格是三,数量是三的这样的一个订单项,那所以呢,三乘以三的等于九,然后这个都是三乘以三是不是?所以呢,三九二十七,那正好呢?每一条记录的总金额呢,就是27,那么艾特硅谷八这条记录其实也是一样的。啊,它情况是一样的,所以呢也是27,那这样的话呢,我们就可以确认我们要的SQL语句呢,就是它当然了,这个只是查了T0哈,还有零并没有,那么原理都是一,并且呢,恰好我们的和的水平分和分表的策略都是一样的,所以呢,我们可以确定的就是。
06:11
艾特硅谷六这个编号的订单项一定只存在于T0当中,不可能存在于T1当中啊,因为它按照这个订单号进行分片了啊,所以说呢,这个呢,也是为什么我们要按照这个订单号给这两个表做相同的分片策略的一个原因,那接下来呢,我们来看看。怎么把这个部分的内容整合到我们的项目当中,我们把它复制一下,然后呢,在这个select的这个地方呢,我们粘贴一下,粘过来好粘过来之后呢,那么你也可以像这样去这么写哈,但是呢啊,我们也可以这样去写,就是把它变成数组的形式。这样的话呢,我们的应用程序会自动的把这三个部分的内容组装起来,并且在这三个部分当中添加自动的空格,因为我们知道这字符串组装起来之后,中间是要有空格的,否则的话这四口语句就不对了,对不对?但是如果我们是以数组的形式来写的话,那么这个空格呢,在组装完毕之后呢,会被自动的添加。
07:18
好,这个写完了之后呢,最后呢,我们还要做一个修改,那么这个位置我们要把它改成逻辑表明,而不是实际表明。好,这个改完了之后呢,我们就来去写一个测试用例,我们打开she test,在这个里面呢,添加一个关联查询的测试。我们把结果打印一下。
08:09
运行。好,我们来看一下test这块。那么这里面呢,查询出了123456788个订单,那我们的数据库当中呢,也确实有这八个订单,而且这个订单的订单总金额呢,也确实是这样的一些数据记录,但是我们现在要看的呢,其实并不是他的这个具体的查询结果,我们要看的呢,是它的查询过程,我们看一看它。逻辑背后的实际都有什么,那么现在呢,就是前面我们在文件当中写的这个哈,那么我们来具体看一下实际色口,搜索一下一共有多少个实际色口,你们发现呢,一共有八个实际色口,我们把这八个实际色口呢,都给他详细的看一下哈,首先呢,第一个circle它是查询了。
09:15
零表和表好是零表和表的查询,然后接下来呢。第二个查询的是T和。Item表。那很显然这种查询呢,它是没有必要的,因为我们前面的分片策略呢,已经确定了和T1表中相关的记录肯定都在t order item1表中,而和t order item0表中相关的记录肯定呢都会存在于T0表中,所以呢,它在这个地方呢,实际上针对。表四张表呢,做了一个卡机式的查询,什么意思呢?大家看啊。
10:10
T0和T0进行关联查询,一和t it1进行关联查询,然后呢,T1和T0进行关联查询,然后呢,T0和T1进行关联查询,那么这些查询呢,都是在serve。这台服务器上。所以呢,Serve order1台服务器上呢,有四条查询语句。它是一个卡机关啊,那么这只是针对这台服务器上的一个关联查询的情况样。后面还有四条S语句,它们呢是针对server order0这台服务器的关联查询的情况,那么它也形成了一个笛卡尔基关联,那这个里面有T0对t order it0的查询。
11:10
有一对一的查询,另外呢还有一对零的查询,还有T0对t item1的查询,所以这很显然查询效率呢是比较低的,因为还是和刚才的原因一样,像T1和t it0这两个表进行关联呢,是没有必要的啊,然后呢,T0和t it1这两个表呢,进行关联也是没有必要的,因为我们根据分片策略已经可以确定我们相关的数据一定不会存在于这两个表当中的。那么接下来我们怎么解决这个问题?就是下面我们要介绍的绑定表了。
我来说两句