当前位置: 首页 > 编程日记 > 正文

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集合中

转载于:https://www.cnblogs.com/zhang-boke/p/7243272.html

相关文章:

【怎样写代码】对象克隆 -- 原型模式(四):浅克隆与深克隆

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

计算机与控制学院优秀学生,三好学生主要事迹:计算机与控制工程学院王天琪事迹.doc...

三好学生主要事迹&#xff1a;计算机与控制工程学院王天琪事迹“中国好同学”、“中国好男孩”、“中国好男友”——用这“三好”来形容王天琪再合适不过。这个四川男生笑容温暖&#xff0c;彬彬有礼&#xff0c;生长于南方却操着一口标准的普通话&#xff0c;交谈中时而有些羞…

[总结]博客聚合-cnblogs,wordpress,live writer,word2010

一、url地址&#xff1a; cnblogs&#xff1a; http://BusyAnt.cnblogs.com/services/metaweblog.aspx wordpress: http://blog.busyant.cn/xmlrpc.php CSDN&#xff1a;http://blog.csdn.net/busyant/services/metablogapi.aspx 二、配置&#xff1a; word2010&#xff1a;文件…

【怎样写代码】对象克隆 -- 原型模式(五):原型管理器的引入和实现

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

Android 基于 Speex 的高度封装语音库,0 耦合,没三方jar包

作者&#xff1a;林冠宏 / 指尖下的幽灵 掘金&#xff1a;https://juejin.im/user/587f0dfe128fe100570ce2d8 博客&#xff1a;http://www.cnblogs.com/linguanh/ GitHub &#xff1a; https://github.com/af913337456/ 为了您的直观体验&#xff0c;请务必看完下面 截图&#…

计算机累加器有加法器功能吗,累加器-累加器ACC的作用

ACC累加器B用于辅助累加器做某些运算的寄存器PSW程序状态字其中最高位是进/借位标志C&#xff1b;PSW.6是辅助进位标志AC&#xff0c;用于标识加减运算中低四位向高四位的进位&#xff1b;PSW.4和PSW.3是寄存器组选择位RS1和RS0&#xff0c;用于从--1FH的32个存储器单元(4组)中…

object expected错误解决方法

写一个页面&#xff0c;引用了另外的js&#xff0c;结果触发js事件时&#xff0c;浏览器显示"object expected "错误&#xff0c;说什么action有错&#xff0c;在action硬是纠结了半天&#xff0c;结果发现是由于action跳转之后&#xff0c;路径错了&#xff0c;所以…

Eclipse优化之设置不自动弹出控制台和Server

有时候Eclipse启动&#xff0c;控制台console不会自动跳出来&#xff0c;需要手工点击该选项卡才行&#xff0c; 按下面的设置&#xff0c;可以让它自动跳出来(或不跳出来)&#xff1a; windows -> preferences -> run/debug -> console 在右边面板勾选或…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(一):问题案例

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

css menu builder,AutoPlay Menu Builder使用教程【图文教程】

是一个功能强大的光盘自动运行菜单制作工具&#xff0c;使用它,你不需要具备任何专业知识,只需要经过鼠标拖放和几次鼠标点击就可以轻松制作出非常漂亮的自动运行(AutoRun)菜单程序,让你制作菜单象垒积木一样容易!二、软件使用1、如图一所示&#xff0c;软件启动时首先随程序主…

freemarker写select组件报错总结(六)

1、错误描写叙述 六月 26, 2014 10:53:26 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template processing error: "Expression data[text] is undefined on line 9, column 51 in inc/select.ftl."Expression data[text] is undefined on lin…

FPGA中LVDS差分高速传输的实现

低压差分传送技术是基于低压差分信号(Low Volt-agc Differential signaling)的传送技术&#xff0c;从一个电路板系统内的高速信号传送到不同电路系统之间的快速数据传送都可以应用低压差分传送技术来实现&#xff0c;其应用正变得越来越重要。低压差分信号相对于单端的传送具有…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(二):解决方案

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

自动化测试selenium+java学习笔记

//driver后面接 get(String url) 访问指定url页面 getCurrentUrl() 获取当前页面的url地址 getTitle() 获取当前页面的标题 getPageSource() 获取当前页面源代码 quit() …

JS实现继承的几种方法

父类&#xff1a; // 定义一个动物的类 function Animal (name) {// 属性this.name name || Animal;// 实例方法this.sleep function(){console.log(this.name 正在睡午觉&#xff01;);} } // 原型方法 Animal.prototype.eat function(food) {console.log(this.name 正在…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(四):扩展案例

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

