6.MyBatis实现一对一查询

现在有这么一个需求:

当查询这个学生信息的时候, 接着把这个学生对应的老师的信息查询出来.

这就需要一对一进行查询.

一: 准备工作

1. 建立数据表

CREATE TABLE teacher(
	t_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	t_name VARCHAR(255)
);
CREATE TABLE student(
	s_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	s_name VARCHAR(255),
	t_id INT(11),
	FOREIGN KEY(t_id) REFERENCES teacher(t_id)
)
INSERT INTO teacher(t_name) VALUES(‘Tom‘);
INSERT INTO student(s_name,t_id) VALUES(‘Stu1‘, 1);
INSERT INTO student(s_name,t_id) VALUES(‘Stu2‘, 1);
INSERT INTO student(s_name,t_id) VALUES(‘Stu3‘, 1);

2. 建立对应的实体类

package com.mybatis.entities;

public class Teacher {

	private Integer id;
	private String name;
	// 写好 getter/ setter方法
	// 写好 toString 方法, 便于测试

}
====================================
package com.mybatis.entities;

public class Student {

	private Integer id;
	private String name;
	private Teacher teacher;
	// 写好 getter/ setter方法
	// 写好 toString 方法, 便于测试

}

3. 定义对应的映射文件, 并在 conf.xml 文件中注册

由于我们只查询学生的信息, 所以, 这里指定义 Student类的映射文件 StudentMapper.xml. 如下:

二: 测试

1. 在 StudentMapper.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.mybatis.entities.StudentMapper">

	<!-- 
		查询方式有两种, 分别是:
		1. 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集封装联表查询的数据(去除重复的数据)
		2. 嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
	 -->
	 
	 <!-- 测试 嵌套结果 -->
	 <!-- 由于返回值中有一个对象, 所以只用别名来映射不可用, 这里就使用一个自定义一个返回值类型来映射 -->
	 <select id="getStudent1" parameterType="int" resultMap="getStundet1Map">
	 	SELECT t.t_id, t.t_name, s.s_id, s.s_name, s.t_id 
	 	FROM teacher t, student s 
	 	WHERE t.`t_id`=s.`t_id` AND s.`s_id`=#{id}
	 </select>
	 <resultMap type="Student" id="getStundet1Map">
	         <!-- id: 这个表对应的主键 -->
	 	<id column="s_id" property="id"/>
	 	<!-- result: 一个一般的字段 -->
	 	<result column="s_name" property="name"/>
	 	<!-- 利用这个标签, 来映射一个对象, 其中jdbcTyp是返回值类型 -->
	 	<association property="teacher" javaType="Teacher">
	 		<id column="t_id" property="id"/>
	 		<result column="t_name" property="name"/>
	 	</association>
	 </resultMap>
	 
	 <!-- 测试 嵌套查询 -->
	 <!-- 由于返回值中有一个对象, 所以只用别名来映射不可用, 这里就使用一个自定义一个返回值类型来映射 -->
	 <select id="getStudent2" parameterType="int" resultMap="getStudent2Map">
	 	SELECT s_id, s_name, t_id FROM student WHERE s_id=#{s_id}
	 </select>
	 <!-- 这里使用别名来映射实体类中的属性 -->
	 <select id="getTeacher" parameterType="int" resultType="Teacher">
	 	SELECT t_id id, t_name name FROM teacher WHERE t_id=#{t_id}
	 </select>
	 <resultMap type="Student" id="getStudent2Map">
	 	<id column="s_id" property="id"/>
	 	<result column="s_name" property="name"/>
	 	<!-- 
	 	    select: 执行 select id为 getTeacher 中的 sql.
	 	    column: 因为 select id为 getTeacher 中的 sql 语句需要一个t_id
	 	            所以这里传给它一个 t_id
	 	 -->
	 	<association property="teacher" column="t_id" select="getTeacher">
	 	</association>
	 </resultMap>
	 
</mapper>

2. 测试代码

package com.mybatis.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.mybatis.entities.Student;
import com.mybatis.util.MyBatisUtil;

public class TestStudent {

