一对一
User表 与 IDCard表 一对一
User表
uid | name | id |
User表中的id对应IDCard表中的id
IDCard表
id | num | |
两表关联的外键列,设置在哪一个表中都可以
需求: CRUD项目,登录时,展现User信息,以及用户的身份证信息
sql语句 变成联查
结果集取值,正常取值
封装对象
封装User对象
User类中还设置的有身份证类型的属性
封装身份证对象
将身份证对象存储到User对象
一对多
User表
uid | name |
Order表
oid | detail | price | date | uid |
一对多,将关联列(外键列,但是没有设置外键约束)设置在多的一方即Order表
需求1:
在查询出用户时,一并查出用户所有订单数据
(也就是单独一个用户所拥有的订单,查询返回的是一个user对象)
public User findOrderListByUid(int id) {
Connection conn = DBUtil.getConnection( );
PreparedStatement ps = null;
ResultSet rs = null;
User user = null;
// 3.1 查询出User对象
String sql = "select * from user where id = ?";
try {
ps = conn.prepareStatement(sql);
// 设置参数
ps.setInt(1, id);
rs = ps.executeQuery( );
while (rs.next( )) {
// 封装对象
user = new User( );
user.setId(id);
user.setPassword(rs.getString("password"));
user.setUsername(rs.getString("username"));
user.setBirthday(rs.getDate("birthday"));
user.setAddress(rs.getString("address"));
user.setPhone(rs.getString("phone"));
}
// 3.2 查询出所有订单数据
ArrayList<Order> orders = new ArrayList<>( );
String sql2 = "select * from `order` where uid = ?";
ps = conn.prepareStatement(sql2);
// 设置参数
ps.setInt(1, id);
rs = ps.executeQuery( );
while (rs.next( )) {
// 封装订单对象
Order order = new Order( );
order.setOid(rs.getInt("oid"));
order.setDetail(rs.getString("detail"));
order.setPrice(rs.getDouble("price"));
order.setDate(rs.getDate("date"));
// 添加集合
orders.add(order);
}
// 将order集合添加到user对象
user.setOrderList(orders);
} catch (SQLException e) {
e.printStackTrace( );
} finally {
DBUtil.close(rs, ps, conn);
}
return user;
}
需求二:
查询出所有订单信息包括订单对应的用户,并保留没有用户的订单信息
保留不满足关联条件的数据首先想到外连接
在user表中设置Order对象类型的属性即可
设置order属性值,该查询返回一个user类型的list集合
总结:
需求一需要查询的是一个用户所关联的所有订单信息,查询出来的是一个用户对象,该对象里面有个List<Order>集合类型的属性,也就把查询出来的订单全部放在该集合中,如果该用户没有订单,list集合就为空,不展示订单信息
需求二需要查询的是所有订单信息和订单对应用户名,查询出来的是一个list集合,集合中存储的是一个个用户对象,每个用户对象拥有个Order类型的属性,这样一来即使部分订单没有关联用户,除自身属性为空外,order属性不会空,可以展示全部订单信息及对应用户名,没有关联用户的不显示用户名