MyBatis------4.MyBatis一對多,多對一關係的查詢

一.數據庫表及數據

1.各表的關係如下

2.user表

3.product表(商品表)

4.orders表(訂單表)

5.orderitem(訂單詳情表)

 

二.項目的搭建

1.新建maven工程


2.導入相應的<dependency>依賴
3.建立4個pojo類與4個表相對應
4.建立UserDao接口,定義查詢方法

package com.bd.dao;

import com.bd.domain.Orders;
import com.bd.domain.Product;
import com.bd.domain.User;

public interface UserDao {
	//單表查詢
	Product getProductById(String id);
	Orders getOrderById(String id);
	
	//多表查詢
	User getUserAndOrder(String id);
	User getUserAndAllOrder();
	Orders getOrdersByOrdersId(String id);
	Orders getOrders_Tree(String id);
	Orders getOrders_Four(String id);
	
}

5.mybatis的配置(mapper.xml,mybatis-config.xml,db.properties)

在mapper.xml中實現接口,接下來的代碼會詳細說明

6.編寫測試類TestShopping.java

package com.bd.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.bd.dao.UserDao;
import com.bd.domain.Orders;
import com.bd.domain.Product;
import com.bd.domain.User;

import junit.framework.TestCase;

public class TestShopping extends TestCase {

	UserDao userDao;
	SqlSession session;
	{
		String resource = "mybatis-config.xml";
		InputStream inputStream;
		try {
			inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			session = sqlSessionFactory.openSession();
			userDao=session.getMapper(UserDao.class);
		} catch (IOException e) {
			e.printStackTrace();
		}
 
	}

	//通過id獲取商品信息
	public void testGetProductByid() {
		Product product=userDao.getProductById("1");
		System.out.println(product);
	}
	
	//通過id獲取訂單信息
	public void testGetOrderById() {
		Orders orders=userDao.getOrderById("120d014993dc4525871adaef257dee1d");
		System.out.println(orders);
	}
	
	//通過id獲取用戶和相應訂單信息
	public void testGetUserAndOrderById() {
		User user=userDao.getUserAndOrder("120d014993dc4525871adaef257dee1d");
		System.out.println(user);
	}
	
	//通過id獲取用戶和其所有訂單信息
	public void testGetUserAndAllOrderById() {
		User user=userDao.getUserAndAllOrder();
		System.out.println(user);
	}
	
	// 通過訂單號查詢相應的user和order信息 
	public void testGetOrdersByUserId() {
		Orders orders = userDao.getOrdersByOrdersId("120d014993dc4525871adaef257dee1d");
		System.out.println(orders);
	}
	
	//三表查詢
	public void testGetOrders_Tree() {
		Orders orders = userDao.getOrders_Tree("74295730485f496dba12f61bc4e35730");
		System.out.println(orders);
	}
	
	//四表查詢
	public void testgetOrders_Four() {
		Orders orders = userDao.getOrders_Four("74295730485f496dba12f61bc4e35730");
		System.out.println(orders);
	}
	
}

 

接下來進入核心內容

三.一對多,多對一關係的查詢

