Mybatis学习第三天,一对多,多对一,多对多查询

来源:互联网 发布:淘宝优站报名入口 编辑:程序博客网 时间:2024/05/16 06:45

警告!!!

A####

xml文件要增加起验证作用的头文件。<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

B####

对于xml文件中mapper字段中没有定的result属性,通过select生成的类中对应的属性便不会赋值。

1.一对多查询

表product中有一个外键cid关联了表category的主键id,一条category数据对应多条product数据

首先创建表对应的类,Category和Product,其中Category中一个List<Product>的集合属性,用于存储多个Product

使用数据库左连接查询语句查询

<select id="listCategory2" resultMap="categoryBean">
select c.*,p.*,c.id 'cid',p.id 'pid',c.name 'cname',p.name 'pname' from category c left join product p on c.id = p.cid;
</select>

查询出来的结果以resultMap="categoryBean"类型返回

resultMap的定义

<resultMap type="Category2" id="categoryBean">
<id column="cid" property="id"/>
<result column="cname" property="name"/>

<collection property="products" ofType="Product">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<result column="price" property="price"/>
<result column="cid" property="cid"/>
</collection>
</resultMap>


注意点:1.由于表category和表product都存在了id、name字段,所以需要取别名cid、cname、pid、pname,通过别名将从数据库取出来的数据放到对应生成的类属性中

       2.此处使用的是resultMap参数,而不是传统的resultType参数。

       3.对于select语句,一定 要定义返回的类型:eg:resultType="Product",resultMap="productBean"

2.多对一查询,多个product数据对应一条category数据

使用resultMap定义来将查询到的数据添加到product类对应的属性中,与一对多不同的是使用的是<association></association>字段完成 

<resultMap type="Product" id="productBean">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<result column="price" property="price"/>
<result column="cid" property="cid"/>


<association property="category" javaType="Category2">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
</association>
</resultMap>

<select id="listMany2OneCategory" resultMap="productBean">
select c.*,p.*,c.id 'cid',c.name 'cname',p.id 'pid',p.name 'pname' from product p left join category c on p.cid = c.id where p.id = 5;
</select>


3.多对多,即一个订单可以包含多个产品,一个产品可以存在于多个订单

类:Order类,OrderItem,Product,OrderItem作为关联Order和Product的桥接类.

Order:

public class Order {
private Integer id;
private String code;

private List<OrderItem> orderItems;

}

OrderItem:

public class OrderItem {
private Integer id;
private Integer number;
private Order order;
private Product product;

}

Product:

public class Product {
private Integer id;
private String name;
private Float price;
private Integer cid;
private Category2 category;

}

原创粉丝点击