MyBatis04:SpringBoot整合MyBatis——多表关联|延迟加载|MyBatisX插件|SQL注解

目录

一、多表关联

1、数据库表结构

2、javaBean类

3、mapper接口

4、sqlMapper文件

5、测试

二、延迟加载

1、解决什么问题

2、嵌套查询

3、延迟加载

三、逆向工程MybatisX插件

1、下载插件

1. 通过 JetBrains 插件市场下载(推荐)

2. 手动下载(备用)

四、SQL注解(这个方法是MybatisX的方法,不使用sqlmapper文件映射,直接通过注解在java文件里面写sql语句,没有实现sql语句与java分离的初衷)


一、多表关联

1、数据库表结构

create table king(id int primary key auto_increment,name char(32)
);
​
create table queen(id int primary key auto_increment,name char(32),k_id int 
);
​
create table consort(id int primary key auto_increment,name char(32),k_id int 
);
​
insert into king(name) values ('拉玛十世'),('乾隆');
insert into queen(name,k_id) values ('苏提达',1),('富察氏',2);
insert into consort(name,k_id) values ('诗妮娜1号',1),('诗妮娜2号',1),('令妃',2),('香妃',2);select * from queen;        
select * from consort;      

2、javaBean类

@Data
public class King {private Integer id;private String name;//一对一映射private Queen queen;//王后对象//一对多映射private List<Consort> list;//妃子集合
}

3、mapper接口

@Mapper
public interface KingMapper {public List<King> getKings();
}

4、sqlMapper文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.KingMapper"><!--     public List<King> getKings();--><select id="getKings" resultMap="map1">select king.*,queen.id as qid,queen.name as qname,queen.k_id,c.id as cid,c.name as cname,c.k_id as ck_idfrom kingjoin queen on king.id = queen.k_idjoin consort c on king.id = c.k_id</select><!--type="预期的最终返回值类型"  autoMapping="true"开启结果集自动映射--><resultMap id="map1" type="King" autoMapping="true"><id property="id" column="id"></id><!--手动结果集映射-->
<!--        <result property="name" column="name"></result>--><!--一对一映射--><association property="queen" javaType="Queen"><!--给Queen类的属性赋值--><id property="id" column="qid"></id><result property="name" column="qname"></result><result property="kId" column="k_id"></result></association><!--一对多映射 autoMapping="true"自动映射  columnPrefix="c" 针对列名添加前缀--><collection property="list" ofType="Consort" autoMapping="true" columnPrefix="c"><id property="id" column="id"></id>
<!--            <id property="id" column="cid"></id>-->
<!--            <result property="name" column="cname"></result>-->
<!--            <result property="kId" column="ck_id"></result>--></collection></resultMap>
</mapper>

5、测试

二、延迟加载

多张表相关联情况下

1、解决什么问题

延迟加载主要用于解决嵌套查询的效率问题。

只针对嵌套查询。

2、嵌套查询

一个查询调用另一个查询。通过王后查国王,再通过国王查妃子

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.QueenMapper"><!--public List<Queen> getQueens();--><!--查询王后信息--><select id="getQueens" resultMap="map1">select * from queen</select><!--  fetchType="eager" 数据的抓取策略:立即加载 延迟加载--><resultMap id="map1" type="Queen" autoMapping="true"><id property="id" column="id"></id><association property="king" javaType="King"fetchType="lazy"select="findKing" column="k_id"></association><collection property="list" ofType="Consort"fetchType="lazy"select="selectConsort" column="k_id"></collection></resultMap><!--根据王后表中的国王id,找到国王信息--><select id="findKing" resultType="King">select * from king where id = #{id}</select><!--根据国王id,找到妃子集合--><select id="selectConsort" resultType="Consort">select * from consort where k_id = #{kId}</select>
</mapper>

3、延迟加载

当我们不需要另一个查询时,该查询先不执行。

当我们需要另一个查询的数据时,再执行该查询。

需要??:当我们访问这个关联属性时,进行查询;不访问关联属性时,不执行查询。

select="sql语句唯一标识" 嵌套查询

fetchType="eager" 立即加载

fetchType="lazy" 延迟加载,懒(延迟)加载要求所对应的类(javabean)以及相关类实现序列化接口Serializable 

@Data
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class Queen implements Serializable {private Integer id;private String name;private Integer kId;//国王id
​//一对一private King king;//间接  一对多private List<Consort> list;
}
@Mapper
public interface QueenMapper {public List<Queen> getQueens();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hl.mybatis03.mapper.QueenMapper"><!--public List<Queen> getQueens();--><!--查询王后信息--><select id="getQueens" resultMap="map1">select * from queen</select><!--  fetchType="eager" 数据的抓取策略:eager立即加载 lazy延迟加载 : 使用数据时查询(比如return返回时json序列化,或者debug模式看数据内容)--><resultMap id="map1" type="Queen" autoMapping="true"><id property="id" column="id"></id><association property="king" javaType="King"fetchType="lazy"select="findKing" column="k_id"></association><collection property="list" ofType="Consort"fetchType="lazy"select="selectConsort" column="k_id"></collection></resultMap><!--根据王后表中的国王id,找到国王信息--><select id="findKing" resultType="King">select * from king where id = #{id}</select>
​<!--根据国王id,找到妃子集合--><select id="selectConsort" resultType="Consort">select * from consort where k_id = #{kId}</select>
</mapper>

三、逆向工程MybatisX插件

1、下载插件

下载和安装 MybatisX 的地址和方法:

1. 通过 JetBrains 插件市场下载(推荐)

