MyBatis的关联映射

结果映射(resultMap)–主要使用这两个标签

association – 一个复杂类型的关联;许多结果将包装成这种类型
嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
collection – 一个复杂类型的集合
嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

  • 多对一:查询的多个对象中有一个属性包含一个复杂对象,使用association标签嵌套
  • 一对多:查询的单个对象中的一个属性包含多个其他对象,使用collection标签嵌套
  • javaType为实体类中属性的类型,为常用基本数据类型时可以省略
  • ofType则是用来指定到List或集合中的实体类类型,泛型中的约束类型

1.一对一查询

问题:根据用户Id查询Person的信息,包括IdCard的信息,用户和IdCard是一对一的关系

1.1 数据库准备

USE mybatis;
# 创建一个名称为tb_idcard的表
CREATE TABLE  tb_idcard( 
     id INT PRIMARY KEY AUTO_INCREMENT,
     CODE VARCHAR(18)
);
# 插入2条数据
INSERT INTO tb_idcard(CODE) VALUES('152221198711020624');
INSERT INTO tb_idcard(CODE) VALUES('152201199008150317');
# 创建一个名称为tb_person的表
CREATE TABLE  tb_person( 
     id INT PRIMARY KEY AUTO_INCREMENT,
     name VARCHAR(32),
     age INT,
     sex VARCHAR(8),
     card_id INT UNIQUE,     
     FOREIGN KEY(card_id) REFERENCES tb_idcard(id)
);
# 插入2条数据
INSERT INTO tb_person(name,age,sex,card_id) VALUES('Rose',22,'女',1);
INSERT INTO tb_person(name,age,sex,card_id) VALUES('jack',23,'男',2);

1.2 实体类

1.2.1 IdCard.java

package com.biem.pojo;

import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class IdCard {
   
    private Integer id;
    private String code;
}

1.2.2 Person.java

package com.biem.pojo;

import lombok.*;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {
   
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private IdCard card;
}

1.3 用户配置接口

1.3.1 IdCardMapper.java

package com.biem.mapper;

public interface IdCardMapper{
   
}

1.3.2 Person.java

package com.biem.mapper;

public interface PersonMapper {
   
}

1.4 用户配置文件

1.4.1 IdCardMapper.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.biem.mapper.IdCardMapper">


</mapper>

1.4.2 PersonMapper.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.biem.mapper.PersonMapper">


</mapper>

1.5 解决方法

1.5.1 嵌套查询方式

1.5.1.1 IdCardMapper.java
package com.biem.mapper;

import com.biem.pojo.IdCard;

public interface IdCardMapper {
   
    public IdCard findCodeById(Integer id);
}
1.5.1.2 PersonMapper.java
package com.biem.mapper;

import com.biem.pojo.Person;

public interface PersonMapper {
   
    public Person findPersonById(Integer id);
}

1.5.1.3 IdCardMapper.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.biem.mapper.IdCardMapper">

    <!--public IdCard findCodeById(Integer id);-->
    <select id="findCodeById" parameterType="Integer" resultType="IdCard">
        select * from tb_idcard where id=#{id}
    </select>
</mapper>
1.5.1.4 PersonMapper.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.biem.mapper.PersonMapper">
    <!-- public Person findPersonById(Integer id); -->
    <resultMap id="IdCardWithPersonResult" type="Person">
        <id property="id" column="id"></id>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <!-- 一对一:association使用select 属性引入另外一条SQL语句 -->
        <association property="card" column="card_id" javaType="IdCard"
                     select="com.biem.mapper.IdCardMapper.findCodeById"/>
    </resultMap>

    <select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">
        select * from tb_person where id = #{id}
    </select>
</mapper>
1.5.1.5 PersonTest.java
package com.biem.test;

import com.biem.mapper.PersonMapper;
import com.biem.pojo.Person;
import com.biem.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class PersonTest {
   

    @Test
    public void testFindPersonById(){
   
        SqlSession session = MyBatisUtil.openSession();
        PersonMapper mapper = session.getMapper(PersonMapper.class);
        Person person = mapper.findPersonById(1);
        System.out.println(person);
        session.close();
    }
}
1.5.1.6 测试结果
DEBUG 04-21 17:35:29,353 ==>  Preparing: select * from tb_person where id = ?  (BaseJdbcLogger.java:159) 
DEBUG 04-21 17:35:29,412 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:159) 
DEBUG 04-21 17:35:29,458 ====>  Preparing: select * from tb_idcard where id=?  (BaseJdbcLogger.java:159) 
DEBUG 04-21 17:35:29,458 ====> Parameters: 1(Integer) (BaseJdbcLogger.java:159) 
DEBUG 04-21 17:35:29,462 <====      Total: 1 (BaseJdbcLogger.java:159) 
DEBUG 04-21 17:35:29,465 <==      Total: 1 (BaseJdbcLogger.java:159) 
Person(id=1, name=Rose, age=22, sex=, card=IdCard(id=1, code=152221198711020624))

1.5.2 嵌套结果方式

1.5.2.1 PersonMapper.java 添加
public Person findPersonByIdWithNestedResults(Integer id);
1.5.2.2 PersonMapper.xml添加
<!--public Person findPersonByIdWithNestedResults(Integer id);-->
    <resultMap id="IdCardWithPersonResult2" type="Person">
        <id property="id" column="id"></id>
        <result property=<
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值