[ Mybatis 多表关联查询 ] resultMap

目录

一. resultMap

     1. 使用场景: 

     2. 查询映射:

(1)单表查询映射:

(2)多表查询映射:

     a. 在学生表里查专业   

     b. 在专业表里查学生 

二.  其他注意事项

     1. 插件下载

     2. #{  } 和 ${  }的区别


一. resultMap

     1. 使用场景: 

       (1)当数据库列名和java类中的属性名不同时,可⽤ resultMap 配置映射 (下列代码中有举例);

       (2)在单表查询多表查询中可以使⽤, resultMap 映射并查询数据

     2. 查询映射:

      (1)单表查询映射:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 专门写SQL语句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><!--resultMap标签:对数据库中的列名和java类中的属性名进行映射 常用在多表--><resultMap id="adminMap" type="Admin"><!--数据库列名(column)   java类中的属性名(property)--><id column="id" property="id"/><!--映射主键使用id标签--><result column="account" property="account"/><result column="password" property="password"/><result column="gender" property="gender"/></resultMap><select id="findAdmins" parameterType="string" resultMap="adminMap">select id,account,age as adminAge from admin order by ${col}  desc</select></mapper>

  注意:  只有数据库列名和java类中的属性名相同时才会自动映射

            而使用resultMap相当于手动匹配,即使名称不一样也会映射

            使用as起别名让二者名称相同,也可以自动映射

 (2)多表查询映射

     a. 在学生表里查专业   

        注意看图 , 图很重要 ! 

       在查询时,会遇到多表关联,例如 在查询学生信息表时,会关联专业表(id,major,info) , 课程表(id,class,info)...当关联的数据很多时,在创建类的时候,需要定义的属性(专业id,专业major,专业info,课程id,课程class,课程info)就会很多,为了减少冗余,我们可以把每个数据表看成一个对象,这个对象里面包含了各自的属性

