數據庫中的表在映射為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 , #商城價 `pimage` varchar (200) 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