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(订单)</