4.3Java EE——一对多查询

用户与订单关联关系图​​​​​​​

        与一对一的关联关系相比,接触更多的关联关系是一对多(或多对一)。例如一个用户可以有多个订单,多个订单也可以归一个用户所有。用户和订单的关联关系如图。

一、<collection>元素

        在MyBatis中,通过<collection>元素来处理一对多关联关系。<collection>元素的属性大部分与<association>元素相同,但其还包含一个特殊属性一ofType。ofType属性与javaType属性对应,它用于指定实体类对象中集合类属性所包含的元素的类型。

<collection>元素的配置方式

         <collection>元素是<resultMap>元素的子元素,<collection >元素有嵌套查询和嵌套结果两种配置方式。 

a.嵌套查询方式

<collection property="ordersList" 

column="id" 

ofType="com.mac.pojo.Orders"

select=" com.mac.mapper.OrdersMapper.selectOrders"/>

b.嵌套结果方式

<collection property="ordersList"ofType="com.mac.pojo.Orders">

    <id property="id" column="orders_id" />

    <result property="number" column="number" />

</collection>

 二、接下来以用户和订单之间的一对多关联关系为例,详细讲解如何在MyBatis中处理一对多关联关系,具体步骤如下。

1、在名为mybatis的数据库中,创建两个数据表,分别为tb_user(用户数据表)和tb_orders(订单表),同时在表中预先插入几条测试数据。

USE mybatis;

# 创建一个名称为tb_user的表

CREATE TABLE tb_user (

  id int(32) PRIMARY KEY AUTO_INCREMENT,

  username varchar(32),

  address varchar(256) );

# 插入3条数据

INSERT INTO tb_user VALUES ('1', '小明', '北京');

INSERT INTO tb_user VALUES ('2', '李华', '上海');

INSERT INTO tb_user VALUES ('3', '李刚', '上海');
# 创建一个名称为tb_orders的表
CREATE TABLE tb_orders (

  id int(32) PRIMARY KEY AUTO_INCREMENT,

  number varchar(32) NOT NULL,

  user_id int(32) NOT NULL,

  FOREIGN KEY(user_id) references tb_user(id));
#插入3条数据

INSERT INTO tb_orders VALUES ('1', '1000011', '1');

INSERT INTO tb_orders VALUES ('2', '1000012', '1');

INSERT INTO tb_orders VALUES ('3', '1000013', '2');

 

  

2、创建持久化类Orders,并在类中定义订单id和订单编号等属性。

public class Orders {

    private Integer id;     //订单id

    private String number; //订单编号

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @Override

    public String toString() {

        return "Orders [id=" + id + ", number=" + number + "]";

    }

}

3、创建持久化类Users,并在类中定义用户编号、用户姓名、 用户地址以及用户关联的订单等属性。

public class Users {

    private Integer id;                         // 用户编号

    private String username;              // 用户姓名

    private String address;                 // 用户地址

    private List<Orders> ordersList;  // 用户关联的订单

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }

    @Override

    public String toString() {

        return "User [id=" + id + ", username=" + username

                + ", address="+ address + ", ordersList=" + ordersList + "]"; }

}


4、创建用户实体映射文件UsersMapper.xml,并在文件中编写一对多关联映射查询的配置。 

<mapper namespace="com.mac.mapper.UsersMapper">

      <resultMap type="Users" id="UserWithOrdersResult">

      <!-- 只展示了部分标签内容,一对多关联映射 -->

<collection property="ordersList" ofType="Orders">

<id property="id" column="orders_id"/>

<result property="number" column="number"/>

</collection>

      </resultMap>

</mapper>

5、在核心配置文件mybatis-config.xml中,引入UsersMapper.xml,将UsersMapper.xml映射文件加载到程序中。 

<mapper resource="com/mac/mapper/UsersMapper.xml”/>

6、在测试类MyBatisTest中,编写测试方法findUserTest()。 

public void findUserTest() {

    // 1.通过工具类生成SqlSession对象

    SqlSession session = MyBatisUtils.getSession();

    // 2.查询id为1的用户信息

    Users users = session.selectOne("com.mac.mapper."

                            + "UsersMapper.findUserWithOrders", 1);

    // 3.输出查询结果信息

    System.out.println(users);

    // 4.关闭SqlSession

    session.close();

}

猜你喜欢

转载自blog.csdn.net/W_Fe5/article/details/131563918