1.重点知识回顾
购销合同查看,采用类似hibernate方式,都以对象关联方式。
(1)PO为了利用MyBatis性能,在创建时,没有采用关联对象关联,而是将对象关键字段,也就是外键,利用这个普通属性,来记录值,表数据间关联关系存在,但对象关联关系不存在。代码也就变得简单。在货物新增时,只要从主对象中携带过来,主表ID即可。
(2)VO为了方便对象关联时取数据。在列表循环货物信息时,要去查询当前货物下的附件时,如果采用上面的方式,只能再次查询。但是我们以对象关联方式,可以直接获取到当前货物下的附件集合,一次SQL所有的附件都查询出来。

PO/VO都是POJO对象。根据业务的当前环境。

货物数、附件数的查询(一个合同下多个货物,每个货物下多个附件)
方法1:代码可以通过合同号,分别去查询货物数、附件数;它需要发出多条的SQL再次查询。
方法2:利用SQL语句直接支持,它可以把一个结果集作为一个字段值,这样的SQL返回结果集必须一个列。同时在这个子查询中它的条件可以拼接动态的条件。
contract_id=t.contract_id t是总表的别称。这样引入一个动态的条件。一次类推实现了附件数的查询。

方法1和方法2效能都不高。对于方法1,要重新发出SQL子查询。效率低。对于方法2,SQL嵌套很多子查询,但是它是数据库级别(也就是运行在强大的服务器上),强大的服务器架构下的数据库能够处理复杂的嵌套语句。
(为什么重新发出SQL子查询效率就比嵌套很多子查询来查询效率低?因为每次重新发出SQL的时候,都需要重新连接数据库连接池,开启事务,然后查询完毕之后断开事务,关闭与数据库连接池的链接,然后再去进行下一条SQL的查询,所以,这中间就浪费了很多时间和资源。)

方法3效率比方法1和方法2都高,方法3是什么?

方法3:冗余+分次计算【亮点】
在表中建立货物数和附件数字段,在货物新增时,当前合同,货物数+1。删除货物,货物数-1;在附件新增时,当前合同附件数+1,删除附件时,附件数-1;删除货物时,要将其下面的附件总数从合同附件数中减去。代码考虑的比较复杂些,但它因为分散各处,计算效率很高。查询时,无需动态计算,效率奇高。

权限【亮点】
角色用户权限,大多数系统都使用此种方式。
细粒度的权限控制,控制到数据访问权限。权限架构才能解决我们实际项目的应用。(如财务) ​​​