  • 在 IntelliJ IDEA 中直接安装

    1. 打开 IDEA,进入 FileSettingsPlugins

    2. 搜索 MybatisX,点击 Install 安装。

    3. 重启 IDEA 生效。

  • JetBrains 插件市场地址: MybatisX on JetBrains Marketplace

2. 手动下载(备用)

  • 如果无法通过 IDEA 直接安装,可以从 JetBrains 插件市场下载 .jar 文件:

    1. 访问上述链接,点击 Download 获取最新版本的 .jar

    2. 在 IDEA 的 Plugins 界面选择 Install Plugin from Disk,上传下载的 .jar 文件。

四、SQL注解(这个方法是MybatisX的方法,不使用sqlmapper文件映射,直接通过注解在java文件里面写sql语句,没有实现sql语句与java分离的初衷)

@Insert
@Options

@Update
@Delete
@Select

@Results
@Result
@One
@Many

package com.hl.mybatis03.mapper;import com.hl.mybatis03.pojo.Consort;
import com.hl.mybatis03.pojo.King;
import org.apache.ibatis.annotations.*;import java.util.List;
@Mapper
public interface ConsortMapper {@Select("select * from consort")public List<Consort> listAll();@Insert("insert into consort(name,k_id) values (#{name},#{kId})")//返回自增主键@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")public int save(Consort consort);@Update("update consort set name=#{name},k_id=#{kId} where id=#{id}")public int update(@Param("id") Integer id, @Param("name") String name, @Param("kId") Integer kId);@Delete("delete from consort where id=#{id}")public int delete(Integer id);//关联妃子和王国@Select("select * from consort")@Results(value = {@Result(id = true,property = "id",column = "id"),@Result(property = "name",column = "name"),@Result(property = "king",javaType = King.class, column = "k_id",one=@One(select = "com.hl.mybatis03.mapper.ConsortMapper.getKingById"))})public List<Consort> list();@Select("select * from king where id=#{id}")public King getKingById(Integer id);}

作业

创建 用户类、角色类

用户表(id,username,phone,role_id)

zhangsan

lisi

角色表(id,name)

超级管理员

普通管理员

财务人员

市场人员

1)通过用户,查询当前用户信息和相关的角色信息

一对一

方式一:两张表join连接查询,相关数据(xml)

方式二:嵌套查询(xml、sql注解)

方式三:嵌套查询(sql注解)

2)通过角色,查询角色名和想的所有用户列表

一对多

方式一:两张表join连接查询,相关数据(xml)

方式二:嵌套查询(xml、sql注解)

方式三:嵌套查询(sql注解)

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

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

相关文章

PySpark、Plotly全球重大地震数据挖掘交互式分析及动态可视化研究

全文链接&#xff1a;https://tecdat.cn/?p42455 分析师&#xff1a;Yapeng Zhao 在数字化防灾减灾的时代背景下&#xff0c;地震数据的深度解析成为公共安全领域的关键议题。作为数据科学工作者&#xff0c;我们始终致力于通过技术整合提升灾害数据的应用价值&#xff08;点击…

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…

MVC与MVP设计模式对比详解

MVC&#xff08;Model-View-Controller&#xff09;和MVP&#xff08;Model-View-Presenter&#xff09;是两种广泛使用的分层架构模式&#xff0c;核心目标是解耦业务逻辑、数据和界面&#xff0c;提升代码可维护性和可测试性。以下是它们的对比详解&#xff1a; MVC 模式&…

Node.js 项目调试指南

Node.js 项目调试指南 &#x1f9ed; 一、调试工具和方式总览 方式难度场景说明console.log 调试★简单问题定位最常见&#xff0c;但效率低debug 模块★★模块化输出日志支持命名空间的调试日志VSCode 断点调试★★★跟踪函数调用、变量状态推荐使用node inspect / ndb★★★…

Spring Boot 启动流程及配置类解析原理

Spring Boot 是一个基于 Spring 框架的开源框架&#xff0c;旨在简化 Spring 应用的配置和部署。通过提供约定优于配置的原则&#xff0c;Spring Boot 大大降低了 Java 企业级应用的开发复杂度。本文将详细介绍 Spring Boot 的启动流程及其配置类的解析原理&#xff0c;帮助开发…

Flask 核心概念速览:路由、请求、响应与蓝图

