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.rhkb.cn/news/319627.html

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

相关文章

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习四

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

支付宝支付流程

第一步前端&#xff1a;点击去结算&#xff0c;前端将商品的信息传递给后端&#xff0c;后端返回一个商品的订单号给到前端&#xff0c;前端将商品的订单号进行存储。 对应的前端代码&#xff1a;然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

【JavaEE 初阶(一)】初识线程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.进程3.线程4.线程和进程的区别5.Thread创建线程5.1继承Thread创建线程5.2实现R…

从零开始:Django项目的创建与配置指南

title: 从零开始&#xff1a;Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tags: DjangoWebDevPythonORMSecurityDeploymentOptimization Django简介&#xff1a; Django是一个开源的高级Python Web框架&#xff…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

Delta lake with Java--使用stream同步数据

今天继续学习Delta lake Up and Running 的第8章&#xff0c;处理流数据&#xff0c;要实现的效果就是在一个delta表&#xff08;名为&#xff1a;YellowTaxiStreamSource&#xff09;插入一条数据&#xff0c;然后通过流的方式能同步到另外一个delta表 &#xff08;名为&#…

LeetCode题练习与总结:分隔链表--86

一、题目描述 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2]…

神经网络的优化器

神经网络的优化器是用于训练神经网络的一类算法&#xff0c;它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用&#xff1a; 参数更新&#xff1a;优化器通过计算损失函数相对于权重参数的…

ngrinder项目-本地调试遇到的坑

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

从零开始学AI绘画,万字Stable Diffusion终极教程(二)

【第2期】关键词 欢迎来到SD的终极教程&#xff0c;这是我们的第二节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在第一节课里面&#xff0c;我们…

(六)SQL系列练习题(下)#CDA学习打卡

目录 三. 查询信息 16&#xff09;检索"1"课程分数小于60&#xff0c;按分数降序排列的学生信息​ 17&#xff09;*按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 18&#xff09;*查询各科成绩最高分、最低分和平均分 19&#xff09;*按各科成绩…

总分420+专业140+哈工大哈尔滨工业大学803信号与系统和数字逻辑电路考研电子信息与通信工程,真题,大纲,参考书。

考研复习一路走来&#xff0c;成绩还是令人满意&#xff0c;专业803信号和数电140&#xff0c;总分420&#xff0c;顺利上岸&#xff0c;总结一下自己这一年复习经历&#xff0c;希望大家可以所有参考&#xff0c;这一年复习跌跌拌拌&#xff0c;有时面对压力也会焦虑&#xff…

【iOS】KVC

文章目录 前言一、KVC常用方法二、key与keypath区别key用法keypath用法 三、批量存值操作四、字典与模型相互转化五、KVC底层原理KVC设值底层原理KVC取值底层原理 前言 KVC的全称是Key-Value Coding&#xff0c;翻译成中文叫做键值编码 KVC提供了一种间接访问属性方法或成员变…

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

杭电acm2018 母牛的故事 Java解法 经典递归

标准递归题 先模拟 接着找递归出口 再找递归通式 想想看 今天的母牛等于前一天的母牛数加上今天出生的母牛 而三天前的母牛所有母牛都能生一头 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);l…

【计算机网络】计算机网络的定义和分类

一.定义 计算机网络并没有一个精确和统一的定义&#xff0c;在计算机网络发展的不同阶段&#xff0c;人们对计算机网络给出了不同的定义&#xff0c;这些定义反映了当时计算机网络技术的发展水平。 例如计算机网络早期的一个最简单定义&#xff1a;计算机网络是一些互连的、自…

云手机对出海企业有什么帮助?

近些年&#xff0c;越来越多的企业开始向海外拓展&#xff0c;意图发掘更广阔的市场。在这过程中&#xff0c;云手机作为一个新型工具为很多企业提供了助力&#xff0c;尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先&#xff0c;云手机的出现解决了企业在海外拓…

线阵相机和面阵相机简介

线阵相机 线阵相机&#xff0c;顾名思义就是所探测的物体要在一个很长的界面上。线阵相机的传感器只有一行感光像素&#xff0c;所以线阵相机一般具有非常高的扫描频率和分辨率。 线阵相机特点 线阵相机使用的线扫描传感器通常只有一行感光单元&#xff08;少数彩色线阵使用…

OpenCV 为轮廓创建边界框和圆(62)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV检测凸包(61) 下一篇 :OpenCV如何为等值线创建边界旋转框和椭圆(62) ​ 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::boundingRect使用 OpenCV 函数 cv::mi…