Mybatis进阶2

Mybatis进阶1-CSDN博客

Mybatis入门-CSDN博客

Mybatis入门2-CSDN博客

我们接下来要学习Mybatis的高级查询

我们先在数据库中准备我们需要的数据表

teacher表

课程表:与教师表是一对多的关系,所以有一个外键字段

 

学生表

 

由于学生表和课程表是多对多的关系,所以我们创建一个虚拟表

coures_student表

 在Maven工厂的POJO包下创建对应的类,外键字段的成员变量可以不写,因为没啥用

public class Teacher {private int id ;private String teacherName;public Teacher() {}public Teacher(int id, String teacherName) {this.id = id;this.teacherName = teacherName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTeacherName() {return teacherName;}public void setTeacherName(String teacherName) {this.teacherName = teacherName;}@Overridepublic String toString() {return "Teacher{" +"id=" + id +", teacherName='" + teacherName + '\'' +'}';}}
public class Student {private int id;private String studentName;private int age;public Student() {}public Student(int id, String studentName, int age) {this.id = id;this.studentName = studentName;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", studentName='" + studentName + '\'' +", age=" + age +'}';}
}
public class Course {private int id;private String courseName;public Course() {}public Course(int id, String courseName) {this.id = id;this.courseName = courseName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}@Overridepublic String toString() {return "Course{" +"id=" + id +", courseName='" + courseName + '\'' +'}';}
}

Mybatis多表查询的套路

1.基于需求写sql语句

2.基于sql语句的查询结果,分析类与类之间的关联(建立实体类和实体类的关联)

3.在映射文件中,基于sql查询结果,配置映射关联

我们先来练习一对一查询,通过一个课程的名字来查询叫这门课程老师的信息

接口的方法:

public interface CourseMapper {/*** 通过课程名字找课程和老师的信息* @param courseName 课程名* @return 返回Coures类对象*/public Course findCourseByName(String courseName);
}

第一步:

编写sql语句

select course.id as coures_id, course.name, course.course_teacher_id, teacher.id as teacher_id, teacher.name
from course inner join teacher on teacher.id=course.course_teacher_id where course.name='java';

第二步: 基于sql语句的查询结果,分析类与类之间的关联(建立实体类和实体类的关联)

1对1查询结果:在Course类中添加新属性:Teacher对象

public class Course {private int id;private String courseName;private Teacher teacher;//添加一个老师对象public Course() {}public Course(int id, String courseName) {this.id = id;this.courseName = courseName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}@Overridepublic String toString() {return "Course{" +"id=" + id +", courseName='" + courseName + '\'' +'}';}
}

第三步:在映射文件中,基于sql查询结果,配置映射关联

<mapper namespace="com.hhh.dao.CourseMapper"><!--resultMap标签:解决查询结果字段名与实体类属性名不一致的问题;解决多表查询关联映射--><resultMap id="courseMap" type="com.hhh.pojo.Course"><!--配置:查询结果和Course类的映射关联--><id column="coures_id" property="id"/><result column="course_name" property="courseName"/><!--配置:1对1查询配置:查询结果与Teacher类的关联映射--><association property="teacher" javaType="com.hhh.pojo.Teacher" autoMapping="true"><id column="teacher_id" property="id"/><result column="teacher_name" property="teacherName"/></association></resultMap><select id="findCourseByName" resultMap="courseMap">selectcourse.id as coures_id, course.name as course_name,
//取别名来区分两张表的字段名,不然会报错teacher.id as teacher_id, teacher.name as teacher_namefrom course inner join teacheron teacher.id=course.course_teacher_idwhere course.name=#{courseName};</select>
</mapper>

测试:
 

public class CourseMapperTest {@Testpublic void testFindCourseByName(){SqlSession sqlSession = MybatisUtil.openSession();CourseMapper mapper = sqlSession.getMapper(CourseMapper.class);Course java = mapper.findCourseByName("java");System.out.println("课程信息为"+java);Teacher teacher = java.getTeacher();System.out.println("教师信息为"+teacher);}
}

接下来练习一对多查询,根据教师id查询其信息和他教课程的信息

第一步: 编写sql语句

select teacher.id, teacher.name, course.id, course.name 
from teacher inner join course 
on teacher.id = course.course_teacher_id 
where teacher.id=1;

需要注意的是这个两行数据是一个Teacher对象

