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
passengerCardMapper.xml
2. 测试用例
3. 实体类
Passenger.java
PassengerCard.java
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 + "]"; } }
相关文章推荐
- linux内核的idr学习(二)
- Codeforces Round #342 (Div. 2) B
- 02. mybatis 常用标签
- 03. mybatis 动态sql && 模糊查询
- 为什么计算机只有0和1两个数字啊?
- HDU 1022 Train Problem I
- 01. mybatis 简介 && 环境搭建
- ArrayList<T>数组转换为二维数组
- ubuntu ibus pinyin输入法异常
- 编程世界,我的世界。
- ADO.NET之command录入数据(视图版)
- NYOJ-12-喷水装置(二)
- 解决cocoapods在64位iOS7系统以下的警告问题
- PadLeft函数
- Django工程读取mongodb并使用分页器
- 删除海量数据之全表删除与部分删除
- HDU ACM 1081 To The Max->最大子矩阵
- 除夕夜
- 造轮子:论Top与ROW_NUMBER读取第一页的效率问题
- SQL变量与全局变量