	@Test
	public void testGetStudent1() {

		SqlSession session = MyBatisUtil.getSqlSession();

		String statement = "com.mybatis.entities.StudentMapper.getStudent1";
		Student student = session.selectOne(statement, 1);
		System.out.println(student);

	}

	@Test
	public void testGetStudent2() {

		SqlSession session = MyBatisUtil.getSqlSession();

		String statement = "com.mybatis.entities.StudentMapper.getStudent2";
		Student student = session.selectOne(statement, 2);
		System.out.println(student);

	}

}
// 执行结果
//Student [id=2, name=Stu2, teacher=Teacher [id=1, name=Tom]]

本篇博文的源代码点击 http://pan.baidu.com/s/1o7oLSj4 下载.

时间: 2024-12-28 21:25:01

6.MyBatis实现一对一查询的相关文章

Mybatis实现一对一查询 对ResultType和ResultMap分析

实现一对一查询: ResultMap:使用ResultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加 列名对应的属性,即可完成映射. 如果没有查询结果的特殊要求建议使用ResultMap. ResultMap:需要单独定义ResultMap,实现有点麻烦,如果对查询结果又特殊要求,使用ResultMap 可以完成将关联查询映射pojo的属性中. (ResultMap可以实现延迟加载,而ResultMap无法实现延迟加载) 原文地址:https://www.cnblogs.c

mybatis处理一对一查询

1.使用嵌套结果方式 sql语句:select c.* ,t.t_name from class c,teacher t where c.teacher_id = t.t_id where c.c_id = #{id} <resultMap> <id property="" column=""/> <result property="" column=""/> <association

【MyBatis学习08】高级映射之一对一查询

从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询. 为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到的不同的映射,为此,我建立4个表,如下: DROP TABLE IF EXISTS `items`; DROP TABLE IF EXISTS `orders`; DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `orderdetail`; /*it

mybatis学习笔记(10)-一对一查询

mybatis学习笔记(10)-一对一查询 mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实现一对一查询小结 本文使用两种方式(resultType和resultMap)实现一对一查询,查询订单信息,关联查询创建订单的用户信息 resultType实现 sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询使用内连接?还是外连接? 因为orders表中有一个外键(user_id),通过外键关联查询

MyBatis Review——使用resultType和resultMap实现一对一查询

例如: 查询订单信息,关联查询创建订单的用户信息. 查询语句: SELECT orders.*, USER .username ,USER .sex, USER .address FROM orders, USER WHERE orders.user_id = USER .id 查询结果: 1,使用resultType接受输出结果 用户信息: 订单信息: 用于接收结果的pojo: 为了将查询结果映射到pojo中,pojo必须包括所有查询列名.在原始orders对象不能接受所有查询字段的时候,定义

第八节:mybatis关联查询之一对一查询

一对一也就是 A 表的一条记录对应 B 表的一条记录,下面的测试数据中,从employee 表来看,一个员工对应一个部门,是一对一关系,如果从部门角度来看,则是一对多的关系,一个部门对应多个员工,本节主要研究一对一的关系. 1,数据表建立 新建数据表department,有两个字段,插入两条数据如下: id dept_name 1 CIA 2 FSB 新建数据表employee,有三个字段,其中dept_id是外键,关联department表的主键id.插入数据如下: id last_name

Mybatis多表查询之一对一查询的多种实现-XML配置

Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码.R

mybatis0202 一对一查询 resultType实现

一对一查询 查询订单信息和用户信息 创建po类 基础的单表的 po(数据库类)类:Items.java, Orderdetail.java, Orders.java, User.java 一对一查询映射的pojo(工具类,用于sql语句接收返回的对象) 创建pojo包括 订单信息和用户信息,resultType才可以完成映射. 创建OrderCustom作为自定义pojo,继承sql查询列多的po类. 接口:OrdersMapperCustom.java package cn.itcast.my

20Mybatis_订单商品数据模型_一对一查询——resultType和resultMap两种方式以及两种方式的总结

上一篇文章分析了数据模型,这篇文章就给出一个需求,这个需求是一对一查询,并完成这个需求. -------------------------------------------------------------------------------------------------------------------------------------------- 需求: 查询订单信息,关联查询创建订单的用户信息. 记住:用Mybatis开发的顺序就是 1.写sql语句 2.创建pojo类来