package mybatispro.model;public class Student {private  int id;private int num;private String name ;private String gender;private String phone;private Major major;//学生关联专业/*关联表中的数据,在设计类时,不建议把关联类中的属性,在本类中再定义一遍,减少冗余private Major major;private String mname;*/public int getId() {return id;}public void setId(int id) {this.id = id;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Major getMajor() {return major;}public void setMajor(Major major) {this.major = major;}@Overridepublic String toString() {return "Student{" +"id=" + id +", num=" + num +", name='" + name + '\'' +", gender='" + gender + '\'' +", phone='" + phone + '\'' +", major=" + major +'}';}
}
package mybatispro.dao;
import mybatispro.model.Student;
import java.util.ArrayList;public interface StudentDao {Student findStudentById(int id);ArrayList<Student> findStudents();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 专门写SQL语句的文件-->
<mapper namespace="mybatispro.dao.StudentDao"><!-- 多表关联查询时,需要自定义映射关系 -->
<resultMap id="studentMap" type="Student"><id property="id" column="id"/><result property="num" column="num"/><result property="name" column="name"/><result property="gender" column="gender"/><result property="phone" column="phone"/><!-- 关联表数据映射--><association property="major" javaType="Major"><!--association相当于创建一个major对象,这个对象里面封装了major的所有属性--><!-- property(java类中的属性名)  javaType(属性名对应的类型名) column(数据库列名)--><id column="mid" property="id"/><result column="mname" property="name"/></association>
</resultMap><!--查所有学生信息--><select id="findStudents" resultMap="studentMap">selects.id,s.num,s.name,s.gender,s.phone,m.id as mid ,m.name as mnamefrom student s inner join major m on s.majorid= m.id</select><!--查单个学生信息 通过id--><select id="findStudentById"  parameterType="int" resultMap="studentMap">selects.id,s.num,s.name,s.gender,s.phone,m.id as mid,m.name as mnamefrom student s inner join major m on s.majorid= m.idwhere s.id =#{id}</select>
</mapper>
package mybatispro.test;import mybatispro.dao.StudentDao;
import mybatispro.model.Student;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;public class TestStudent {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();StudentDao studentDao =sqlSession.getMapper(StudentDao.class);//查单个学生信息Student  student = studentDao.findStudentById(3);System.out.println(student);//获取学生信息System.out.println(student.getId());System.out.println(student.getName());//获取专业信息,需要先获得专业对象System.out.println(student.getMajor().getName());System.out.println(student.getMajor().getId());/*查所有学生信息ArrayList<Student> students =  studentDao.findStudents();System.out.println(students);*/sqlSession.close();}
}
     b. 在专业表里查学生 

         注意看图 , 图很重要 !

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 专门写SQL语句的文件-->
<mapper namespace="mybatispro.dao.MajorDao"><resultMap id="majorMap" type="Major"><id column="id" property="id"/><result column="name" property="name"/><!--用来接收多个对象,将多个对象封装到集合中--><collection property="students" javaType="arrayList" ofType="Student"><id column="sid" property="id"/><result column="sname" property="name"/><result column="num" property="num"/></collection></resultMap><select id="findMajorById" parameterType="int"  resultMap="majorMap">selectm.id,m.name,s.id as sid,s.name as sname,s.numfrommajor minner join student son m.id = s.majoridwhere m.id = #{id}</select>
</mapper>
package mybatispro.dao;import mybatispro.model.Major;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;public interface MajorDao {Major findMajorById(int id);/*当SQL语句很简单时,就不需要写在对应的xml文件当中,直接在接口中使用@Insert等注解标签就行复杂的额SQL建议鞋子xml文件中*/@Insert("insert into major(name) value(#{name})")int insertMajor(Major major);@Delete("delete from major where id=#{id}")int deleteMajor(int id);}
package mybatispro.model;import java.util.ArrayList;public class Major {private int id;private String name;private ArrayList<Student> students; //一个专业对应(关联)多个学生public ArrayList<Student> getStudents() {return students;}public void setStudents(ArrayList<Student> students) {this.students = students;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Major{" +"id=" + id +", name='" + name + '\'' +", students=" + students +'}';}
}
package mybatispro.test;import mybatispro.dao.MajorDao;
import mybatispro.model.Major;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;public class TestMajor {public static void main(String[] args) throws IOException {SqlSession  sqlSession = MybatisUtil.getSqlSession();MajorDao majorDao = sqlSession.getMapper(MajorDao.class);/*  Major major = majorDao.findMajorById(1);System.out.println(major);*//*简单语句---添加Major major = new Major();major.setName("数学");majorDao.insertMajor(major);*///简单语句---删除majorDao.deleteMajor(6);sqlSession.commit();sqlSession.close();}
}

二.  其他注意事项

     1. 插件下载

           使用这个插件点左侧的鸟可以在dao和对应的mapper之间快速定位切换,提高效率

 插件也可以从自己的电脑硬盘上导入,选择自己下载好的插件

2. #{  } 和 ${  }的区别

#{变量}   使用预编译的方式,先在SQL中占位,之后再赋值,可以防止SQL注入,是安全的 一般传递的是(账号 密码 姓名)

${变量}   直接将值拼接到SQL中,容易出现SQL注入现象,不安全 写法上需要加单引号 account = $'{account}'   一般传递的是列名,在某些 列排序时(价格 时间...) 比较方便  order by ${col} desc


 

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

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

相关文章

Rust 性能提升“最后一公里”:详解 Profiling 瓶颈定位与优化|得物技术

一、Profiling&#xff1a;揭示性能瓶颈的“照妖镜”在过去的一年里&#xff0c;我们团队完成了一项壮举&#xff1a;将近万核的 Java 服务成功迁移到 Rust&#xff0c;并收获了令人瞩目的性能提升。我们的实践经验已在《RUST练习生如何在生产环境构建万亿流量》一文中与大家分…

STM32H5 的 PB14 引脚被意外拉低的问题解析 LAT1542

关键字&#xff1a;STM32H5&#xff0c; GPIO 1. 问题现象 客户反馈&#xff0c;使用 STM32H523RET6 应用中配置了两个 IO 口&#xff0c;PC9 为输出模式&#xff0c;内部下拉&#xff1b;PB14 为输入模式&#xff0c;内部上拉。在程序中将 PC9 引脚输出高电平&#xff0c;结…

【办公自动化】如何使用Python让Word文档处理自动化?

在日常办公中&#xff0c;Word文档是最常用的文本处理工具之一。通过Python自动化Word文档操作&#xff0c;可以大幅提高工作效率&#xff0c;减少重复劳动&#xff0c;特别适合批量生成报告、合同、简历等标准化文档。本文将介绍几种常用的Python操作Word文档的方法&#xff0…

顺序表的总结及模拟实现

目录 一.线性表 二.顺序表 1.概念 2.结构 3.要实现的接口函数 三.模拟实现顺序表 1.定义出顺序表的基本结构 2.实现检查扩容功能 3.实现尾插 4.实现尾删 5.实现头插和头删 6.查找 7.修改 8.遍历 9.在指定位置插入和删除 四.顺序表的优缺点及思考 a.顺序表的弊端 …

Vue3 vs Vue2:全面对比与面试宝典

文章目录Vue3 vs Vue2&#xff1a;全面对比与面试宝典引言&#xff1a;Vue框架的进化之路一、核心架构对比二、响应式系统的革命Vue2的响应式&#xff1a;像老式监控摄像头Vue3的响应式&#xff1a;像智能AI监控系统三、API风格的进化Vue2的Options API&#xff1a;像填表格Vue…

Java Web开发:Session与Cookie详细入门指南

在Web开发中&#xff0c;状态管理是核心需求之一。本文将深入讲解Java中Session和Cookie的使用方法&#xff0c;帮助你掌握用户状态管理的核心技术。 一、Session与Cookie基础概念 特性SessionCookie存储位置服务器内存/持久化存储客户端浏览器安全性较高&#xff08;敏感数据…

HTTPS与CA证书:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;证书颁发机构&#xff0c;负责签发和管理数字证书&#xff0c;验证证书持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 协议的 HTTP&#xff0c;通过证书实现客户端与服务器的身份验证和数据加密。HTTPSHTTPSSL/TLS…

AI生成代码时代的商业模式重构:从“软件即产品”到“价值即服务”

2025年,全球AI代码生成市场规模突破63亿元(数据来源:《中国AI代码生成行业发展报告》),开发者效率提升40%以上,软件开发成本下降30%。这一技术浪潮正在颠覆传统软件行业的商业逻辑——当代码生成变得像文字编辑一样简单时,企业如何构建可持续的商业模式? 本文将从硬件…

C#特性与反射知识梳理

C#中的**特性&#xff08;Attributes&#xff09;和反射&#xff08;Reflection&#xff09;**是两个非常重要的概念&#xff0c;它们通常用于代码的元编程&#xff0c;允许你在运行时获取类型信息并对其进行操作。下面对这两个概念进行详细梳理&#xff1a;一、C#中的特性&…

SQL 语法详解

SQL 语法详解 引言 SQL&#xff08;Structured Query Language&#xff09;是一种用于数据库管理的标准语言&#xff0c;它允许用户进行数据的查询、更新、插入和删除等操作。SQL语法是数据库管理和编程的基础&#xff0c;本篇文章将详细介绍SQL的基本语法和常用操作&#xff0…

为什么 sim(3) 中的尺度 s 与旋转 R 相乘,而不是平移 t?

文章目录为什么 sim(3) 中的尺度 s 与旋转 R 相乘&#xff0c;而不是平移 t&#xff1f;1️⃣ sim(3) vs SE(3)&#xff1a;结构对比与核心差异2️⃣ 为什么尺度 s 不乘在 t 上&#xff1f;&#x1f6ab; 数学破坏&#xff1a;&#x1f9ed; 几何解释&#xff1a;3️⃣ t 是“相…

如何为你的 Docker 容器设置代理网络

一文搞定!如何为你的 Docker 容器设置代理网络(及一个最常见的“坑”) 你是否遇到过这样的窘境:在你的服务器上,代理工具(比如 Clash, V2Ray)运行得好好的,浏览器也能科学上网,但一旦把应用放进 Docker 容器,它就瞬间“失联”,无法访问外部世界? 别担心,这是每个…

LeetCode Day3 -- 哈希表

目录 1. 啥是哈希表&#xff1f; 2. 啥时候用哈希表&#xff1f; 2.1 存在性检查 → 集合Set 2.2 键值映射 → 字典Dict 2.3 频率统计 → Dict or Counter 3. LeetCode 3.1 集合 &#xff08;1&#xff09;2215 找出两数组的不同 &#xff08;2&#xff09;1207 独一无…

三子棋装置(电赛24E题)K230/STM32全开源

三子棋装置&#xff08;电赛24E题&#xff09;K230/STM32全开源&#xff0c;后续有具体代码参数讲解&#xff0c;帮助大家移植k230代码import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

终端安全检测与防御

1. 终端安全风险主要问题&#xff1a;企业网络中80%的安全事件源于终端&#xff0c;终端成为黑客攻击的重要目标。攻击手段&#xff1a;勒索病毒&#xff1a;直接勒索用户。横向渗透&#xff1a;通过受控终端攻击内部服务器。僵尸网络危害&#xff1a;信息窃取、钓鱼网站引导、…

Video_AVI_Packet(2)

博主声明&#xff1a;内容来自网络&#xff0c;仅供参考&#xff0c;仅适用于浅了解&#xff0c;如有错误&#xff0c;自行甄别&#xff0c;由此引起的后果概不负责 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 与 Active Format Aspect Ratio1.…

八月补丁星期二:微软修复 111 个漏洞

微软将在2025 年 8 月补丁星期二修复 111 个漏洞&#xff0c;这一数量与近期平均水平大致相同。 与上个月的情况类似&#xff0c;微软知道今天发布的漏洞中只有一个已被公开披露&#xff0c;但声称没有证据表明存在野外利用。同样&#xff0c;截至发布时&#xff0c;唯一的补丁…

《C++进阶之继承多态》【普通类/模板类的继承 + 父类子类的转换 + 继承的作用域 + 子类的默认成员函数】

【普通类/模板类的继承 父类&子类的转换 继承的作用域 子类的默认构造函数】目录前言&#xff1a;------------------------一、继承的定义和使用1. 什么使继承&#xff1f;2. 为什么要引入继承&#xff1f;3. 怎么使用继承&#xff1f;① 父类&#xff08;基类&#xf…

Ubuntu22.04安装OBS Studio

OBS官网的最新的虽然支持Ubuntu系统&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的电脑上的Ubuntu的版本是22.04&#xff0c;所以在网上寻求解决办法&#xff0c;看到了这一片博客&#xff0c;作为参考来实现ubuntu22.04安装OBS&#xff0c;这里提示一下&#xff0…

Ansible 基本使用

Ansible 清单 静态主机清单 主机清单支持多种格式&#xff0c;例如ini、yaml、脚本等。 本次课程使用 ini 格式。 #创建主机清单[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4​#测试连接单个服务器[lykcontroller ~ 14:08:18]$ ansibl…