學習筆記-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).修改
多對多不存在修改關系的做法,就是刪除舊的,然后新增一條即達到修改的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM