1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| 1. 表与表之间存在三种关系:分别是一对一、一对多、多对多。
2. 关联查询:指在查询某张表数据的同时也查询与该表关联表中的数据。
3. 缓存:指将已经查询出的对象缓存在内存中,再次查询该对象时从内存中直接获取,不再从数据库获取,从而提高程序的运行效率。
4. 一对一关联查询:给出需求:查询所有订单分别是哪些顾客订购的。
5. 有两种方法创建用于视图的VO类,一种是使用扩展列的VO类,另一种是使用扩展实体的POJO类。
5.1方法一: 5.1.1定义VO类:VO中的userInfo属性从父类继承,VO中的订单信息是类中的扩展列 5.1.2Mapper映射配置(一对一查询,使用resultType实现) 5.1.3Mapper接口定义 5.1.4单元测试 5.1.5打印运行 5.2方法二: 5.2.1定义VO类OrdersVo:将UserInfoModel类的对象作为OrdersModel类的属性, UserInfoModel类的对象用于存储订单的用户信息。 5.2.2Mapper映射配置(一对一查询,使用resultMap实现) 5.2.3定义resultMap: 5.2.3.1订单信息 5.2.3.2用户信息(使用assciation作用:当一个实体类封装另一个实体类时,就需要它,并且只能一对一使用 5.2.4Mapper接口定义 5.2.5单元测试 5.2.6打印运行
6. 一对多关联查询:需求:查询订单及其订单明细和订单用户
6.1给出需求:查询订单及其订单明细和订单用户 6.2需求分析:一个订单可以购买多个商品,因此订单与商品之间是一对多的关系。 6.3步骤:
6.3.1定义POJO类 6.3.2Mapper映射配置(一对多) 6.3.3resultMap定义: 6.3.3.1extends:实现订单信息和用户信息从OrderAndUserInfoResultMap继承; 6.3.3.2collection:对关联查询到多条记录映射到一个list集合对象中(一对多使用) 6.3.3.3ofType:指定映射到list集合属性中pojo类型 6.3.4Mapper接口定义 6.3.5单元测试 6.3.6打印运行
测试结果表明:一对多查询先于一对一查询执行打印出来。问题:为什么orderdetailModel不能改为orderdetailModels?其他却可以改? 自己测试总结:private List<OrderdetailModel> orderdetailModel=null;代码中OrderdetailModel不能加s,否则编译错误,orderdetailModel也不行,否则找不到getting方法。
7. 多对多关联查询:需求:查询用户和用户购买的商品
7.1需求:查询用户和用户购买的商品 7.2需求分析:由于用户有多个,商品也有多个,用户与商品之间形成多对多的关系。 7.3步骤: 7.3.1定义POJO类UserInfoModel,封装OrdersModel类 7.3.2定义OrdersModel类,封装UserInfoModel类和OrderdetailModel类 7.3.3定义OrderdetailModel类,封装GoodsModel类 7.3.4定义GoodsModel类 7.3.5userinfoMapper.xml映射配置findUserAndGoods 7.3.6resultMap定义UserAndGoodsResultMap 7.3.7IUserInfoMapper接口定义findUserAndGoods方法 7.3.8TestFindOrderAndOrderDetail.java单元测试 7.3.9打印运行
补充:级联的优点是获取关联数据十分方便,但是级联过多会增加数据库系统的复杂度,同时降低系统的性能。如果表 A 中有一个外键引用了表 B 的主键,A 表就是子表,B 表就是父表。当查询表 A 的数据时,通过表 A 的外键将表 B 的相关记录返回,这就是级联查询。例如,当查询一个人的信息时,同时根据外键(身份证号)将他的身份证信息返回。
|