13、mybatis-关联查询-一对多

一、概念

一对多(多对一)是指一方持有多方的引用。例如:去京东购物,那么一个京东用户可以对应多个购物订单

二、实现思路

  1. 确定查询的主表: 用户表user
  2. 确定查询的关联表:订单表orders
  3. 主表与子表采用外键关联
  4. 关系模型
  5. 对象模型

三、实现方式

  1. 嵌套查询
  2. 连接查询

四、栗子

SQL

DROP TABLE IF EXISTS `user`;
CREATE TABLE user
(
    uid        INT AUTO_INCREMENT PRIMARY KEY,
    name       VARCHAR(64) UNICODE NOT NULL COMMENT '用户名',
    password   VARCHAR(128)        NOT NULL COMMENT '密码',
    phone      VARCHAR(11) UNIQUE  NOT NULL COMMENT '手机号',
    email      VARCHAR(128) UNIQUE NOT NULL COMMENT '用户邮箱',
    join_date  TIMESTAMP DEFAULT current_timestamp COMMENT '创建时间',
    login_date TIMESTAMP DEFAULT current_timestamp
        ON UPDATE current_timestamp COMMENT '最后一次登录时间',
    status     TINYINT   DEFAULT 1 COMMENT '0 表示禁用 1 表示正常'
)
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order`
(
    `order_id`      INT(11) AUTO_INCREMENT,
    `order_code`    VARCHAR(128) NOT NULL,
    `uid`           INT(11)      NOT NULL,
    `message`       VARCHAR(255) NOT NULL,
    `create_date`   DATETIME(6) DEFAULT NULL,
    `pay_date`      DATETIME(6) DEFAULT NULL,
    `status`        INT(11)      NOT NULL,
    PRIMARY KEY (`order_id`),
    CONSTRAINT `fk_order_uid` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
)

编写对象

public class User {
    private Integer uid;
    /**
     * 用户名
     */
    private String name;
    /**
     * 密码
     */
    private String password;
    /**
     * 手机号
     */
    private String phone;
    /**
     * 用户邮箱
     */
    private String email;
    /**
     * 创建时间
     */
    private Date joinDate;
    /**
     * 最后一次登录时间
     */
    private Date loginDate;
    /**
     * 0 表示禁用 1 表示正常
     */
    private int status;
    /**
     * 订单信息
     */
    private List orders;
}
public class Orders {
    /**
     * 主键订单Id
     */
    private Integer ordersId;
    /**
     * 下单用户id
     */
    private Integer userId;
    /**
     * 订单号
     */
    private String number;
    /**
     * 创建订单时间
     */
    private Date createTime;
    /**
     * 备注
     */
    private String note;

编写Mapper.java

public interface UserMapper {
/**
     * 获得所有用户的所有订单订单信息
     * @return
     */
    List getUsersOrders();
    /**
     * 根据用户id查询所有的订单信息
     * @param uid
     * @return
     */
    public User findOrdersById(@Param("uid") int uid);
     /**
     * 根据用户id查询所有的订单信息
     * @param uid
     * @return
     */
     public User findOrdersById2(@Param("uid") int uid);
}
public interface OrdersMapper {
    public List findByUserId(@Param("uid") int uid);
}

编写mapper.xml



    
    
    
    




    
        `uid`, `name`, `password`, phone, email, join_date, login_date, `status`
    
    
    
        
        
        
        
        
        
        
        
        
        
    
    
 
    
    
        
        
        
        
    
    




    
        
        
        
        
        
        
        
        
    
    
        
        order_id, order_code, `uid`, message, create_date, pay_date, `status`
    
    

测试代码

    public static void main(String[] args) {
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(
                App.class.getClassLoader().getResourceAsStream("mybatis-config.xml")
        );
        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.findOrdersById(1);
        User user1 = mapper.findOrdersById2(1);
        System.out.println(user.toString());
        System.out.println(user1);
    }

你可能感兴趣的:(13、mybatis-关联查询-一对多)