 第二步:基于sql语句的查询结果,分析类与类之间的关联(建立实体类和实体类的关联)

一对多查询结果:在Teacher类添加新属性:List<Course>集合

public class Teacher {private int id ;private String teacherName;List<Course> couerses;public List<Course> getList() {return couerses;}public void setList(List<Course> list) {this.couerses = list;}public Teacher() {}public Teacher(int id, String teacherName) {this.id = id;this.teacherName = teacherName;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTeacherName() {return teacherName;}public void setTeacherName(String teacherName) {this.teacherName = teacherName;}@Overridepublic String toString() {return "Teacher{" +"id=" + id +", teacherName='" + teacherName + '\'' +'}';}}

第三步:在映射文件中,基于sql查询结果,配置映射关联

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.hhh.dao.TeacherMapper"><resultMap id="teacherMap" type="com.hhh.pojo.Teacher" autoMapping="true"><!--配置:查询结果和Teacher类的映射--><id column="teacher_id" property="id"/><result column="teacher_name" property="teacherName"/><!--配置:查询结果和Course类的映射-->      ofType是List元素的类型<collection property="couerses" javaType="java.util.List" ofType="com.hhh.pojo.Course"><id column="course_id" property="id"/><result column="couerse_name" property="courseName"/></collection></resultMap><select id="findTeacherById" resultMap="teacherMap">  取别名是为了区别,不然会报错select teacher.id as teacher_id, teacher.name as teacher_name,course.id as course_id, course.name as couerse_namefrom teacher inner join course on teacher.id = course.course_teacher_idwhere teacher.id=#{id};</select></mapper>

测试:

public class TeacherMapperTest {@Testpublic void testFindTeacherById(){SqlSession sqlSession = MybatisUtil.openSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacherById = mapper.findTeacherById(1);System.out.println("教师的信息为"+teacherById);List<Course> list = teacherById.getList();for (Course course : list) {System.out.println("所教的课程信息为"+course);}}
{

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Python编程从入门到实践》day22

# 昨日知识点回顾 方法重构、驾驶飞船左右移动、全屏显示 飞船不移动解决&#xff0c;问题出在移动变量x更新 # Ship.pysnipdef update(self):"""根据移动标志调整飞船的位置"""# 更新飞船而不是rect对象的x值# 如果飞船右移的标志和飞船外接…

八股Day2 多线程

Day2 多线程 1.线程和进程的区别&#xff1f; 2.并发和并行的区别&#xff1f; 3.创建线程的四种方式 4.线程的run()和start()有什么区别 5.线程包含哪些状态&#xff0c;怎么变化的 6.新建T1 T2 T3三个线程&#xff0c;如何保证他们按顺序执行 7.Notify和notifyAll区别 8.Sle…

微信小程序Picker组件全面解析:如何优雅处理数组对象选择器【代码示例】

微信小程序Picker组件全面解析&#xff1a;如何优雅处理数组对象选择器【代码示例】 基本概念picker组件简介数组对象与picker 实战例演练数据准备picker配置数据绑定与处理显示选中结果 安全性与性能优化结语与讨论 在微信小程序开发中&#xff0c;picker组件扮演着至关重要的…

射频无源器件之电桥

一. 电桥的定义及作用 电桥主要用于实现微波大功率功放系统的功率合成分配,信号采集等功能,被广泛应用于中国及全球4G/5G基站、5G网络覆盖、北斗导航天线、车载高精度导航(无人驾驶)天线等。可将信号分成有相位差的两路,90度电桥相位差90,180度电桥相位差180。 常说的3d…

Redis学习2——SpringBoot整合Redis,Redis工具类

依赖和配置 pom.xml SpringBoot整合Redis&#xff0c;需要引入spring-boot-starter-data-redis依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>当…

使用poi生成word文件时,zip相关的报错

apache poi-检测到Zip Bomb解决方案_zip bomb detected! the file would exceed the max. -CSDN博客

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

C++学习第十二天(继承)

1、继承的概念以及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#x…

STM32F103学习笔记 | 报错界面及解决方案 | 1.keil5中文注释的横竖(正与斜)问题

文章目录 一、报错界面二、解决方案参考文献 一、报错界面 二、解决方案 打开设置 在打开的设置选项卡中&#xff0c;图中Font显示的是这个软件当前设置的字体&#xff0c;可以看到字体是仿宋&#xff0c;这就是问题出现的原因&#xff0c;将之改成没有的字体就行了。 可以看…

算法精讲:冒泡排序

1.基本思想 以n个人站队为例,从第一个人开始,依次比较相邻的两个人是否逆序对,(高的在前,矮的在后),若逆序便交换两人,也就是第一个人与第二个人相比较,若逆序便交换两人,第二个人和第三个人比较,若逆序便交换两人,……,直到第n-1个人与第n个人比较为止。经过一轮…

用FPGA+DAC输出“心”形波

1.前言 之前在做信号处理的时候整了一下活&#xff0c;用FPGADAC&#xff08;数模转换器&#xff09;&#xff0c;输出了一个爱心形状的波形&#xff0c;今天整理资料的时候偶然发现了他&#xff0c;现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示&#xff1a; …

Docker使用进阶篇

文章目录 1 前言2 使用Docker安装常用镜像示例2.1 Docker安装RabbitMQ2.2 Docker安装Nacos2.3 Docker安装xxl-job&#xff08;推荐该方式构建&#xff09;2.4 Docker安装redis2.5 Docker安装mysql 3 Docker自定义镜像3.1 Dockerfile的基本结构3.2 Dockerfile指令3.3 自定义JDK镜…

Sherman-Morrison-Woodbury formula 证明

文章目录 1. 公式2. 证明 1. 公式 M I − u v T ⇒ M − 1 I u v T 1 − v T u (1) MI-uv^T\Rightarrow M^{-1}I\frac{uv^T}{1-v^Tu}\tag{1} MI−uvT⇒M−1I1−vTuuvT​(1) 2. 证明 定义矩阵E表示如下&#xff1a; E [ I u v T 1 ] , D 1 − v T u (2) E\begin{bmatrix…

js手动实现unshift

js 手动实现数组的unshift unshift是什么&#xff1f; unshift() 方法可向数组的开头添加一个或更多元素&#xff0c;并返回新的长度。 注意&#xff1a; 该方法将改变数组的数目。 语法&#xff1a; array.unshift(item1,item2, ..., itemX)代码实现 首先&#xff0c;在…

【2】STM32·FreeRTOS·任务创建和删除

目录 一、任务创建和删除的API函数 1.1、动态创建任务函数 1.2、静态创建任务函数 1.3、任务删除函数 二、任务创建和删除&#xff08;动态方法&#xff09; 三、任务创建和删除&#xff08;静态方法&#xff09; 一、任务创建和删除的API函数 任务的创建和删除本质就是…

Flutter笔记:手动配置VSCode中Dart代码自动格式化

Flutter笔记 手动配置VSCode中Dart代码自动格式化 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csd…

数据结构学习——线性表、顺序表

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一…

Jpa自定义查询结果封装到实体

工具类 import cn.hutool.core.convert.Convert; import cn.hutool.core.text.CharSequenceUtil;import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import java.util.Map;/*** 查询结果集转换工具类 …

在WPS表格(Excel)中,每10行增加一个特定的值

注&#xff1a;如下为WPS表格操作演示 例如1&#xff0d;15的数值是1&#xff0c;16-30就变为2&#xff0c;31-45就变为3&#xff0c;类推&#xff01; 1、在B1单元格输入一个起始值&#xff0c;B2单元格输入公式IF(MOD(ROW(),15)0,B11,B1) 然后鼠标放到B2单元格右下角小点处&…

利用生成式AI重新构想ITSM的未来

对注入 AI 的生成式 ITSM 的需求&#xff0c;在 2023 年 Gartner AI 炒作周期中&#xff0c;生成式 AI 达到预期值达到顶峰后&#xff0c;三分之二的企业已经将生成式 AI 集成到其流程中。 你问为什么这种追求&#xff1f;在预定义算法的驱动下&#xff0c;IT 服务交付和管理中…