一、路由参数与请求方法 Flask 路由允许定义多种参数类型,并通过 methods 属性限制请求方法。 1. 路由参数类型: 除了默认的 string,Flask 还支持: int: 匹配整数,自动转换为 Python int 类型。非数字输入会返回 404。 float: 匹配浮点数,自动转换为 Python float 类型…

Beckhoff(倍福)PLC 顺控程序转换条件解读

一、请求机器人上件步 二、程序代码解释:1、程序代码1&#xff1a; 1、程序代码&#xff1a; fbVar_TonDelay2(IN : (bInPartPresentLeft AND bInPartPresentRight), PT : T#100MS);(* Go to the next step *) stVar_SEQ.bTOK : stVar_SEQ.bRELEASE AND(stGV_SYS_ELEMENTS.ar…

KITTI数据集(计算机视觉和自动驾驶领域)

KITTI&#xff08;Karlsruhe Institute of Technology and Toyota Technological Institute at Chicago&#xff09;数据集是计算机视觉和自动驾驶领域中最广泛使用的基准数据集之一。它由德国卡尔斯鲁厄理工学院和美国芝加哥丰田技术研究所联合发布&#xff0c;旨在推动自动驾…

echarts在uniapp中使用安卓真机运行时无法显示的问题

文章目录 一、实现效果二、话不多说&#xff0c;上源码 前言&#xff1a;我们在uniapp中开发的时候&#xff0c;开发的时候很正常&#xff0c;echarts的图形在h5页面上也是很正常的&#xff0c;但是当我们打包成安卓app或者使用安卓真机运行的时候&#xff0c;图形根本就没有渲…

C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型

MindFusion.Diagramming框架 在C#中使用MindFusion.Diagramming.dll库来创建图表和图形界面&#xff0c;可以让你构建出丰富和交互式的图形应用。MindFusion.Diagramming 是一个强大的库&#xff0c;支持创建各种类型的图表&#xff0c;例如流程图、网络图、组织结构图等。 M…

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…

Spring Boot项目中JSON解析库的深度解析与应用实践

在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为轻量级的数据交换格式&#xff0c;已成为前后端通信的核心桥梁。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供了对多种JSON库的无缝集成支持。本文将深入探讨Spring B…

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流&#xff08;Dens…

视觉分析在人员行为属性检测中的应用

基于视觉分析的人员行为属性检测方案 一、背景与需求分析 在工业生产、建筑施工、公共安全等领域&#xff0c;人员行为属性的合规性检测是保障安全生产的关键环节。例如&#xff0c;工地工人未佩戴安全帽、厨房人员未佩戴手套、作业现场人员使用手机等行为&#xff0c;均可能…

Linux--进程的程序替换

问题导入&#xff1a; 前面我们知道了&#xff0c;fork之后&#xff0c;子进程会继承父进程的代码和“数据”&#xff08;写实拷贝&#xff09;。 那么如果我们需要子进程完全去完成一个自己的程序怎么办呢&#xff1f; 进程的程序替换来完成这个功能&#xff01; 1.替换原理…

场景题-3

如何实现一个消息队列 拆解分析主流的几种消息队列 1、基本架构 生产者Producer、消费者Consumer、Broker&#xff1a;生产者发送消息&#xff0c;消费者接受消息&#xff0c;Broker是服务端&#xff0c;处理消息的存储、备份、删除和消费关系的维护。 主题和分区&#xff…

vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死

今天在运行项目时&#xff0c;发现如下问题&#xff1a; 开始以为是node_modules依赖的问题&#xff0c;于是重新 npm install&#xff0c;重启项目后还是未解决。 在网上找了一圈发现有人说是 require引入图片地址没有写。在我的项目中排查没有这个问题&#xff0c;最后发现某…

73 LV的使用(XFS文件系统)

四 LV的使用 先创建一个LV01 lvcreate -L 10G lv01 datavg Logical volume "lv01" created. 将创建出来的LV01进行格式化 mkfs.xxx LV的名称(绝对路径) 绝对路径的组成:/dev/你创建VG的名字/LV的名字 mkfs.xfs /dev/datavg/lv01 挂载你的LV…

mybatis中判断等于字符串的条件怎么写

mybatis中判断等于字符串的条件怎么写_mybatis 等于字符串-CSDN博客 因为mybatis映射文件&#xff0c;是使用的ognl表达式&#xff0c;ognl是java语言&#xff08;强类型语言&#xff09;&#xff0c;会把‘X’解析成字符&#xff0c;而不是字符串。 所以比较字符串相等使用是…

C语言实现绝对值差值函数

在C语言中&#xff0c;可以编写一个函数来计算两个数的差值的绝对值。以下是一个简单的实现&#xff1a; #include <stdio.h> #include <stdlib.h> // 用于abs函数&#xff08;如果需要&#xff09; // 方法1&#xff1a;使用标准库函数 int absoluteDifference1…