<?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.bd.dao.UserDao">

	<!-- 1.通過Id獲取訂單信息 -->
	<select id="getOrderById" resultType="com.bd.domain.Orders">
		select * from orders where
		id=#{id}
	</select>

	<!-- 2.通過resultMap獲取product信息 -->
	<select id="getProductById" resultMap="productById">
		select * from product
		where id=#{id}
	</select>
	<resultMap type="com.bd.domain.Product" id="productById">
		<result column="pro_name" property="name" />
	</resultMap>


	<!-- 3.一對多關係的查詢(產生一對一結果) -->
	<!--通過訂單id查詢相應order和user信息 -->
	<!-- 此種寫法不適合多表連接查詢,因爲連接的order爲空
	<select id="getUserAndOrder" resultType="com.bd.domain.User"> 
		select  * from user u 
		join orders o on u.id=o.user_id 
		where o.id=#{id} 
	</select> -->
	<select id="getUserAndOrder" resultMap="UserAndOrder">
		select * from user u
		join orders o on u.id=o.user_id
		where o.id=#{id}
	</select>
	<resultMap type="com.bd.domain.User" id="UserAndOrder" autoMapping="true">
		<!-- javaType是property的類型,此處不可省略 -->
		<association property="orders" javaType="com.bd.domain.Orders" autoMapping="true">
		</association>
	</resultMap>

	<!-- 4.一對多關係的查詢(產生一對多結果) -->
	<!-- 通過用戶id查詢相應user和order的信息 -->
	<select id="getUserAndAllOrder" resultMap="UserAndAllOrder">
		select * from user u
		join orders o on u.id=o.user_id
	</select>
	<resultMap type="com.bd.domain.User" id="UserAndAllOrder" autoMapping="true">
		<!-- javaType是property的類型,此處可以省略 -->
		<!-- ofType爲集合中的元素類型 -->
		<collection property="list" javaType="List" ofType="com.bd.domain.Orders" autoMapping="true">
		</collection>
	</resultMap>
	
	<!-- 5.多對一的查詢(產生一對一結果) -->
	<!-- 通過訂單號查詢相應的user和order信息 -->
	<select id="getOrdersByOrdersId" resultMap="OrdersByOrdersId">
		select  o.id as oid ,o.createtime,o.paystate,o.receiverinfo,o.totalprice,o.user_id,
			 	u.active,u.nickname,u.`password`,u.role,u.tel 
				from orders o
				join user u on u.id=o.user_id
				where o.id=#{id}
	</select>
	<resultMap type="com.bd.domain.Orders" id="OrdersByOrdersId" autoMapping="true">
		<!-- id的使用一定要注意!!!下面的三表和四表查詢體現的非常明顯 -->
		<id column="oid" property="id"/>
		<association property="user" javaType="com.bd.domain.User" autoMapping="true">
		</association>
	</resultMap>
	
	<!-- 附加:下面的三表和四表查詢,好好體會 -->
	<!-- 6.三表查詢 -->
	<!-- 根據訂單id 查詢相應的order,user,orderlist的信息 -->
	<select id="getOrders_Tree" resultMap="Orders_Tree">
		SELECT o.id as oid,o.createtime,o.paystate,o.receiverinfo,o.totalprice,
			 u.id as uid,u.active,u.nickname,u.`password`,u.role,u.tel,
			 i.order_id as io,i.product_id as ip,i.buynum
		from orders o
		left JOIN `user` u on o.user_id=u.id
		left JOIN orderitem i on i.order_id=o.id
		where o.id=#{id}
	</select>
	<resultMap type="com.bd.domain.Orders" id="Orders_Tree" autoMapping="true">
		<id column="oid" property="id" />
		<association property="user" javaType="com.bd.domain.User" autoMapping="true">
			<id column="uid" property="id"/>
		</association>
		<collection property="orderitem" ofType="com.bd.domain.Orderitem" autoMapping="true">
			<id column="io" property="order_id"/>
			<id column="ip" property="product_id"/>
		</collection>
	</resultMap>
	
	
	<!-- 7.四表查詢 -->
	<select id="getOrders_Four" resultMap="Orders_Four">
		SELECT o.id as oid,o.createtime,o.paystate,o.receiverinfo,o.totalprice,
			 u.id as uid,u.active,u.nickname,u.`password`,u.role,u.tel,
			 i.order_id as io,i.product_id as ip,i.buynum,
			 p.id as pid,p.category,p.description,p.imgurl,p.marketprice,p.pnum,p.pro_name
		from orders o
		left JOIN `user` u on o.user_id=u.id
		left JOIN orderitem i on i.order_id=o.id
		LEFT JOIN product p on i.product_id=p.id
		where o.id=#{id}
	</select>
	<!-- Order表及其主鍵的對應關係 -->
	<resultMap type="com.bd.domain.Orders" id="Orders_Four">
		<id column="oid" property="id" />
		
		<!-- User表及其主鍵的對應關係 -->
		<association property="user" javaType="com.bd.domain.User" autoMapping="true">
			<id column="uid" property="id"/>
		</association>
		
		<!-- Orderlist表及其主鍵的對應關係 -->
		<collection property="orderitem" ofType="com.bd.domain.Orderitem" autoMapping="true">
			<id column="io" property="order_id"/>
			<id column="ip" property="product_id"/>
			
			<!-- Product表 -->
			<association property="product" javaType="com.bd.domain.Product" autoMapping="true">	
			</association>
		</collection>
	</resultMap>
	
</mapper>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章