MyBatis关联查询、多条件查询
MyBatis关联查询、多条件查询
1、一对一查询
任务需求;
根据班级的信息查询出教师的相关信息
1、数据库表的设计
班级表:

教师表:

2、实体类的设计
班级表:
|
public class Classes { 9 //定义实体类的属性,与class表中的字段对应 10 private int id; //id===>c_id 11 private String name; //name===>c_name 13 /** 14 * class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性, 15 * 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的 16 */ 17 private Teacher teacher; |
教师表:
public class Teacher {
9 //定义实体类的属性,与teacher表中的字段对应 10 private int id; //id===>t_id 11 private String name; //name===>t_name |
3、定义mapper接口
|
package com.ipcopyright.dao.read; public interface TeacherDaoR { // 级联查询班级信息带教师信息 public Classes fintClassJoinTeacher(int id); //嵌套查询 public Classes findclassjointeacher2(int id); } |
4、定义mappe.xml接口
方式一:嵌套结果——联表查询
sql查询语句:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
- 使用嵌套结果来处理重复的联合结果的子集
- 封装联表查询的数据(去除重复的数据)
|
<!-- 嵌套结果 --> <!-- 联表查询,封装结果子集 --> <select id="fintClassJoinTeacher" resultMap="baseresultMap" parameterType="int"> select * from class c ,teacher t where c.teacher_id = t.t_id and c.c_id = #{id} </select> <!-- 结果集封装 --> <!-- 使用resultMap映射实体类和字段之间的一一对应关系 --> <resultMap type="com.ipcopyright.domain.Classes" id="baseresultMap"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.ipcopyright.domain.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap> |
resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应
association:表示进行一对一关联查询映射
property:表示关联查询的结果存储在classes类下面的teacher对象中
javaType:表示关联查询的映射结果类型
方式二:嵌套查询——执行两次查询
sql语句:
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
- 通过执行另外一个SQL映射语句来返回预期的发杂类型
|
<!-- 嵌套查询 --> <select id="findclassjointeacher2" parameterType="int" resultMap="find2"> SELECT * FROM class WHERE c_id = #{id}; </select> <!-- 使用resultMap映射实体类和字段之间的一一对应关系 --> <resultMap type="com.ipcopyright.domain.Classes" id="find2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="com.ipcopyright.domain.Teacher" parameterType="int"> SELECT t_id id,t_name name FROM teacher WHERE t_id = #{id}; </select> |
resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应
association:表示进行一对一关联查询映射
property : 查询的结果放入到pojo类中的哪一个属性当中
column : 向下一个查询压入的参数
select: 将查询到的column中的id压入到select为getTeacher的参数当中
注意:
select="getTeacher" 为<select id="getTeacher"的参数中可以随便给任意名称,只要是输入参数与压入进去的值类型相同就行。
不管输入的参数名是什么,mybatis最终会执行为
效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)
5、Mybatsis一对一关联查询总结
Mybatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:
- property:对象属性的名称
- javaType:对象属性的类型
- column:所对应的外间字段名称
- select:使用另一个查询封装的结果
2、一对多查询
一对多查询:只能使用resultMap来完成结果映射:
以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到主对象当中
任务需求 ; 根据班级id查询对应的班级信息(包括学生,老师信息)
1、数据库表的设计
班级表:

教师表:

学生表:

2、实体类的设计
班级表:
|
public class Classes { 9 //定义实体类的属性,与class表中的字段对应 10 private int id; //id===>c_id 11 private String name; //name===>c_name 12 private Teacher teacher; //表中的teacher_id来进行一对一的维护 13 private List<Student> students;// 使用一个List<Student>集合属性表示班级拥有的学生 |
教师表:
public class Teacher {
9 //定义实体类的属性,与teacher表中的字段对应 10 private int id; //id===>t_id 11 private String name; //name===>t_name |
学生表
|
public class Student { //定义属性 private int id; private String name; |
3、定义mapper接口
|
public interface TeacherDaoR { // 一对一查询班级,教师信息(嵌套结果) public Classes fintClassJoinTeacher(int id); // 一对一查询班级,教师信息(嵌套查询) public Classes findclassjointeacher2(int id); //一对多查询出班级、学生、教师信息 public Classes findclassjoints(int id); //一对多查询出班级、学生、教师信息 public Classes findclassjoints2(int id); } |
4、定义mapper.xml
方式一:嵌套结果——联表查询
根据班级ID查询对应的班级信息,包括学生信息,教师信息
sql语句:
SELECT * FROM class c, teacher t,student s
WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
- 使用嵌套结果映射来处理重复的联合结果的子集
|
<resultMap type="com.ipcopyright.domain.Classes" id="resultClasses"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <!--一对一查询出教师信息--> <association property="teacher" javaType="com.ipcopyright.domain.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> <!-- 一对多查询出学生信息 --> <collection property="students" ofType="com.ipcopyright.domain.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection> </resultMap> |
Collection标签:定义了一对多关联的结果映射。
property:关联查询的结果集存储在POJO类的哪个属性。
ofType:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。
方式二:嵌套查询——执行多次查询
sql语句:
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值
SELECT * FROM student WHERE class_id=1 //1是第一个查询得到的c_id字段的值
首先:
查询到班级的信息,通过班级的教师id查询到教师的信息,通过班级的id查询到学生的信息
|
<!-- 通过执行另外一个映射语句返回预期的复杂类型 --> <select id="findclassjoints2" parameterType="int" resultMap="Classresult4"> select * from class where c_id = #{id}; </select> <resultMap type="com.ipcopyright.domain.Classes" id="Classresult4"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <!-- 一对一查询教师信息 --> <association property="teacher" column="teacher_id" select="getTeacher1" /> <!-- 一对多查询学生的信息 --> <collection property="students" column="c_id" select="getstudent1" /> </resultMap> <!-- 查询教师的信息 --> <select id="getTeacher1" resultType="com.ipcopyright.domain.Teacher" parameterType="int"> select t_id as id,t_name as name from teacher where t_id = #{id}; </select> <!-- 查询学生的信息 --> <select id="getstudent1" resultType="com.ipcopyright.domain.Student" parameterType="int"> select s_id as id,s_name as name from student where class_id = #{id}; </select> |
resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应
<一对一>
association:表示进行一对一关联查询映射
property:关联查询的结果集存储在POJO类的哪个属性。
column : 向下一个查询压入的参数
select: 将查询到的column中的id压入到select为getTeacher的参数当中
<一对多>
Collection标签:定义了一对多关联的结果映射。
property:关联查询的结果集存储在POJO类的哪个属性。
column:传入的id
select: 将查询到的column中的id压入到select为getTeacher的参数当中
注意:
另外查询中不管输入的参数名是什么,mybatis最终会将column中的值传入进去,类型保证一致即可
效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)
3、关联查询总结resultType和resultMap
1、resultType
介绍:
如果没有查询结果的特殊要求,将查询结果都映射成一个pojo的简单类型属性,建议使用resultType。
作用:
将查询结果按照sql列名pojo属性名一致性映射到pojo中。
适用:
一对一查询中,无特殊要求,定义专门的POJO类作为输出类型,其中定义了sql查询结果集的所有字段(企业使用普遍)
场合:
常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可
2、resultMap
介绍:
如果查询结果有特殊要求,对映射结果需要进行高级映射,简易使用resultMap
作用:
通过resultMap对查询结果进行与pojo类属性的映射设置
适用:
一对多查询中,存在特殊要求,通过使用association和collection完成一对一和一对多高级映射
association:将关联查询信息映射到一个pojo对象中
collection:将关联查询信息映射到一个list集合中。
方便关联查询信息,将关联信息映射到对象的pojo属性中,或者list集合中
MyBatis关联查询、多条件查询的更多相关文章
- [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)
本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- Mybatis框架模糊查询+多条件查询
一.ISmbmsUserDao层 //根据姓名模糊查询 public List<Smbms> getUser(); //多条件查询 public List<Smbms> get ...
- tp5关联模型进行条件查询
public function wordOne(){ return $this->hasOne('TeachWord','id','w_id')->field('id,pid,title' ...
- MyBatis框架中的条件查询!关键字exists用法的详细解析
exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...
- MySQL数据库6 -查询基础,简单查询,条件查询,对查询结果排序
一.SELECT语句 SELECT COL1,COL2,....COLn FROM TABLE1,TABLE2,....TABLEn [WHERE CONDITIONS] -- 查询条件 [GROUP ...
- dhtmlxGrid分页查询,条件查询实例
使用jquery的ajax get将页面条件请求到后台,取得数据库数据,分页查询,返回前台grid中. 引入所需文件: <script>window.dhx_globalImgPath = ...
- MySQL数据库—查询基础,简单查询,条件查询,对查询结果排序
一.SELECT语句 SELECT COL1,COL2,....COLn FROM TABLE1,TABLE2,....TABLEn [WHERE CONDITIONS] -- 查询条件 [GROUP ...
- 软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询
1.DML核心CRUD增删改查 缩写全称和对应 SQL: * DML 数据操纵语言:Data Manipulation Language * Create 增加:insert * Retrieve 查 ...
- MySQL——基础查询与条件查询
基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个 ...
随机推荐
- <正则吃饺子> :关于oracle 中 exists 、not exists 的简单使用
话不多说,简单的总结而已.网络上很多很详细介绍. 例如,博文:http://blog.csdn.net/zhiweianran/article/details/7868894 当然这篇也是转载的,原 ...
- Eclipse下对maven进行配置
前提:安装好maven插件http://www.cnblogs.com/lchzls/p/6281697.html 1.需要修改配置:首先选择Window->Preferences,弹出如下对话 ...
- starUML建立时序图
对于经常看项目代码或者写项目的人.时序图可以帮助理解.记录项目.设计项目等用途. 1.starUml下载安装比较简单,这里不再赘述.打开starUml 2. 在Model Explorer 中,在Un ...
- 微软 Remote App
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wangchunhai.blog.51cto.com/225186/201073 ...
- HDU - 6156 2017CCPC网络赛 Palindrome Function(数位dp找回文串)
Palindrome Function As we all know,a palindrome number is the number which reads the same backward a ...
- Linux 程式減肥(strip & objcopy)(转载)
转自:http://calamaryshop.blogspot.com/2011/11/linux-strip-objcopy.html 對於設計嵌入式Linux系統的研發人員來說,記憶體的空間是非常 ...
- Unity3D 自动添加Fbx Animation Event
http://blog.csdn.net/aa20274270/article/details/52528449 using UnityEngine; using System.Collections ...
- LeetCode.8-字符串转整数(String to Integer (atoi))
这是悦乐书的第349次更新,第374篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第4题(顺位题号是8).实现将字符串转换为整数的atoi方法. 该函数首先去掉所需丢 ...
- IP服务-8-WCCP
WCCP(网页缓存通信协议) 内容引擎负责将频繁访问的数据收集到本地,通常是HTTP流量,当主机访问相同页面时,可以直接通过内容引擎为主机提供相应内容,而无需通过WAN进行访问.WCCP与网页代理并不 ...
- 关于Django查询知识点总结
========关于Django查询知识点总结======= models.Book.objects.filter(**kwargs): querySet [obj1,obj2] models.Boo ...