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值# 如果飞船右移的标志和飞船外接…

射频无源器件之电桥

一. 电桥的定义及作用 电桥主要用于实现微波大功率功放系统的功率合成分配,信号采集等功能,被广泛应用于中国及全球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>当…

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;将之改成没有的字体就行了。 可以看…

用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镜…

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;也就说是连续的一…

在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 服务交付和管理中…

第七届机电、机器人与自动化国际会议(ICMRA 2024)即将召开!

第七届机电、机器人与自动化国际会议&#xff08;ICMRA 2024&#xff09;将于2024年9月20日-22日在中国武汉举行。ICMRA 2024为各国专家学者提供一个学术交流的平台&#xff0c;讨论机电、机器人和自动化领域的最新研究成果和未来的研究方向&#xff0c;旨在能够建立起国家间&a…

Ansible剧本playbook之--------Templates 模块、roles角色详细解读

目录 一、Templates 模块 1.1准备模板文件并设置引用的变量 1.2修改主机清单文件&#xff0c;使用主机变量定义一个变量名相同&#xff0c;而值不同的变量 1.3编写 playbook 1.4ansible主机远程查看修改参数 1.5验证 二、tags 模块 always应用 三、Roles 模块 3.1ro…

在国企分公司做信息宣传新闻投稿的经验分享

作为一名国企分公司的信息宣传工作者,我亲历了从传统投稿方式到数字化转型的全过程,这段经历既充满了挑战,也收获了成长。回首最初的日子,那些用邮箱投稿的时光,至今仍让我感慨万千。 初尝辛酸,邮箱投稿的艰难岁月 刚接手信息宣传工作时,我满腔热情,却很快被现实的冷水浇了个透…

RabbitMQ的五种模式

一、简单模式 简单模式&#xff08;Simple&#xff09;&#xff1a;一个生产者&#xff0c;一个消费者 package com.qiangesoft.rabbitmq.mode.simple;import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframe…

事业单位向媒体投稿发文章上级领导交给了我投稿方法

作为一名事业单位的普通职员,负责信息宣传工作,我见证了从传统投稿方式到智能化转型的全过程,这段旅程既是一次挑战,也是一次宝贵的成长。回想起初涉此领域的日子,那些通过邮箱投稿的时光,至今仍然历历在目,其中的酸甜苦辣,构成了我职业生涯中一段难忘的经历。 邮箱投稿:费时费…

C++从入门到精通---模版

文章目录 泛型编程函数模版模版参数的匹配原则类模版类模版的定义格式类模版的实例化 总结 泛型编程 泛型编程是一种编程范式&#xff0c;旨在实现通用性和灵活性。它允许在编写代码时使用参数化类型&#xff0c;而不是具体的类型&#xff0c;从而使代码更加灵活和可重用。 在…

spring ioc 容器加载过程 refresh() 方法详解

IOC 加载过程 从 new ClassPathXmlApplicationContext开始 ApplicationContext context new ClassPathXmlApplicationContext("classpath:application.xml");ClassPathXmlApplicationContext类构造方法 public ClassPathXmlApplicationContext(String[] configLo…

Redis集群分片

什么是集群 集群是由多个复制集组成的,能提供在多个redis节点间共享数据的程序集 简而言之就是将原来的单master主机拆分为多个master主机,将整个数据集分配到各主机上 集群的作用 集群中可以存在多个master,而每个master可以挂载多个slave自带哨兵的故障转移机制,不需要再去…