MyBatis-高级映射:一对多

本文将详细探讨MyBatis中的一对多映射关系,通过实例解析如何使用原生SQL语句进行配置,帮助读者深入理解MyBatis一对多映射的工作原理和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库表,请参照  MyBatis-高级映射之一对一
这里展示的一对多的例子:
1对1:从order表中查询对应的User信息 在配置文件中使用 association
1对多:从order表中查询对应orderdetail内容 在配置文件中使用collection
1.原生sql语句:
mysql> select `order`.*, user.username, orderdetail.id, orderdetail.item_num fro
m `order`, user, orderdetail where (`order`.user_id=user.id) and (`order`.id = o
rderdetail.order_id);
+----+---------+--------+---------------------+----------+----+----------+
| id | user_id | number | createtime          | username | id | item_num |
+----+---------+--------+---------------------+----------+----+----------+
|  1 |       1 | 3      | 2016-06-19 11:29:30 | high     |  1 |        4 |
|  1 |       1 | 3      | 2016-06-19 11:29:30 | high     |  2 |        3 |
|  1 |       1 | 3      | 2016-06-19 11:29:30 | high     |  3 |        1 |
|  2 |       1 | 2      | 2016-06-18 12:23:20 | high     |  4 |        1 |
|  2 |       1 | 2      | 2016-06-18 12:23:20 | high     |  5 |        1 |
|  3 |       2 | 2      | 2016-05-12 12:22:20 | lily     |  6 |        4 |
|  3 |       2 | 2      | 2016-05-12 12:22:20 | lily     |  7 |       10 |
+----+---------+--------+---------------------+----------+----+----------+

2.OrderUserOrderDetailMapper.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="mapper.OrderUserOrderDetailMapper"> 
	<resultMap id="orderUserOrderDetailMap" type="pojo.OrderUserOrderDetail">
		<id column="id" property="id"/>
		<result column="user_id" property="user_id"/>
		<result column="number" property="number"/>
		<result column="createtime" property="createtime"/>
		
		<!-- Order外键user_id关联的用户信息 -->
		<association property="user" javaType="pojo.User">
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
			<result column="birthday" property="birthday"/> 
		</association>
		
		<!-- Order对应的多个OrderDetail信息映射到集合中,注意这里的类型用的是ofType -->
		<collection property="orderDetail" ofType="pojo.OrderDetail">
			<id column="detail_id" property="id"/>
			<result column="order_id" property="order_id"/>
			<result column="item_id" property="item_id"/> 
			<result column="item_num" property="item_num"/> 
		</collection>
	</resultMap> 
	
	<select id="selectOrderUserOrderDetailByResultMap" resultMap="orderUserOrderDetailMap">
		select `order`.*, user.username, orderdetail.id as detail_id, orderdetail.item_num 
		from `order`, user, orderdetail 
		where (`order`.user_id=user.id) and (`order`.id = orderdetail.order_id);
	</select>
</mapper>  

3.OrderUserOrderDetailMapper接口
package mapper;
import java.util.List;

import pojo.OrderUserOrderDetail;

public interface OrderUserOrderDetailMapper {
	List<OrderUserOrderDetail> selectOrderUserOrderDetailByResultMap() throws Exception;
}
4.测试代码
package test;

import java.io.InputStream;
import java.util.List;

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 mapper.OrderUserOrderDetailMapper;
import pojo.OrderUserOrderDetail;

public class UserOrderTest {
	public static void main(String[] args) throws Exception{
		InputStream is = Resources.getResourceAsStream("sqlMapConfig.xml");
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = sessionFactory.openSession(true);
		OrderUserOrderDetailMapper orderUserOrderDetailMapper = session.getMapper(OrderUserOrderDetailMapper.class);
		
		List<OrderUserOrderDetail> list = orderUserOrderDetailMapper.selectOrderUserOrderDetailByResultMap();
		System.out.println(list);
	}
}

<完>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值