2023.0309 星期四
- 整理数据表关系的最佳实践
数据库表的关系:
基本上在开发时,我们大部分时间处理的关系都是 多对一。
在数据库中维护关系只需要依靠 外键 字段。
商品表(goods_no5)与 类型表(type_no5)之间的关系依赖 goods_type_id。
在 Java 中的关系可以双向映射:
两个类是可以分别描述关系的。
商品信息表:
//Goods_no5
public class Goods {
// GOODS_ID NUMBER(7,0)
private Integer goodsId;
// GOODS_NAME VARCHAR2(200 BYTE)
private String goodsName;
// GOODS_PRICE NUMBER(7,2)
private Double goodsPrice;
// GOODS_DESC VARCHAR2(2000 BYTE)
private String goodsDesc;
// GOODS_TYPE_ID NUMBER(7,0)
private Types goodsType;//商品属于哪一个类型。多对一
}
商品类型表:
//type_no5表
public class Types {
// TYPE_ID NUMBER(7,0)
private Integer typeId;
// TYPE_NAME VARCHAR2(20 BYTE)
private String typeName;
// TYPE_PID NUMBER(7,0)
private Integer typePid;
// TYPE_LEVEL NUMBER(7,0)
private Integer typeLevel;
// TYPE_PATH VARCHAR2(2000 BYTE)
private String typePath;
// 一个类型下的多个商品,一对多关系。
private List<Goods> goodsList;
}
最佳实践:
- 当多对一时,可以直接使用多表连接查询。
因为多对一时,本身的每一条记录,只能连接出一条记录。
在记录数量上不会发生改变的。
此处:一个商品对应一种类型,而一种类型对应多个商品。
String sql = "select * from goods_no5 " +
" left join type_no5 on goods_type_id = type_id ";
- 当一对多时,目前我们不能使用多表连接查询。
因为一对多时,本身的每一条记录,有可能连接出多条记录。
在记录数量上会发生改变的。
所以我们需要编写两个 DAO层 的方法。
查询商品类型,以及商品类型下的所有商品:
select * from type_no5 where type_id = 2 ;
select * from goods_no5 where goods_type_id = 2;
然后,在 Service 层完成两个关系的维护。
编写 TypeDAO 类:
按类型编号查询类型对象的方法:
public class TypeDAO {
public Types selectById(Integer typeId) throws SQLException {
String sql = "select * from type_no5 where type_id = ? ";
Connection conn = ConnUtils.getConn();
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setInt(1,typeId);
ResultSet rs = pstat.executeQuery();
if(rs.next()){
Types type = new Types();
type.setTypeId(rs.getInt("TYPE_ID"));
type.setTypeName(rs.getString("TYPE_NAME"));
type.setTypePid(rs.getInt("TYPE_PID"));
type.setTypeLevel(rs.getInt("TYPE_LEVEL"));
type.setTypePath(rs.getString("TYPE_PATH"));
return type;
}else{
return null;
}
}
}
编写 GoodsDAO 类:
按类型编号查询商品集合的方法:
public List<Goods> selectByType(Integer typeId) throws SQLException {
List<Goods> goodsList = new ArrayList<>();
String sql = "select * from goods_no5 " +
" left join type_no5 on goods_type_id = type_id " +
" where goods_type_id = ?";
Connection conn = ConnUtils.getConn();
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setInt(1,typeId);
ResultSet rs = pstat.executeQuery();
while(rs.next())