您的位置:首页 > 其它

05. mybatis 映射:一对一

2016-02-08 12:00 232 查看
一、一对一简介

mybatis 的一对一映射关系,主要体现在结果集映射上,体现在<resultMap>标签中。 我们知道 Jdbc在进行连表查询的时候,返回的结果是一个二维数组结构,通常情况下,我们拿到这个二维数组后,需要进行数据类型转换,对象封装等过程,强大的<resultMap> 标签会自动替我们做好这一切繁琐地工作。

mybatis 的一对一映射和Hibernate 等ORM 类型框架的一对一映射略有不同, Hibernate 需要在Java PO 上标明映射关系, 作用域为类, 而mybatis 的实体直接不需要任何配置和指定,仅仅是在结果集上体现,这样就不仅可以应用在PO 上,还可以用在VO 上, 所以mybatis 比Hibernate的 映射更加灵活 。

二、测试

1. 映射文件

passengerMapper.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="org.zgf.learn.mybatis.entity.PassengerMapper">

    <!-- one2one: 级联查询
    注意:在进行表连接查询的时候,在使用* 号的时候有可能会结果集中字段重复,如出现两个id 列,此时,需要对至少一个id列进行命名处理-->
    <select id="getPassengerById" parameterType="int" resultMap="_passenger">
        select *, c.id as cid
        from mybatis_one2one_psg p, mybatis_one2one_psgcard c
        where p.id = #{id} and p.psgcardid = c.id
    </select>
    
    <!--  使用连接查询 -->
    <resultMap type="Passenger" id="_passenger">
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="age" column="age" javaType="Integer"/>
        <association property="passengerCard" javaType="PassengerCard"  >
            <id property="id" column="cid" javaType="Integer"/><!-- 由于查询语句中对 c.id 进行了重命名处理,所以此处需要用cid -->
            <result property="cardNo" column="cardNo" javaType="String" />
        </association>
    </resultMap>
    
    
    <!-- one2one: 两次查询 -->
    <select id="getPsgById" parameterType="int" resultMap="_psg">
        select *  from mybatis_one2one_psg where id = #{id}
    </select>
    
    <resultMap type="Passenger" id="_psg">
        <id property="id" column="id" javaType="Integer"/>
        <result property="name" column="name" javaType="String"/>
        <result property="age" column="age" javaType="Integer"/>
        <association property="passengerCard" javaType="PassengerCard" column="psgcardid" select="org.zgf.learn.mybatis.entity.PassengerCardMapper.getPassengerCardById"/>
        <!--
            property: 指明哪个属性为执行的一方
            javaType: java 类型
            select: 第二次查询执行的方法
            column: 第二次查询的入参,也是外键
         -->
    </resultMap>
</mapper>


passengerCardMapper.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="org.zgf.learn.mybatis.entity.PassengerCardMapper">

<!-- 查: 从数据库中查询单个对象-->
<select id="getPassengerCardById" parameterType="int" resultType="PassengerCard" >
select * from mybatis_one2one_psgcard where id = #{id}
</select>

</mapper>


2. 测试用例

package org.zgf.learn.mybatis.mapper.one2one;

import org.junit.Test;
import org.zgf.learn.mybatis.entity.one2one.Passenger;
import org.zgf.learn.mybatis.mapper.abase.BasicTest;

public class Test_one2one extends BasicTest{

/**
* 执行结果:发送一条连接sql语句
*/
@Test
public void test_get_join(){

Passenger passenger = session.selectOne("org.zgf.learn.mybatis.entity.PassengerMapper.getPassengerById",1);
System.out.println(passenger);
}

/**
* 执行结果:发送两条sql 语句
*/
@Test
public void test_get(){

Passenger passenger = session.selectOne("org.zgf.learn.mybatis.entity.PassengerMapper.getPsgById",1);
System.out.println(passenger);
}

}


3. 实体类

Passenger.java

package org.zgf.learn.mybatis.entity.one2one;

/**
* 乘客
*/
public class Passenger {

private Integer id;

private String name;

private Integer age;

private PassengerCard passengerCard;

public Passenger() {
}

public Passenger(Integer id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

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 PassengerCard getPassengerCard() {
return passengerCard;
}

public void setPassengerCard(PassengerCard passengerCard) {
this.passengerCard = passengerCard;
}

@Override
public String toString() {
return "Passenger [id=" + id + ", name=" + name + ", age=" + age + ", passengerCard=" + passengerCard + "]";
}

}


PassengerCard.java

package org.zgf.learn.mybatis.entity.one2one;
/**
* 公交卡
*/
public class PassengerCard {

private Integer id ;

private String cardNo;

public PassengerCard() {
super();
}

public PassengerCard(Integer id, String cardNo) {
this.id = id;
this.cardNo = cardNo;
}

public Integer getId() {
return id;
}

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

public String getCardNo() {
return cardNo;
}

public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}

@Override
public String toString() {
return "PassengerCard [id=" + id + ", cardNo=" + cardNo + "]";
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: