版权声明:本文为博主原创文章,未经博主允许不得转载。 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>