接下来,通过一个订单商品数据模型来了解如何实现一对一查询、一对多查询、多对多查询。

下面介绍一下数据模型

(1)各表介绍如下。

用户表:user记录了购买商品的用户信息。

订单表:orders记录了用户所创建的订单(购买商品的订单)。

订单明细表:orderdetail记录了订单的详细信息,即购买商品的信息。

商品表:items记录了商品信息。

(2)orders和user介绍如下。

orders→user:一个订单只由一个用户创建,是一对一关系。

user→orders:一个用户可以创建多个订单,是一对多关系。

(3)orders和orderdetail介绍如下。

orders→orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail中记录,是一对多关系。

orderdetail→orders:一个订单明细只能包括在一个订单中,是一对一关系。

(4)orderdetail和items介绍如下。

orderdetail→items:一个订单明细只对应一个商品信息,是一对一关系。

items→orderdetail:一个商品可以包括在多个订单明细,是一对多关系。

(5)分析数据库级别没有关系的表之间是否有业务关系。orders和items之间可以通过orderdetail表建立关系。

项目情况截图

spring mybatis多对多关联映射_User

 

spring mybatis多对多关联映射_List_02

数据库,建表

create table w_user(
	id int not null auto_increment primary key,
	username varchar(50) not null,
	sex varchar(10) null,
	address varchar(100) null
)

insert into w_user values (null,'tom','boy','陕西省西安市');
insert into w_user values (null,'lucy','girl','陕西省西安市');

create table w_orders(
	id int not null auto_increment primary key,
	user_id int not null,
	number int not null,
	createtime datetime default now(),
	note varchar(100) null
)

insert into w_orders values (null,1,100,'2022-01-01','order1');
insert into w_orders values (null,2,100,'2022-01-01','order2');

select
o.id,
o.user_id as userId,
o.number,
o.createtime,
o.note,
u.username,
u.sex,
u.address
from w_orders o,w_user u
where o.user_id = u.id;

create table w_orderdetails(
	orderdetail_id int not null auto_increment primary key,
	item_id int not null,
	item_num int not null,
	order_id int not null
)

insert into w_orderdetails values (null,1,999,1);
insert into w_orderdetails values (null,2,888,1);
insert into w_orderdetails values (null,1,999,2);
insert into w_orderdetails values (null,2,888,2);


select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.sex,
u.address,
d.orderdetail_id,
d.item_id,
d.item_num,
d.order_id
from w_orders o,w_user u,w_orderdetails d
where o.user_id = u.id and d.order_id = o.id


create table w_items(
	id int not null auto_increment primary key,
	item_name varchar(50) not null,
	item_detail varchar(50) null,
	item_price int not null default 0
)

insert into w_items values(null,'牙刷','海牛',99);
insert into w_items values(null,'牙膏','黑人',99);
insert into w_items values(null,'洗发乳','海飞丝',99);
insert into w_items values(null,'护发素','海飞丝',99);
insert into w_items values(null,'剃须刀','飞科',99);
insert into w_items values(null,'丝袜','九妹',99);
insert into w_items values(null,'弹力裤','巴黎宝贝',99);


select
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.sex,
u.address,
d.orderdetail_id,
d.item_id,
d.item_num,
d.order_id,
i.item_name,
i.item_detail,
i.item_price
from w_orders o,w_user u,w_orderdetails d,w_items i
where o.user_id = u.id and d.order_id = o.id and d.item_id = i.id

多对多关联映射

创建pojo与User.java、Orders.java、Orderdetails.java、Items.java的关联。

映射思路:

(1)将用户信息映射到user中。

(2)在user类中添加订单列表属性private List<Orders>orderList,将用户创建的订单映射到ordersList。

(3)在Orders中添加订单明细列表属性private List<Orderdetail>orderdetails,将订单的明细映射到orderdetails。

(4)在Orderdetail中添加Items属性private Items items,将订单明细所对应的商品映射到Items。

User.java

package com.shrimpking.code06.pojo;

import java.util.List;

/**
 * @author user1
 */
public class User
{
    private int id;
    private String username;
    private String sex;
    private String address;

    private List<Orders> ordersList;


    public User()
    {
    }

