5.mybatis一对一表关联查询
方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
2种都用到了resultMap和association(关联),区别:
方式1中的association中,用到javaType,代表关联的实体类型
方式2中的association中,不用javaType,但是用到column(代表第一条sql查询的结果的外键作为第二条sql的查询条件)和select(第二条sql语句)
实例:
有班级class[id, name, teacher],对应的老师teacher[id, name],它们的关系是一对一。
插入表数据:
--teacher表
INSERT INTO `mybatis`.`teacher`(`tid`,`tname`) VALUES ( NULL,'老师A');
INSERT INTO `mybatis`.`teacher`(`tid`,`tname`) VALUES ( NULL,'老师B');
--class表
INSERT INTO `mybatis`.`class`(`cid`,`cname`,`tid`) VALUES ( NULL,'一年级','');
INSERT INTO `mybatis`.`class`(`cid`,`cname`,`tid`) VALUES ( NULL,'二年级','');
Java实体类:
public class Teacher {
private int id;
private String name;
public Teacher() {
super();
}
public Teacher(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + "]";
}
}
public class Clazz {
private int id;
private String name;
private Teacher teacher;
public Clazz(int id, String name, Teacher teacher) {
super();
this.id = id;
this.name = name;
this.teacher = teacher;
}
public Clazz() {
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Clazz [id=" + id + ", name=" + name + ", teacher=" + teacher
+ "]";
}
}
第一种方式: 嵌套结果,使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
teacherMapper.xml:
<!-- 查询班级及其老师信息 -->
<select id="getClazz" parameterType="int" resultMap="getClazzMap">
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
</select> <resultMap type="Clazz" id="getClazzMap">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<!-- 关联班级对应的teacher -->
<association property="teacher" javaType="Teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
Java测试类:
/**
* 方式一:嵌套结果
* @author 魅力_小生
*
*/
@Test
public void getClazz1(){
//创建session,设置事务为true
SqlSession session = MyBatisUtil.getSessionFactory().openSession(true);
String statement = "com.mlxs.mybatis.test4.clazzMapper.getClazz";
Clazz clazz = session.selectOne(statement, "2");
System.out.println("clazz--->"+clazz);
session.close();
}
结果:
clazz--->Clazz [id=2, name=二年级, teacher=Teacher [id=2, name=老师B]]
第二种方式:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
teacherMapper.xml:
<!--
一对一 关联查询: 方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
-->
<!-- 查询班级及其老师信息 -->
<select id="getClazz2" parameterType="int" resultMap="getClazzMap2">
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
</select>
<select id="getTeacher" parameterType="int" resultType="Teacher">
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id}
</select> <resultMap type="Clazz" id="getClazzMap2">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<!-- 关联班级对应的teacher,将查询class表返回的tid参数传给getTeacher,也就是getTeacher中的#{id} -->
<association property="teacher" column="tid" select="getTeacher"/>
</resultMap>
Java测试类:
/**
* 方式二:嵌套查询,通过执行另外一个SQL 映射语句来返回预期的复杂类型
SELECT * FROM class c,teacher t WHERE c.tid = t.tid AND c.cid=#{id}
SELECT t.tid id, t.tname name FROM teacher t WHERE t.tid = #{id} //使用上面查到的tid
* @author 魅力_小生
*
*/
@Test
public void getClazz2(){
//创建session,设置事务为true
SqlSession session = MyBatisUtil.getSessionFactory().openSession(true);
String statement = "com.mlxs.mybatis.test4.clazzMapper.getClazz2";
Clazz clazz = session.selectOne(statement, "2");
System.out.println("clazz--->"+clazz);
session.close();
}
结果:
clazz--->Clazz [id=1, name=一年级, teacher=Teacher [id=1, name=老师A]]
5.mybatis一对一表关联查询的更多相关文章
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- JAVA入门[9]-mybatis多表关联查询
概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...
- mybatis多表关联查询之resultMap单个对象
resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...
- MyBatis 多表关联查询
多表关联查询 一对多 单条SQL实现. //根据部门编号查询出部门和部门成员姓名public dept selectAll() thorws Excatipon; //接口的抽象方法 下面是对应接口的 ...
- Mybatis多表关联查询字段值覆盖问题
一.错误展示 1.首先向大家展示多表关联查询的返回结果集 <resultMap id="specialdayAndWorktimeMap type="com.hierway. ...
- spring boot 2使用Mybatis多表关联查询
模拟业务关系:一个用户user有对应的一个公司company,每个用户有多个账户account. spring boot 2的环境搭建见上文:spring boot 2整合mybatis 一.mysq ...
- 三、Mybatis多表关联查询应用
一对一查询 实现语句:select * from neworder o, user u where o.uid = u.id 实体Order: 接口: 配置: 测试: 一对多查询 实现语句:selec ...
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
- Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...
随机推荐
- [置顶] 1D1D动规优化初步
例题一: 货物运输,大意: 给出N个点的坐标与需要你送过去的钱数(第一个点不需要钱),身上带钱的数目有最大值,由初始在的1点,按顺序经历每个点(中途可以回1点,回去钱就满了),问最小走的路程是多少(最 ...
- 创建laravel项目时打开浏览器常见错误
1.Whoops, looks like something went wrong. 打开:D:\java\wamp\www\subway\app\config\app.php 修改:'debug' ...
- Mysql query log
一.查询日志的概念: 查询日志记录MySQL中所有的query,通过"--log[=file_name]"来打开该功能.由于记录了所有的query,包括所有的select,体积比较 ...
- 使用Symfony 2在三小时内开发一个寻人平台
简介 Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快.性能高等特点.但Symfony2的学习曲线也比 较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性. 本文通过一个快速开 ...
- mysql 关联条件与查询(过滤)条件
mysql用outer join时 on 后边只是关联条件,有时可能会查出无用的记录, 需用where查询条件过滤 五欧诺个的数据. 记录一下
- 让popUpWindow之外的区域显示阴影效果
/** * 让popupwindow以外区域阴影显示 * @param popupWindow */ private void popOutShadow(PopupWindow popupWindow ...
- 【转】JAVA变量path , classpth ,java_home设设置作用和作用
转载地址:http://bbs.tech.163.com/bbs/tech_0ik1/147645925.html 在把jdk安装到计算机中之后,我们来进行设置使java环境能够使用. 首先右键点我的 ...
- YTU 3008: 链串的基本运算
3008: 链串的基本运算 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 题目描述 编写一个程序,实现链串的各种基本运算,主函数已给出,请补充每一种方法. 1.建立串s ...
- c#xml追加读取节点
读取 if (File.Exists("Book.xml")) { XmlDocument doc = new XmlDocument(); doc.Load("Book ...
- Humble Numbers
Humble Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9988 Accepted: 4665 Descri ...