一.數據庫表及數據
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>