MyBatis------4.MyBatis一对多,多对一关系的查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34082113/article/details/81950173

一.数据库表及数据

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>

猜你喜欢

转载自blog.csdn.net/qq_34082113/article/details/81950173