MyBatis一對多的左連線查詢、分步查詢以及插入和刪除操作
阿新 • • 發佈:2018-12-29
例如有兩張表,分別是客戶表和訂單表,一個客戶有多個訂單,一個訂單屬於一個客戶。
兩個實體類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>
插入時也分別插入兩個表的資訊 然後建立中間表的對應關係
刪除時也應該先打破中間表的關係 然後再分別刪除