4.2Java EE——一对一查询

<association>元素​​​​​​​ 

在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人。人与身份证之间的关联关系如图。

        在MyBatis中,通过<association>元素来处理一对一关联关系。<association>元素提供了一系列属性用于维护数据表之间的关系。

<association>元素属性

属性

说明

property

用于指定映射到的实体类对象的属性,与表字段一一对应

column

用于指定表中对应的字段

javaType

用于指定映射到实体对象的属性的类型

jdbcType

用于指定数据表中对应字段的类型

fetchType

用于指定在关联查询时是否启用延迟加载。fetchType属性有lazy和eager两个属性值,默认值为lazy

select

用于指定引入嵌套查询的子SQL语句

autoMapping

用于指定是否自动映射

typeHandler

用于指定一个类型处理器

<association>元素的配置方式

        <association>元素是<resultMap>元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果方式,下面对这两种配置方式分别进行介绍。

a.嵌套查询方式

        嵌套查询是指通过执行另外一条SQL映射语句来返回预期的复杂类型。

<association property="card" column="card_id" 

javaType="com.mac.pojo.IdCard"   
select="com.itheima.mapper.IdCardMapper.findCodeById" />

b.嵌套结果方式

        嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。

<association property="card" javaType="com.mac.pojo.IdCard">

    <id property="id" column="card_id" />

    <result property="code" column="code" />

</association>

        接下来就以个人和身份证之间的一对一关联关系为例,对MyBatis中一对一关联关系的处理进行详细讲解。案例具体实现步骤如下。

1、创建数据表:在mybatis数据库中分别创建名为tb_idcard的身份证数据表和名称为tb_person的个人数据表,同时预先插入几条数据。 

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);

 

2、持久化类IDCard类:创建持久化类IdCard,用于封装身份证属性。

public class Idcard {
    private Integer id; //主键id

    private String code; //身份证号码

    public Integer getId() {
        return id;
    }

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

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    @Override

    public String toString() {

        return "IdCard [id=" + id + ", code=" + code + "]";

    }
}

3、持久化类Person类:创建持久化类Person,用于封装个人属性。 

public class Person {
        private Integer id;             // 主键id
        private String name;         // 姓名
        private Integer age;          // 年龄
        private String sex;            // 性别
        private IdCard card;  	   // 人员关联的证件

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

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

    public Idcard getCard() {
        return card;
    }

    public void setCard(Idcard card) {
        this.card = card;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", card=" + card +
                '}';
    }
}

4、编写IdCardMapper.xml文件:创建身份证映射文件IdCardMapper.xml,并在映射文件中编写一对一关联映射查询的配置信息。 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mac.mapper.IdCardMapper">

  <!-- 根据id查询证件信息 -->

  <select id="findCodeById" parameterType="Integer" resultType="IdCard">

  SELECT * from tb_idcard where id=#{id}

  </select>

</mapper>

5、编写PersonMapper.xml文件:创建人员映射文件PersonMapper.xml,并在映射文件中编写一对一关联映射查询的配置信息。 

<select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">

SELECT * from tb_person where id=#{id} </select>

<resultMap type="Person" id="IdCardWithPersonResult">

<id property="id" column="id" />

<result property="name" column="name" />

<result property="age" column="age" />

<result property="sex" column="sex" />

<association property="card" column="card_id" javaType="IdCard”

      select="com.mac.mapper.IdCardMapper.findCodeById" />

</resultMap>

6、引入映射文件:在核心配置文件mybatis-config.xml中,引入IdCardMapper.xml和PersonMapper.xml映射文件,并为com.mac.pojo包下的所有实体类定义别名。 

<!-- 只展示了定义别名和mapping文件中配置新添加的部分-- >

<!--使用扫描包的形式定义别名 -->

<typeAliases>

<package name="com.mac.pojo" />

</typeAliases>

<mappers>

<mapper resource="com/mac/mapper/IdCardMapper.xml" />

<mapper resource="com/mac/mapper/PersonMapper.xml" />

</mappers>

7、编写测试类:在测试类MyBatisTest中,编写测试方法findPersonByIdTest()。 

public void findPersonByIdTest() {

        // 1、通过工具类获取SqlSession对象

        SqlSession session = MyBatisUtils.getSession();

        // 2.使用MyBatis嵌套查询的方式查询id为1的人的信息

        Person person = session.selectOne("com.mac.mapper." 

                                   + "PersonMapper.findPersonById", 1);

        // 3、输出查询结果信息

        System.out.println(person);

        // 4、关闭SqlSession

        session.close();

    }

多学一招:MyBatis延迟加载的配置 

        在使用MyBatis嵌套查询方式进行MyBatis关联映射查询时,使用MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。MyBatis默认没有开启延迟加载,需要在mybatis-config.xml中的<settings>元素内进行配置。

<settings>

    <!-- 打开延迟加载的开关 -->  

    <setting name="lazyLoadingEnabled" value="true" />  

    <!-- 将积极加载改为消息加载,即按需加载 -->  

    <setting name="aggressiveLazyLoading" value="false"/>  

</settings>

猜你喜欢

转载自blog.csdn.net/W_Fe5/article/details/131539820