zoukankan      html  css  js  c++  java
  • 015_数据建模时,JavaBean的实体类中怎样处理外键

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

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

    1. 如果出现外键对应的字段,那么将会出现一个对象与另一个对象的属性相对应,这将不是面向对象中的对象与对象对应。
    2. 单个外键只能存储一个字符串,用处不大

    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 创建分类表
    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的实体类如下 : 

    /**
     * 订单项
     */
    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<>() ;	//	订单项集合
    	......
    }
    

      这样做的优点如下 : 

    1. 程序对象和对象产生关系,而不是对象(Order的对象)和对象的属性(User对象的uid)产生关系
    2. 设计Order的目的 : 让order携带订单上的数据向service层,dao层传递,user对象是可以携带更多的数据的
    3. 程序中体现订单对象和订单项对象之间的关系,项目中的部分功能中有类似的需求 : 查询订单的同时,还要获取订单下所有的订单项
  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/xddx/p/13382863.html
Copyright © 2011-2022 走看看