一对一

User表 与 IDCard表 一对一

User表

uid

name

id










User表中的id对应IDCard表中的id

IDCard表

id

num











两表关联的外键列,设置在哪一个表中都可以


需求: CRUD项目,登录时,展现User信息,以及用户的身份证信息

sql语句 变成联查

结果集取值,正常取值

封装对象

       封装User对象

              User类中还设置的有身份证类型的属性

java多表联查sql拼接 jdbc多表联查_User

封装身份证对象

       将身份证对象存储到User对象

 

java多表联查sql拼接 jdbc多表联查_封装_02

 一对多

 

User表

uid

name







Order表

oid

detail

price

date

uid
















一对多,将关联列(外键列,但是没有设置外键约束)设置在多的一方即Order表

 

需求1:

在查询出用户时,一并查出用户所有订单数据

(也就是单独一个用户所拥有的订单,查询返回的是一个user对象)

java多表联查sql拼接 jdbc多表联查_封装_03

java多表联查sql拼接 jdbc多表联查_java多表联查sql拼接_04

 

java多表联查sql拼接 jdbc多表联查_封装_05

  

java多表联查sql拼接 jdbc多表联查_sql_06

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;
}

需求二:

      查询出所有订单信息包括订单对应的用户,并保留没有用户的订单信息

java多表联查sql拼接 jdbc多表联查_封装_07

java多表联查sql拼接 jdbc多表联查_sql_08

 

保留不满足关联条件的数据首先想到外连接

在user表中设置Order对象类型的属性即可

java多表联查sql拼接 jdbc多表联查_java多表联查sql拼接_09

 设置order属性值,该查询返回一个user类型的list集合

java多表联查sql拼接 jdbc多表联查_User_10

 

总结:

需求一需要查询的是一个用户所关联的所有订单信息,查询出来的是一个用户对象,该对象里面有个List<Order>集合类型的属性,也就把查询出来的订单全部放在该集合中,如果该用户没有订单,list集合就为空,不展示订单信息

需求二需要查询的是所有订单信息和订单对应用户名,查询出来的是一个list集合,集合中存储的是一个个用户对象,每个用户对象拥有个Order类型的属性,这样一来即使部分订单没有关联用户,除自身属性为空外,order属性不会空,可以展示全部订单信息及对应用户名,没有关联用户的不显示用户名