JavaBean实体类处理外键过程解析
数据库中的表在映射为JavaBean的实体类时,实体类的字段名应与数据库表中的字段名一致。那么外键要怎么处理?
1.JavaBean中实体类中不应该出现外键字段,弊端如下:
如果出现外键对应的字段,那么将会出现一个对象与另一个对象的属性相对应,这将不是面向对象中的对象与对象对应。
单个外键只能存储一个字符串,用处不大
2.外键处理方式:数据库表中的外键字段应当转换成外键对应的表的对象,也就是JavaBean的实体类不声明外键的字段,而是声明外键对应数据表类的类型。举个例子,如下:
数据库建表如下:
--1.1创建用户表 CREATETABLE`user`( `uid`varchar(32)NOTNULL,#用户编号 `username`varchar(20)DEFAULTNULL,#用户名 `password`varchar(20)DEFAULTNULL,#密码 `name`varchar(20)DEFAULTNULL,#昵称 `email`varchar(30)DEFAULTNULL,#电子邮箱 `telephone`varchar(20)DEFAULTNULL,#电话 `birthday`dateDEFAULTNULL,#生日 `sex`varchar(10)DEFAULTNULL,#性别 `state`int(11)DEFAULT0,#状态:0=未激活,1=已激活 `code`varchar(64)DEFAULTNULL,#激活码 PRIMARYKEY(`uid`) )ENGINE=InnoDB; --2.1创建分类表 CREATETABLE`category`( `cid`varchar(32)NOTNULL, `cname`varchar(20)DEFAULTNULL,#分类名称 PRIMARYKEY(`cid`) )ENGINE=InnoDB; --3.1创建商品表 CREATETABLE`product`( `pid`varchar(32)NOTNULL, `pname`varchar(50)DEFAULTNULL,#商品名称 `market_price`doubleDEFAULTNULL,#市场价 `shop_price`doubleDEFAULTNULL,#商城价 `pimage`varchar(200)DEFAULTNULL,#商品图片路径 `pdate`dateDEFAULTNULL,#上架时间 `is_hot`int(11)DEFAULTNULL,#是否热门:0=不热门,1=热门 `pdesc`varchar(255)DEFAULTNULL,#商品描述 `pflag`int(11)DEFAULT0,#商品标记:0=未下架(默认值),1=已经下架 `cid`varchar(32)DEFAULTNULL,#分类id PRIMARYKEY(`pid`), KEY`product_fk_0001`(`cid`), CONSTRAINT`product_fk_0001`FOREIGNKEY(`cid`)REFERENCES`category`(`cid`) )ENGINE=InnoDB; --4创建订单表 CREATETABLE`order`( `oid`varchar(32)NOTNULL, `ordertime`datetimeDEFAULTNULL,#下单时间 `total`doubleDEFAULTNULL,#总价 `state`int(11)DEFAULTNULL,#订单状态:1=未付款;2=已付款,未发货;3=已发货,没收货;4=收货,订单结束 `address`varchar(30)DEFAULTNULL,#收获地址 `name`varchar(20)DEFAULTNULL,#收获人 `telephone`varchar(20)DEFAULTNULL,#收货人电话 `uid`varchar(32)DEFAULTNULL, PRIMARYKEY(`oid`), KEY`order_fk_0001`(`uid`), CONSTRAINT`order_fk_0001`FOREIGNKEY(`uid`)REFERENCES`user`(`uid`) )ENGINE=InnoDB; --5创建订单项表 CREATETABLE`orderitem`( `itemid`varchar(32)NOTNULL, `quantity`int(11)DEFAULTNULL,#购买数量 `total`doubleDEFAULTNULL,#小计 `pid`varchar(32)DEFAULTNULL,#购买商品的id `oid`varchar(32)DEFAULTNULL,#订单项所在订单id PRIMARYKEY(`itemid`), KEY`order_item_fk_0001`(`pid`), KEY`order_item_fk_0002`(`oid`), CONSTRAINT`order_item_fk_0001`FOREIGNKEY(`pid`)REFERENCES`product`(`pid`), CONSTRAINT`order_item_fk_0002`FOREIGNKEY(`oid`)REFERENCES`order`(`oid`) )ENGINE=InnoDB;
其中订单与订单项的JavaBean的实体类如下:
/** *订单项 */ publicclassOrderItem{ privateStringitemid;//订单项编号 privateIntegerquantity;//购买数量 privateDoubletotal;//小计 privateProductproduct;//商品对象 privateOrderorder;//订单项所在订单对象 ...... } /** *订单实体类 */ publicclassOrder{ privateStringoid;//订单编号 privateDateordertime;//下单时间 privateDoubletotal;//总价 privateIntegerstate;//订单状态:1:未付款2:已付款,未发货3:已发货,未收货4:已收货,订单结束 privateStringaddress;//收货地址 privateStringname;//收件人姓名:收件人不一定是购买人 privateStringtelephone;//收件人电话 privateUseruser;//订单所属的用户 privateListlist=newArrayList<>();//订单项集合 ...... }
这样做的优点如下:
- 程序对象和对象产生关系,而不是对象(Order的对象)和对象的属性(User对象的uid)产生关系
- 设计Order的目的:让order携带订单上的数据向service层,dao层传递,user对象是可以携带更多的数据的
- 程序中体现订单对象和订单项对象之间的关系,项目中的部分功能中有类似的需求:查询订单的同时,还要获取订单下所有的订单项
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。