接口测试和单元测试的区别

1、单元测试注重代码逻辑&#xff0c;接口测试注重业务逻辑&#xff1b; 2、单元测试的粒度最小&#xff0c;是测试最小独立的单元模块&#xff08;不依赖其他模块&#xff09;&#xff1b;接口测试不是&#xff0c;会覆盖很多&#xff1b; 3、单元测试是白盒测试&#xff0c…

改善FLEX/FLASH性能的小技巧(转)

使用下面的几个改善性能的技巧&#xff0c;如果你使用Flex Builder&#xff0c;那么可以使用调试窗口查看你的程序中关键的几步创建对象和内存回收的情况。有时细小的调整会造成很大的不同。下面是一小部分能够改善你的程序性能的做法&#xff1a;1)如果不知道一个对象的类型&a…

机器学习算法(3:决策树算法)

一、决策树简介 决策树是附加概率结果的一个树状的决策图&#xff0c;是直观的运用统计概率分析的图法。机器学习中决策树是一个预测模型&#xff0c;它表示对象属性和对象值之间的一种映射&#xff0c;一颗决策树是一棵有向无环树&#xff0c;它由若干个节点、分支、分裂谓词以…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(三):建造者模式

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

Junit单元测试需要知道的一些知识点

Junit单元测试框架—基于java语言对的主流单元测试框架 beforeClass—位于数据准备前期或者其他前期准备&#xff08;测试类调用前&#xff09; --用于提取代码中的共用部分减少冗余&#xff0c;只能声明注解一次 --必须在public static void,方法名随意&#xff0c;&#x…

关闭Windows 2000/XP/2003默认共享

Windows 2000/XP/2003版本的操作系统提供了默认共享功能&#xff0c;这些默认的共享都有“$”标志&#xff0c;意为隐含的&#xff0c;包括所有的逻辑盘&#xff08;C$&#xff0c;D$&#xff0c;E$……&#xff09;和系统目录Winnt或Windows&#xff08;admin$&#xff09;。 …

MySQL 代码结构与基本流程

一、MySQL基本架构二、MySQL目录结构build: 内含有各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行调试编译的脚本。client: 客户端工具&#xff0c;如mysql,mysqladmin之类。cmd-line-utils: readline,libedit工具。config: 给aclocal…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(五):关于Director的进一步讨论

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

如何进行app的兼容性测试?需要考虑哪些方面?

考虑的方面&#xff1a; 1. 系统 a. Android 1). 官方版:官方发型的版本 数据来源&#xff1a;https://mta.qq.com/mta/data/device/os 2). 定制版&#xff1a;华为、魅族、小米、三星。 (前三&#xff1a;华为、oppo、vivo) 数据来源&#xff1a;https://mta.qq.com/mta…

.NET Framework 4.0的新特性

本文将揭示.NET 4.0中的3个新特性&#xff1a;图表控件、SEO支持以及ASP.NET 4可扩展的输出缓存。 图表控件 微软向开发者提供了大量可免费下载的图表控件&#xff0c;可以在.NET 3.5 ASP.NET或WinForms项目中使用这些控件。要想在Visual Studio 2008中使用这些控件则需要安装一…

【怎样写代码】确保对象的唯一性 -- 单例模式(一):问题案例

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

《Kinect应用开发实战:用最自然的方式与机器对话》一3.4 深度图像成像原理...

3.4 深度图像成像原理 Kinect有发射、捕捉、计算视觉重现的类似过程。严格说来&#xff0c;Kinect的“深度眼睛”是由一个红外投影机和红外摄像头组合而成的&#xff0c;投影和接收互为重叠&#xff0c;如图3-27所示。 可以说&#xff0c;Kinect的成功也在于其能廉价而有效地捕…

UI设计不够高端?这5个小技巧可以试试

UI培训设计是对软件的人机交互、操作逻辑、界面美观度的整体设计。好的UI设计不仅要让软件变得漂亮舒适&#xff0c;还要充分考虑到用户的操作问题。 从事UI设计的朋友们&#xff0c;肯定知道我们在做UI设计时&#xff0c;其实是可以通过一些小技巧来帮我们设计的界面更加的漂…

Apache学习路线

参考资料&#xff1a; 1、《Apache源代码全景分析》 2、《鸟哥服务器架设篇》 一、不同的开发人员应该关注的知识点 Apache管理员 配置文件、配置指令 模块开发人员 全部内容 服务器开发人员 MPM并发处理框架 普通人员 …