Mybatis系列课程-一对一

目标

学会使用 assocation的select 与column 属性

select:设置分步查询的唯一标识
column:将查询出的某个字段作为分步查询的下一个查询的sql条件

 

步骤

第一步:修改Student.java 增加 

private Grade grade;  // 如果之前已经增加过, 跳过这步

 第二步:修改StudentMapper.java  增加

/**
 * 查询学生信息的同时,查询出来 年级名称
 * @return
 */
List<Student> queryWithGrade2();
package mapper;

import entity.Student;

import java.util.List;

public interface StudentMapper {
    /**
     * 查询全部
     * @return  返回数据库中所有学习信息
     */
    List<Student> findAll();

    /**
     * 按照主键查询学生信息
     * @param id  学生编号
     * @return   学生信息
     */
    Student findById(int id);

    /**
     * 按照 姓名及年级编号查询学生信息
     * @param name  姓名
     * @param gid  年级编号
     * @return   学生信息
     */
    List<Student> findBy(String name,int gid);

    /**
     * 多条件查询
     * @param student  多条件
     * @return
     */
    List<Student> find(Student student);

    /**
     * 按照姓名进行模糊查询
     * @param name
     * @return
     */
    List<Student> findByName(String name);

    /**
     * 按照姓名及电话查询
     * @param name
     * @param phone
     * @return
     */
    List<Student> query(String name,String phone);

    /**
     * 更新
     * @param student
     */
    void update(Student student);

    /**
     * 按照学号 进行多条删除
     * @param ids
     */
    void delByIds(int[] ids);

    /**
     * 查询学生信息的同时,查询出来 年级名称
     * @return
     */
    List<Student> queryWithGrade();
    /**
     * 查询学生信息的同时,查询出来 年级名称
     * @return
     */
    List<Student> queryWithGrade2();
}

第三步: 编写 GradeMapper.java 增加

Grade findById(int id);
package mapper;

import entity.Grade;

import java.util.List;

public interface GradeMapper {

    /**
     * 查询全部年级信息
     * @return
     */
    List<Grade> findAll();

    Grade findById(int id);
}

第四步: 编写GradeMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.GradeMapper">

    <resultMap id="gradeMap" type="grade">
        <id column="gid" property="id"/>
        <result column="gname" property="name"/>
    </resultMap>
    <!-- 查询全部-->
    <select id="findAll"  resultMap="gradeMap">
        select * from grade
    </select>
    
    <select id="findById" parameterType="int" resultMap="gradeMap">
        select * from grade where gid=#{id}
    </select>

</mapper>

说明:

