JavaBean实体类处理外键过程解析

网友投稿 275 2022-11-29


JavaBean实体类处理外键过程解析

数据库中的表在映射为javaBean的实体类时,实体类的字段名应与数据库表中的字段名一致。那么外键要怎么处理?

1. JavaBean中实体类中不应该出现外键字段,弊端如下 :

如果出现外键对应的字段,那么将会出现一个对象与另一个对象的属性相对应,这将不是面向对象中的对象与对象对应。

单个外键只能存储一个字符串,用处不大

2.外键处理方式 :数据库表中的外键字段应当转换成外键对应的表的对象,也就是JavaBean的实体类不声明外键的字段,而是声明外键对应数据表类的类型。举个例子,如下 :

数据库建表如下 :

-- 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 创建http://分类表

CREATE TABLE `category` (

`cid` varchar(32) NOT NULL,

`cname` varchar(20) DEFAULT NULL, #分类名称

PRIMARY KEY (`cid`)

) ENGINE=InnoDB ;

YNncE-- 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的实体类如下 :

/**

* 订单项

*/

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 list = new ArrayList<>() ; // 订单项集合

......

}

这样做的优点如下 :

程序对象和对象产生关系,而不是对象(Order的对象)和对象的属性(User对象的uid)产生关系

设计Order的目的 : 让order携带订单上的数据向service层,dao层传递,user对象是可以携带更多的数YNncE据的

程序中体现订单对象和订单项对象之间的关系,项目中的部分功能中有类似的需求 : 查询订单的同时,还要获取订单下所有的订单项


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java如何在命令行中获取指定数据
下一篇:Jmeter参数化获取序列数据实现过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~