    public User(int id, String username, String sex, String address)
    {
        this.id = id;
        this.username = username;
        this.sex = sex;
        this.address = address;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getUsername()
    {
        return username;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public String getSex()
    {
        return sex;
    }

    public void setSex(String sex)
    {
        this.sex = sex;
    }

    public String getAddress()
    {
        return address;
    }

    public void setAddress(String address)
    {
        this.address = address;
    }

    public List<Orders> getOrdersList()
    {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList)
    {
        this.ordersList = ordersList;
    }

    @Override
    public String toString()
    {
        return "User{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", address='" + address + '\'' + ", ordersList=" + ordersList + '}';
    }
}

Orders.java

package com.shrimpking.code06.pojo;

import java.util.Date;
import java.util.List;

/**
 * @author user1
 */
public class Orders
{
    private int id;
    private int userId;
    private int number;
    private Date createtime;
    private String note;
    private List<OrderDetails> orderDetails;

    public Orders()
    {
    }

    public Orders(int id, int userId, int number, Date createtime, String note)
    {
        this.id = id;
        this.userId = userId;
        this.number = number;
        this.createtime = createtime;
        this.note = note;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public int getUserId()
    {
        return userId;
    }

    public void setUserId(int userId)
    {
        this.userId = userId;
    }

    public int getNumber()
    {
        return number;
    }

    public void setNumber(int number)
    {
        this.number = number;
    }

    public Date getCreatetime()
    {
        return createtime;
    }

    public void setCreatetime(Date createtime)
    {
        this.createtime = createtime;
    }

    public String getNote()
    {
        return note;
    }

    public void setNote(String note)
    {
        this.note = note;
    }

    public List<OrderDetails> getOrderDetails()
    {
        return orderDetails;
    }

    public void setOrderDetails(List<OrderDetails> orderDetails)
    {
        this.orderDetails = orderDetails;
    }

    @Override
    public String toString()
    {
        return "Orders{" + "id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime + ", note='" + note + '\'' + ", orderDetails=" + orderDetails + '}';
    }
}

 OrderDetails.java

package com.shrimpking.code06.pojo;

/**
 * @author user1
 */
public class OrderDetails
{
    private int id;
    private int itemId;
    private int itemNum;
    private int orderId;
    private Items items;

    public OrderDetails()
    {
    }

    public OrderDetails(int id, int itemId, int itemNum, int orderId)
    {
        this.id = id;
        this.itemId = itemId;
        this.itemNum = itemNum;
        this.orderId = orderId;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public int getItemId()
    {
        return itemId;
    }

    public void setItemId(int itemId)
    {
        this.itemId = itemId;
    }

    public int getItemNum()
    {
        return itemNum;
    }

    public void setItemNum(int itemNum)
    {
        this.itemNum = itemNum;
    }

    public int getOrderId()
    {
        return orderId;
    }

    public void setOrderId(int orderId)
    {
        this.orderId = orderId;
    }

    public Items getItems()
    {
        return items;
    }

    public void setItems(Items items)
    {
        this.items = items;
    }

    @Override
    public String toString()
    {
        return "OrderDetails{" + "id=" + id + ", itemId=" + itemId + ", itemNum=" + itemNum + ", orderId=" + orderId + ", items=" + items + '}';
    }
}

 items.java

package com.shrimpking.code06.pojo;

/**
 * @author user1
 */
public class Items
{
    private int id;
    private String itemName;
    private String itemDetail;
    private int  itemPrice;

    public Items()
    {
    }

    public Items(int id, String itemName, String itemDetail, int itemPrice)
    {
        this.id = id;
        this.itemName = itemName;
        this.itemDetail = itemDetail;
        this.itemPrice = itemPrice;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getItemName()
    {
        return itemName;
    }

    public void setItemName(String itemName)
    {
        this.itemName = itemName;
    }

    public String getItemDetail()
    {
        return itemDetail;
    }

    public void setItemDetail(String itemDetail)
    {
        this.itemDetail = itemDetail;
    }

    public int getItemPrice()
    {
        return itemPrice;
    }

    public void setItemPrice(int itemPrice)
    {
        this.itemPrice = itemPrice;
    }

    @Override
    public String toString()
    {
        return "Items{" + "id=" + id + ", itemName='" + itemName + '\'' + ", itemDetail='" + itemDetail + '\'' + ", itemPrice=" + itemPrice + '}';
    }
}

OrderMapper.java

package com.shrimpking.code06.mapper;

import com.shrimpking.code06.pojo.User;

import java.util.List;

/**
 * @author user1
 */
public interface OrdersMapper
{
    public List<User> findUserAndItems();
}

OrderMapper.xml

<?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.shrimpking.code06.mapper.OrdersMapper">

    <resultMap id="map" type="User">
        <!-- user       -->
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <!--orders-->
        <collection property="ordersList" ofType="Orders">
            <id column="id" property="id"/>
            <result column="user_id" property="userId"/>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>
            <!-- orderDetails           -->
            <collection property="orderDetails" ofType="OrderDetails">
                <id column="orderdetail_id" property="id"/>
                <result column="item_id" property="itemId"/>
                <result column="item_num" property="itemNum"/>
                <result column="order_id" property="orderId"/>
                <!-- items               -->
                <association property="items" javaType="Items">
                    <id column="id" property="id"/>
                    <result column="item_name" property="itemName"/>
                    <result column="item_detail" property="itemDetail"/>
                    <result column="item_price" property="itemPrice"/>
                </association>
            </collection>
        </collection>
    </resultMap>


    <!--  查询  -->
    <select id="findUserAndItems" resultMap="map">
        select
        o.id,
        o.user_id,
        o.number,
        o.createtime,
        o.note,
        u.username,
        u.sex,
        u.address,
        d.orderdetail_id,
        d.item_id,
        d.item_num,
        d.order_id,
        i.item_name,
        i.item_detail,
        i.item_price
        from
        w_orders o,
        w_user u,
        w_orderdetails d,
        w_items i
        where
        o.user_id = u.id
        and d.order_id = o.id
        and d.item_id = i.id
    </select>

</mapper>

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!--  起别名  -->
    <typeAliases>
        <package name="com.shrimpking.code06.pojo"/>
    </typeAliases>

    <!--  环境  -->
    <environments default="development">
        <environment id="development">
            <!-- 默认事务管理           -->
            <transactionManager type="JDBC"/>
            <!-- 默认的数据库连接            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql123"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/shrimpking/code06/mapper/OrdersMapper.xml"/>
    </mappers>
</configuration>

编写测试类

UserTest.java

package com.shrimpking.code06;

import com.shrimpking.code06.mapper.OrdersMapper;
import com.shrimpking.code06.pojo.User;
import com.shrimpking.utils.DaoUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class UserTest
{
    @Test
    public void test() throws IOException
    {
        SqlSession sqlSession = DaoUtils.getSqlSession("code06/mybatis.xml");
        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
        List<User> userList = mapper.findUserAndItems();
        for (User user : userList)
        {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

/*
User{id=1, username='tom', sex='boy', address='陕西省西安市',
ordersList=[
Orders{id=1, userId=1, number=100, createtime=Sat Jan 01 00:00:00 CST 2022, note='order1',
orderDetails=[
OrderDetails{id=1, itemId=1, itemNum=999, orderId=1,
items=Items{id=1, itemName='牙刷', itemDetail='海牛', itemPrice=99}},
OrderDetails{id=2, itemId=2, itemNum=888, orderId=1,
items=Items{id=1, itemName='牙膏', itemDetail='黑人', itemPrice=99}}]}]}
User{id=2, username='lucy', sex='girl', address='陕西省西安市',
ordersList=[
Orders{id=2, userId=2, number=100, createtime=Sat Jan 01 00:00:00 CST 2022, note='order2',
orderDetails=[
OrderDetails{id=3, itemId=1, itemNum=999, orderId=2,
items=Items{id=2, itemName='牙刷', itemDetail='海牛', itemPrice=99}},
OrderDetails{id=4, itemId=2, itemNum=888, orderId=2,
items=Items{id=2, itemName='牙膏', itemDetail='黑人', itemPrice=99}}]}]}

 */

DaoUtils.java

package com.shrimpking.utils;

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 java.io.IOException;
import java.io.Reader;

/**
 * @author user1
 */
public class DaoUtils
{
    private static Reader reader;
    private static SqlSessionFactory sqlSessionFactory;

    public static SqlSession getSqlSession(String config) throws IOException
    {
        try
        {
            reader = Resources.getResourceAsReader(config);
            //
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            reader.close();
        }
        return sqlSessionFactory.openSession();
    }
}

运行截图

spring mybatis多对多关联映射_List_03