第5步: 编写 StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.StudentMapper">

    <!-- 查询全部-->
    <select id="findAll" resultType="student">
        select * from student
    </select>


    <!--按照主键查询-->
    <select id="findById" parameterType="int" resultType="student">
        select * from student where sid=#{id}
    </select>

    <!--按照姓名及年级编号查询-->
    <select id="findBy"  resultType="student">
        select * from student where gid=#{arg1} and sname=#{arg0}
    </select>

    <!--按照多条件查询-->
    <select id="find"  resultType="student" parameterType="student">
        select * from student where gid=#{gid} and sname=#{sname} and phone=#{phone}
    </select>

    <!--按照姓名进行模糊查询-->
   <!-- <select id="findByName" parameterType="string" resultType="student">
        select * from student where sname like concat('%',#{sname},'%')
    </select>-->

    <select id="findByName" parameterType="string" resultType="student">
        select * from student where sname like #{sname}
    </select>


   <!-- <select id="query" resultType="student">
        select * from student
        <where>
            <if test="param1 !=null and param1!=''"> and sname like concat('%',#{param1},'%')  </if>
            <if test="param2 !=null and param2!=''"> and phone like concat('%',#{param2},'%')  </if>
        </where>
    </select>-->

    <select id="query" resultType="student">
        select * from student
        <trim prefix="where" prefixOverrides="and">
            <if test="param1 !=null and param1!=''"> and sname like concat('%',#{param1},'%')  </if>
            <if test="param2 !=null and param2!=''"> and phone like concat('%',#{param2},'%')  </if>
        </trim>
    </select>



 <!--   <update id="update" parameterType="student">
        update student
        <set>
            <if test="phone!=null and phone!=''"> phone=#{phone}, </if>
            <if test="address!=null and address!=''"> address=#{address}, </if>
        </set>
       where sid=#{sid}
    </update>-->
    <update id="update" parameterType="student">
        update student
        <trim prefix="set" suffixOverrides=",">
            <if test="phone!=null and phone!=''"> phone=#{phone}, </if>
            <if test="address!=null and address!=''"> address=#{address}, </if>
        </trim>
        where sid=#{sid}
    </update>






    <delete id="delByIds" parameterType="int[]">
        delete from student
        <where>
            <if test="array !=null and array.length>0">
                <foreach collection="array" open=" sid in ( " close=" ) " item="id" separator=",">

                    #{id}
                </foreach>
            </if>
        </where>
    </delete>


    <resultMap id="queryGradeMap" type="student">
       <id column="sid" property="sid"/>
        <result column="sname" property="sname"/>
        <result column="born" property="born"/>
        <result column="gender" property="gender"/>
        <result column="phone" property="phone"/>
        <result column="address" property="address"/>
        <result column="gid" property="gid"/>
        <association property="grade" javaType="grade" >
            <id column="tid" property="id"/>
            <result column="gname" property="name"/>
        </association>
    </resultMap>
    <select id="queryWithGrade" resultMap="queryGradeMap">
        select s.*,g.gid as tid,g.gname from student s,grade g where g.gid=s.gid
    </select>

    <resultMap id="queryGradeMap2" type="student">
        <id column="sid" property="sid"/>
        <result column="sname" property="sname"/>
        <result column="born" property="born"/>
        <result column="gender" property="gender"/>
        <result column="phone" property="phone"/>
        <result column="address" property="address"/>
        <result column="gid" property="gid"/>
        <association property="grade"  column="gid" select="mapper.GradeMapper.findById" >
        </association>
    </resultMap>
    <select id="queryWithGrade2" resultMap="queryGradeMap2">
        select * from student
    </select>

</mapper>

最后 编写测试类

@Test
    public void test2_1() throws IOException {
        //获得SqlSession
        SqlSession session = sqlSessionFactory.openSession();
        StudentMapper mapper = session.getMapper(StudentMapper.class);
        List<Student> list = mapper.queryWithGrade2();
        list.forEach((e)->System.out.println(e));
    }

总结

上节课 内容 成为 连接查询, 本节课内容为嵌套查询

区别:

总结:
     嵌套与 关联查询的区别:

     共同点:    均需要为 实体类 增加 对应的属性  ,  
                           例如 Student.java  增加  Grade grade属性
                均需要配置 association 标签

     不同点:
         sql: 嵌套查询使用的  单表   , 列不需要 重命名
              关联查询使用的  多表   , 如果 出现 重复列, 必须 对重复的列进行 重命名

                嵌套查询 配置 assocation的 select ,column 属性,

                  通过select 调用其他映射文件的方法,通过column传递参数

                关联查询  配置 assocation的 property, javaType属性

关联查询 一次性 获取数据 ,只有一条sql

嵌套查询: 懒加载方式, 会有多条sql执行

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进 | 2023Neck篇 | 利用Gold-YOLO改进YOLOv8对小目标检测

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

【PX4-AutoPilot教程-TIPS】Ubuntu中安装指定版本的gcc-arm-none-eabi

Ubuntu中安装指定版本的gcc-arm-none-eabi 在 Ubuntu 中开发基于 ARM 架构的 STM32 芯片&#xff0c;需要安装交叉编译器 gcc-arm-none-eabi编译代码&#xff0c;那么什么是交叉编译器呢&#xff1f; Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编译…

Leetcode2962. 统计最大元素出现至少 K 次的子数组

Every day a Leetcode 题目来源&#xff1a;2962. 统计最大元素出现至少 K 次的子数组 解法1&#xff1a;滑动窗口 算法如下&#xff1a; 设 mx max⁡(nums)。右端点 right 从左到右遍历 nums。遍历到元素 xnums[right] 时&#xff0c;如果 xmx&#xff0c;就把计数器 co…

【springboot+vue项目(零)】开发项目经验积累(处理问题)

一、VUEElement UI &#xff08;一&#xff09;elementui下拉框默认值不是对应中文问题 v-model绑定的值必须是字符串&#xff0c;才会显示默认选中对应中文&#xff0c;如果是数字&#xff0c;则显示数字&#xff0c;修改为&#xff1a; handleOpenAddDialog() {this.dialogT…

JVS规则引擎和智能BI(自助式数据分析)1.3新增功能说明

规则引擎更新功能 新增: 1、数据源新增Excel数据源&#xff1b; Excel数据源功能允许用户将Excel文件作为数据源导入&#xff0c;并进行数据清洗、转换和处理&#xff0c;以实现数据的集成、可视化和深度分析&#xff0c;为决策提供强大支持&#xff0c;同时保持良好的交互性…

html+css 有关于less的使用和全面解释

目录 less 注释 运算 嵌套 变量 导入 导出 禁止导出 less Less是一个CSS预处理器, Less文件后缀是.less。扩充了 CSS 语言, 使 CSS 具备一定的逻辑性、计算能力 注意&#xff1a;浏览器不识别 Less 代码&#xff0c;目前阶段&#xff0c;网页要引入对应的 CSS 文件 V…

ClickHouse数据库详解和应用实践

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 概述1.适用场景2.不适用场景 一、核心特性1.完备的DBMS功能2.列式存储与数据压缩 二、安装部署1.在线安装2.离线安装 三、jdbc访问总结 概述 ClickHouse 是一个用于…

Linux 系统磁盘空间扩容

根据提示可以看到此系统的磁盘是 50G 的&#xff0c;但是实际适用有28G左右可以扩容20G 1、磁盘分区 m 查看帮助信息 n&#xff08;表示增加分区&#xff09; p&#xff08;创建主分区&#xff09; partition number 输入3&#xff08;因为上面已经有两个分区 sda1 和 sda2&…

Qt中图片旋转缩放操作

在我们开发过程中&#xff0c;难免会遇到加载图片的问题&#xff0c;在上一个开发项目里我就遇到了图片缩放的问题&#xff0c;所以&#xff0c;我决定将这一部分好好研究&#xff0c;记录下来&#xff0c;希望对大家有帮助哟~ 在讲解之前&#xff0c;我们先看一看具体的展示效…

react antd,echarts全景视图

1.公告滚动&#xff0c;40s更新一次 2.echarts图标 左右轮播 60s更新一次 3.table 表格 import { useState, useEffect } from react;import Slider from react-slick; import slick-carousel/slick/slick-theme.css; import slick-carousel/slick/slick.css;import Layout fro…

MongoDB批量写入操作

一、概述 MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受确认级别。 db.collection.bulkWrite&#xff08;&#xff09;方法提供了执行批量插入、更新和删除操作的能力。 MongoDB还支持通过db.col…

使用Apache POI将数据写入Excel文件

首先导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>po…

Spring Cloud Gateway 缓存区异常

目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常&#xff0c;在这里记录一下&#xff0c;直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…

Spring 面试题学习笔记整理

Spring 面试题学习笔记整理 Spring的理解IOC读取 xml注入 配置过程解析注解注入过程 高频 &#xff1a;IOC 理解 及原理 底层实现IoC的底层实现高频&#xff1a;Bean的生命周期&#xff08;图解&#xff09;高频&#xff1a;Bean的生命周期&#xff08;文解&#xff09;扩展知识…

STM32和ESP8266的WiFi模块控制与数据传输

基于STM32和ESP8266 WiFi模块的控制与数据传输是一种常见的嵌入式系统应用。在这种应用中&#xff0c;STM32作为主控制器负责控制和与外部传感器交互&#xff0c;而ESP8266 WiFi模块则用于实现无线通信和数据传输。本文将介绍如何在STM32上控制ESP8266模块&#xff0c;建立WiFi…

【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 生命周期 1.1. 认识生命周期 很多的事物都有从创建到销毁的整个过程&#xff0c;这个过程称之为是生命周期&…

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

嵌入式(三)中断解析 | 中断基本概念 CC2530中断系统 中断编程全解析

文章目录 1中断的概念和作用1.1 概念1.2 作用1.3 中断 其他概念 2. CC2530的中断系统3 中断编程3.1 中断配置3.1.1 使能端口组的中断功能3.1.2 使能当前端口组有哪些端口引脚中断3.1.3 设置中断触发方式 3.2 中断处理函数编写3.2.1 基本编写格式3.2.2 识别触发外部中断的端口Po…

实验笔记之——bug:in /usr/local/lib/libfmt.a(format.cc.o) is referenced by DSO

最近在编译D-MAP的时候遇到下面的问题 在github issue好像也有类似的提问 compiling error with fmt Issue #4 hku-mars/D-Map GitHub 这应该是fmt配置没有连接上。为此寻找所有包含的fmt文件&#xff0c;在头文件处加入 #define FMT_HEADER_ONLY #include "fmt/for…