1. 程式人生 > >MyBatis一對多的左連線查詢、分步查詢以及插入和刪除操作

MyBatis一對多的左連線查詢、分步查詢以及插入和刪除操作

例如有兩張表,分別是客戶表和訂單表,一個客戶有多個訂單,一個訂單屬於一個客戶。

兩個實體類Customer   Order 如下:

package com.itlike.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

@[email protected]@ToString
public class Customer {
    private Integer cust_id;
    private String cust_name;
    private String cust_profession;
    private String cust_phone;
    private String email;
    private List<Order> orders = new ArrayList<>();
}
package com.itlike.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@[email protected]@ToString
public class Order {
    private Integer order_id;
    private String order_name;
    private String order_num;
    private Customer customer;
}

 資料庫中的表如下:

1.一對多的左連線查詢

在CustomerMapper介面中定義方法

//查詢所有的客戶
    public List<Customer> getAllCustomers();

在CustomerMapper.xml中注入SQL

collection中的  javatype 表示  orders是一個list集合    oftype表示list集合中裝的都是Order型別

<select id="getAllCustomers" resultMap="custMap">
        SELECT * from `customer` as c LEFT JOIN `order` as o ON c.cust_id=o.cust_id;
    </select>

    <resultMap id="custMap" type="Customer">
        <id column="cust_id" property="cust_id"/>
        <result column="cust_name" property="cust_name"/>
        <result column="cust_profession" property="cust_profession"/>
        <result column="cust_phone" property="cust_phone"/>
        <result column="email" property="email"/>

      <collection property="orders" javaType="list" ofType="Order">
          <id column="order_id" property="order_id"/>
          <result column="order_num" property="order_num"/>
          <result column="order_name" property="order_name"/>
      </collection>

    </resultMap>

2.一對多的分步查詢

CustmoerMapper.xml中的SQL注入

<!--分步查詢-->
    <select id="getAllCustomers" resultMap="custMap">
        select * from `customer`;
    </select>

    <resultMap id="custMap" type="Customer">
        <id column="cust_id" property="cust_id"/>
        <result column="cust_name" property="cust_name"/>
        <result column="cust_profession" property="cust_profession"/>
        <result column="cust_phone" property="cust_phone"/>
        <result column="email" property="email"/>

        <collection property="orders"  javaType="list" ofType="Order"
                    select="com.itlike.mapper.OrderMapper.getOrderWithCustId" column="cust_id">

        </collection>

    </resultMap>

OrderMapper.xml中的SQL注入

  <select id="getOrderWithCustId" resultType="com.itlike.domain.Order">
        select * from `order` where cust_id=#{id};
    </select>

3.一對多的插入操作

在CustomerMapper介面中定義方法

//新增客戶
    public void insertCustomer(Customer customer);

在CustomerMapper.xml中注入插入客戶資訊的SQL    先插入客戶資訊

 <!--插入客戶,並獲得生成的主鍵-->
    <insert id="insertCustomer" parameterType="Customer"
            useGeneratedKeys="true"
            keyColumn="cust_id"
            keyProperty="cust_id"
    >
        insert into `customer`(cust_name,cust_profession,cust_phone,email)
         values (#{cust_name},#{cust_profession},#{cust_phone},#{email})
    </insert>

在OrderMapper.xml中注入插入訂單資訊的SQL    再插入訂單資訊

  <insert id="insertOrder" parameterType="Order"
            useGeneratedKeys="true"
            keyColumn="order_id"
            keyProperty="order_id"
    >
        insert into `order` (order_name,order_num,cust_id )
        values (#{order_name},#{order_num},#{customer.cust_id})
    </insert>

最後還要在order表中寫入外來鍵   即對應的客戶編號   更新客戶和訂單的關係

在OrderMapper.xml中注入插入更新關係的SQL

 <update id="updateCustId">
        update `order` set cust_id = ${custId} where order_id = ${orderId}
    </update>

測試類程式碼:

 public void test6(){
        SqlSession sqlSession = MyBatisUtils.openSession();
        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        Customer customer = new Customer();
        customer.setCust_name("新客戶");

        Order order1 = new Order();
        order1.setOrder_name("訂單1");

        Order order2 = new Order();
        order2.setOrder_name("訂單2");

        customer.getOrders().add(order1);
        customer.getOrders().add(order2);

        //儲存資料
        customerMapper.insertCustomer(customer);
        orderMapper.insertOrder(order1);
        orderMapper.insertOrder(order2);


        //更新關係
        for (Order order : customer.getOrders()) {
            orderMapper.updateCustId(order.getOrder_id(),customer.getCust_id());
        }

        sqlSession.commit();
        sqlSession.close();
    }

4.一對多的刪除操作

必須先得打破外來鍵的關係     然後再分別刪除客戶表和訂單表中的資訊

(1)在訂單表Order中打破外來鍵

OrderMapper介面中定義方法

//打破外來鍵關係
    public void updateRelationCustomer(Integer custId);

OrderMapper.xml中的SQL

<update id="updateRelationCustomer">
        update `order` set cust_id =null where cust_id=#{custId}
</update>

測試類程式碼:

public void test7(){
        SqlSession sqlSession = MyBatisUtils.openSession();
        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
        //一對多刪除之前   要先打破外來鍵關係
        orderMapper.updateRelationCustomer(18);
        customerMapper.deleteCustomer(18);
        sqlSession.commit();
        sqlSession.close();
    }

在多對多的關係中,處理方法和一對多相似

查詢時可以左連線查詢    也可以分步查詢          

 (重點是查詢時SQL的寫法               左連線查詢時                表一左連線中間表左連線表二 )

<select id="getAllTeacher" resultMap="teacherMap">
      SELECT * from `teacher` as t LEFT JOIN `stu_teacher_rel` as str ON t.teacher_id= str.teacher_id
      LEFT JOIN student as s ON str.stu_id = s.stu_id;
</select>

插入時也分別插入兩個表的資訊    然後建立中間表的對應關係  

刪除時也應該先打破中間表的關係   然後再分別刪除