数据库中的表在映射为JavaBean的实体类时,实体类的字段名应与数据库表中的字段名一致。那么外键要怎么处理?
1. JavaBean中实体类中不应该出现外键字段,弊端如下 :
如果出现外键对应的字段,那么将会出现一个对象与另一个对象的属性相对应,这将不是面向对象中的对象与对象对应。
单个外键只能存储一个字符串,用处不大
2.外键处理方式 :数据库表中的外键字段应当转换成外键对应的表的对象,也就是JavaBean的实体类不声明外键的字段,而是声明外键对应数据表类的类型。举个例子,如下 :
数据库建表如下 :
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
62
63
64
65
66
67
|
-- 1.1 创建用户表 CREATE TABLE ` user ` ( `uid` varchar (32) NOT NULL , #用户编号 `username` varchar (20) DEFAULT NULL , #用户名 ` password ` varchar (20) DEFAULT NULL , #密码 ` name ` varchar (20) DEFAULT NULL , #昵称 `email` varchar (30) DEFAULT NULL , #电子邮箱 `telephone` varchar (20) DEFAULT NULL , #电话 `birthday` date DEFAULT NULL , #生日 `sex` varchar (10) DEFAULT NULL , #性别 `state` int (11) DEFAULT 0, #状态:0=未激活,1=已激活 `code` varchar (64) DEFAULT NULL , #激活码 PRIMARY KEY (`uid`) ) ENGINE=InnoDB ; -- 2.1 创建分类表 CREATE TABLE `category` ( `cid` varchar (32) NOT NULL , `cname` varchar (20) DEFAULT NULL , #分类名称 PRIMARY KEY (`cid`) ) ENGINE=InnoDB ; -- 3.1 创建商品表 CREATE TABLE `product` ( `pid` varchar (32) NOT NULL , `pname` varchar (50) DEFAULT NULL , #商品名称 `market_price` double DEFAULT NULL , #市场价 `shop_price` double DEFAULT NULL , #商城价 `pdate` date DEFAULT NULL , #上架时间 `is_hot` int (11) DEFAULT NULL , #是否热门:0=不热门,1=热门 `pdesc` varchar (255) DEFAULT NULL , #商品描述 `pflag` int (11) DEFAULT 0, #商品标记:0=未下架(默认值),1=已经下架 `cid` varchar (32) DEFAULT NULL , #分类id PRIMARY KEY (`pid`), KEY `product_fk_0001` (`cid`), CONSTRAINT `product_fk_0001` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`) ) ENGINE=InnoDB ; -- 4 创建订单表 CREATE TABLE ` order ` ( `oid` varchar (32) NOT NULL , `ordertime` datetime DEFAULT NULL , #下单时间 `total` double DEFAULT NULL , #总价 `state` int (11) DEFAULT NULL , #订单状态:1=未付款;2=已付款,未发货;3=已发货,没收货;4=收货,订单结束 `address` varchar (30) DEFAULT NULL , #收获地址 ` name ` varchar (20) DEFAULT NULL , #收获人 `telephone` varchar (20) DEFAULT NULL , #收货人电话 `uid` varchar (32) DEFAULT NULL , PRIMARY KEY (`oid`), KEY `order_fk_0001` (`uid`), CONSTRAINT `order_fk_0001` FOREIGN KEY (`uid`) REFERENCES ` user ` (`uid`) ) ENGINE=InnoDB ; -- 5 创建订单项表 CREATE TABLE `orderitem` ( `itemid` varchar (32) NOT NULL , `quantity` int (11) DEFAULT NULL , #购买数量 `total` double DEFAULT NULL , #小计 `pid` varchar (32) DEFAULT NULL , #购买商品的id `oid` varchar (32) DEFAULT NULL , #订单项所在订单id PRIMARY KEY (`itemid`), KEY `order_item_fk_0001` (`pid`), KEY `order_item_fk_0002` (`oid`), CONSTRAINT `order_item_fk_0001` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`), CONSTRAINT `order_item_fk_0002` FOREIGN KEY (`oid`) REFERENCES ` order ` (`oid`) ) ENGINE=InnoDB ; |
其中订单与订单项的JavaBean的实体类如下 :
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
|
/** * 订单项 */ public class OrderItem { private String itemid ; // 订单项编号 private Integer quantity; // 购买数量 private Double total; // 小计 private Product product ; // 商品对象 private Order order ; // 订单项所在订单对象 ...... } /** * 订单实体类 */ public class Order { private String oid ; // 订单编号 private Date ordertime; // 下单时间 private Double total ; // 总价 private Integer state ; // 订单状态 : 1 : 未付款 2 : 已付款,未发货 3 :已发货,未收货 4: 已收货,订单结束 private String address ; // 收货地址 private String name ; // 收件人姓名 : 收件人不一定是购买人 private String telephone ; // 收件人电话 private User user ; // 订单所属的用户 private List<OrderItem> list = new ArrayList<>() ; // 订单项集合 ...... } |
这样做的优点如下 :
- 程序对象和对象产生关系,而不是对象(Order的对象)和对象的属性(User对象的uid)产生关系
- 设计Order的目的 : 让order携带订单上的数据向service层,dao层传递,user对象是可以携带更多的数据的
- 程序中体现订单对象和订单项对象之间的关系,项目中的部分功能中有类似的需求 : 查询订单的同时,还要获取订单下所有的订单项
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/xddx/p/13382863.html