学习笔记-Mybatis(三)--XML方式的一对多,多对一,多对多关系

1.一对多:(分类–产品)
1、数据库建表,填数据。
这里写图片描述
2、新建一个普通的一个pojo Product实体类

public class Product {
    private int id;
    private String name;
    private float price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "Product [id=" + id + ",name=" + name + ",price=" + price;
    }
}

3.修改Category实体类

在Category类中增加:
List<Product> products;

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

4.修改Category.xml
通过left join关联查询,对Category和Product表进行关联查询。
与前面学习的有所区别,这里不是用的resultType, 而是resultMap,通过resultMap把数据取出来放在对应的 对象属性里
注: Category的id 字段 和Product的id字段同名,Mybatis不知道谁是谁的,所以需要通过取别名cid,pid来区分。
name字段同理。

<mapper namespace="com.bean">
<resultMap type="Category" id="categoryBean"> <id column="cid" property="id" 
        /> <result column="cname" property="name" />
    <!-- 一对多关系 -->
    <!-- property:指集合属性的值,ofType:指集合中元素的类型 -->
<collection property="products" ofType="Product"> 
<id column="pid" property="id" />
         <result column="pname" property="name" />
         <result column="price" property="price" />
         </collection>
         </resultMap>
    <!-- left join关联查询 产品分类和产品表 -->
<select id="listCategory" 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>
</mapper>

5、测试

// 一对多关系
    public static void listCategory(SqlSession session) {
        List<Category> cs = session.selectList("listCategory");
        for (Category category : cs) {
            System.out.println(category);
            List<Product> ps = category.getProducts();
            for (Product product : ps) {
                System.out.println("/t" + product);
            }
        }

    }

2.多对一关系(产品–>分类)
1.修改实体类为Product增加category属性

private Category category;
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }

2.新建Product.xml
提供Product.xml,通过listProduct配置关联查询的sql语句。
然后通过resultMap ,进行字段和属性的对应。
使用association(关联) 进行多对一关系关联,指定表字段名称与对象属性名称的一一对应关系
注: Category的id 字段 和Product的id字段同名,Mybatis不知道谁是谁的,所以需要通过取别名cid,pid来区分。
name字段同理。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
    <resultMap type="Product" id="productBean">
        <id column="pid" property="id" />
        <result column="pname" property="name" />
        <result column="price" property="price" />

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

    </resultMap>

    <select id="listProduct" resultMap="productBean">
        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>

</mapper>

3.在mybatis-config.xml中增加对于Product.xml的映射

<mapper resource="com/bean/Product.xml" />

4.测试

// 多对一关系
    public static void listProduct(SqlSession session) {
        List<Product> ps = session.selectList("listProduct");
        for (Product product : ps) {
            System.out.println(product + "\t对应的分类是\t" + product.getCategory());
        }
    }

3.多对多关系
以订单Order和产品Product为例:
一张订单里可以包含多种产品
一种产品 可以出现在多张订单
这就是多对多关系,为了维系多对多关系,必须要一个中间表。 在这里我们使用订单项(OrderItem)表来作为中间表。

  1. 查询多对多关系
  2. 建立多对多关系
  3. 删除多对多关系

1.数据库建表填充数据。
这里写图片描述新建order_表,同理新建order_item_表
填充数据:
这里写图片描述

2.新建实体类Order和OrderItem
自动生成getset方法。

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

    List<OrderItem> orderItems;
}
public class OrderItem {
    private int id;
    private int number;
    private Order order;
    private Product product;
}

3.配置映射文件Product、Order、OrderItem。
Product.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
    <resultMap type="Product" id="productBean">
        <id column="pid" property="id" />
        <result column="pname" property="name" />
        <result column="price" property="price" />
        <!-- 多对一的关系 -->
        <!-- property: 指的是属性名称, javaType:指的是属性的类型 -->
        <association property="category" javaType="Category">
            <id column="cid" property="id" />
            <result column="cname" property="name" />
        </association>

    </resultMap>

    <select id="listProduct" resultMap="productBean">
        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>
    <select id="getProduct" resultMap="productBean">
        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
        where p.id = #{id}
    </select>

</mapper>

Order.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
    <resultMap type="Order" id="orderBean">
        <id column="oid" property="id" />
        <result column="code" property="code" />
        <collection property="orderItems" ofType="orderItem">
            <id column=" oiid" property="id" />
            <result column="number" property="number" />
            <association property="product" javaType="Product">
                <id column="pid" property="id" />
                <result column="pname" property="name" />
                <result column="price" property="price" />
            </association>
        </collection>

    </resultMap>

    <select id="listOrder" resultMap="orderBean">
        select o.*,p.*,oi.*, o.id
        'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
        from order_ o
        left join
        order_item_ oi on o.id =oi.oid
        left join product_ p on p.id = oi.pid
    </select>
    <select id="getOrder" resultMap="orderBean">
        select o.*,p.*,oi.*, o.id 'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
        from order_ o
        left join order_item_ oi on o.id =oi.oid
        left join product_ p on p.id = oi.pid
        where o.id = #{id}
    </select>

</mapper>

OrderItem.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bean">
    <insert id="addOrderItem" parameterType="OrderItem">
        insert into order_item_
        values(null,#{order.id},#{product.id},#{number})
    </insert>
    <insert id="deleteOrderItem" parameterType="OrderItem">
        delete from order_item_
        where oid = #{order.id} and pid = #{product.id}
    </insert>
</mapper>

修改mybatis-config.xml
增加映射文件

<mapper resource="com/bean/Order.xml" />
<mapper resource="com/bean/OrderItem.xml" />

4.建立关系
(1).查询

Test

    private static void listOrder(SqlSession session) {
        List<Order> orders = session.selectList("listOrder");
        for (Order order : orders) {
            System.out.println(order.getCode());
            List<OrderItem> oItems = order.getOrderItems();
            for (OrderItem orderItem : oItems) {
                System.out.format("\t%s\t%f\t%d%n", orderItem.getProduct().getName(), orderItem.getProduct().getPrice(),
                        orderItem.getNumber());
            }
        }
    }

(2).增加关系

// 建立关系(插入数据)
    // 首先通过id分别获取Order和Product对象,接着就新建一个OrderItem对象,set order和product
    // 还有数量,最后用"addOrderItem"对应的sql语句插入.
    private static void addOrderItem(SqlSession session) {
        Order order = session.selectOne("getOrder", 1);
        Product product = session.selectOne("getProduct", 2);
        OrderItem orderItem = new OrderItem();
        orderItem.setProduct(product);
        orderItem.setOrder(order);
        orderItem.setNumber(200);
        session.insert("addOrderItem", orderItem);
    }

(3).删除关系

// 删除关系(就是删掉OrderItem记录)
    // 同上通过对应的Order和Product的id进行删除
    private static void deleteOrderItem(SqlSession session) {
        Order order = session.selectOne("getOrder", 1);
        Product product = session.selectOne("getProduct", 2);
        OrderItem orderItem = new OrderItem();
        orderItem.setProduct(product);
        orderItem.setOrder(order);
        session.delete("deleteOrderItem", orderItem);

    }

(4).修改
多对多不存在修改关系的做法,就是删除旧的,然后新增一条即达到修改的效果。

posted @ 2018-03-03 20:56  小沐酱  阅读(2617)  评论(0编辑  收藏  举报