Mybatis的关联映射

本文介绍了Mybatis的关联映射,包括一对一、一对多、多对多的关系映射,并通过示例展示了如何在实体类、mapper接口和mapper文件中进行配置。详细解释了不同关联关系的使用场景和实现方式。

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

1、关联映射

2、一对多,多对一

3、多对多

关联映射
关联关系是面向对象分析、面向对象设计最终的思想,Mybatis完全可以理解这种关联关系,如果关系得当,Mybatis的关联映射将可以大大简化持久层数据的访问。关联关系大致可以分为以下情况:

1、一对一,一个人只能有一张身份证,而一张身份证只能属于一个人;

2、一对多,一个客户对应多个订单

3、多对多,一篇新闻对应多种类型,一种类型对应多篇新闻

当然,还有更复杂的关系,同样在购物系统中,一个用户可以有多个订单,而一个订单只能属于一个用户,再加上商品的关系就是一对多夹杂多对多的关系,但是万变都不离其中。

一对一
用户表(tb_user)和身份证表(tb_card)

一个用户对应一张身份证

用户表:tb_user:

身份表:tb_card:

2、创建相应的实体类对象(用user去关联card)、mapper层接口和mapper文件

实体类对象

 
public class Card {
 
	private Integer cardId;//主键id
	
	private String cardCode;//身份证号
	
	//省略相应的get/set和构造方法
}
@Data
@ToString
public class User{
	
	private Integer userId;//主键userId
	
	private String userName;//姓名
	
	private String userGender;//性别
	
	private Integer userAge;//年龄
	
	private Card card;//人和身份证是一对一的关系
	
}

mapper层接口:

@Repository
public interface CardMapper {
 
	Card getCardById(Integer cardId);
}
 
 
@Repository
public interface UserMapper {
 
	User getUserById(Integer userId);
}

mapper文件

UserMapper
 
<resultMap type="com.zepal.mybatis.domain.User" id="userMap">
  	<id column="user_id" property="userId"/>
  	<result column="user_name" property="userName"/>
  	<result column="user_gender" property="userGender"/>
  	<result column="user_age" property="userAge"/>
  	<!-- 一对一关联,select属性是通过namespace引入的card查询 -->
  	<association property="card" column="card_id"
	  	select="com.zepal.mybatis.dao.CardDao.getCardById" 
	  	javaType="com.zepal.mybatis.domain.Card">
	  	<id column="card_id" property="cardId"/>
	  	<result column="card_code" property="cardCode"/>	
	</association>
  </resultMap>
  <select id="getUserById" parameterType="int" resultMap="userMap">
  	SELECT * FROM tb_user WHERE user_id = #{userId};
  </select>
cardMapper
 
<resultMap type="com.zepal.mybatis.domain.Card" id="cardMap">
		<id column="card_id" property="cardId"/>
		<result column="card_code" property="cardCode"/>
	</resultMap>
	<select id="getCardById" parameterType="int" resultMap="cardMap">
		SELECT * FROM tb_card WHERE card_id = #{cardId};
	</select>

3、测试代码和结果

package com.zking.ssm.book.service.impl;
 
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class BaseTest {
        @Autowired
        @private UserService userservice;
    
       @Test
       public void getUserById(){
        User user = userDao.getUserById(userId);
		System.out.println(user.toString());
      }
 
}
 
User [userId=1, userName=张三, userGender=男, userAge=18, card=Card [cardId=2, cardCode=12345619900801123x]]

一对多、多对一

1、按照上举例的客户和订单的关系创建如下两张表t_customer(客户)和t_order(订单)</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值