Mybatis 多对一和一对多查询

news2024/11/17 9:53:40

文章目录

  • Mybatis 多对一 and 一对多查询详解
    • 数据库
    • 需求
    • Mybatis代码
    • 注意

Mybatis 多对一 and 一对多查询详解

数据库

员工表 t_emp

在这里插入图片描述

部门表 t_dept在这里插入图片描述


CREATE TABLE `t_emp` (
  `emp_id` int NOT NULL AUTO_INCREMENT,
  `emp_name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `age` int DEFAULT NULL,
  `gender` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `dept_id` int DEFAULT NULL,
  PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


CREATE TABLE `t_dept` (
  `dept_id` int NOT NULL AUTO_INCREMENT,
  `dept_name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


INSERT INTO `t_emp` (`emp_id`, `emp_name`, `age`, `gender`, `dept_id`) VALUES (1, '张三', 20, '男', 1), (2, '李四', 22, '男', 2), (3, '王五', 23, '男', 3), (4, '赵六', 24, '男', 1);


INSERT INTO `t_dept` (`dept_id`, `dept_name`) VALUES (1, 'A'), (2, 'B'), (3, 'C');


需求

多对一:员工表对应部门表
查询指定id的员工以及其对应的部门

一对多:部门表对应员工表
查询指定的部门以及其包含的员工


Mybatis代码

在这里插入图片描述

DeptMapper接口文件

package com.atguigu.mybatis.mapper;

import com.ruanjian.pojo.Dept;
import com.ruanjian.pojo.Emp;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface DeptMapper {
    // 一对多查询
    // 查询部门表中的员工信息
    // 需要在部门类中添加员工的集合  private List<Emp> emps;

    Dept getDeptAndEmpById(@Param("deptId") Integer deptId);

  
    // 分步查询
    // 1.先查出指定id的部门信息,部门信息中有对应员工的dept_id

    Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId);

    // 2.再根据dept_id查出相对应的员工信息
    List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId);

}

EmpMapper接口文件

package com.atguigu.mybatis.mapper;
import com.ruanjian.pojo.Dept;
import com.ruanjian.pojo.Emp;
import org.apache.ibatis.annotations.Param;

public interface EmpMapper {
    
    // 多对一查询
    // 查询指定id员工以及该员工所对应的部门信息

    Emp getEmpAndDeptById(@Param("empId") Integer empId);

    Emp getEmpAndDeptById_association(@Param("empId") Integer empId);

    // 分步查询
    // 先从员工表中查询出指定id的员工的数据,该数据中有对应部门id
    // 再根据部门id从部门表中查询出对应的部门信息

    // 分步查询第一步
    Emp getEmpAndDeptByIdOne(@Param("empId") Integer empId);

    // 分步查询第二步
    Dept getEmpAndDeptByIdTwo(@Param("deptId") Integer deptId);
}


Dept类文件 部门实体类
package com.ruanjian.pojo;

/*
员工对部门 是多对一,多对一是在多的那个类(员工类)中添加一个部门对象
部门对员工 是一对多,一对多是在一的那个类中(部门类)中添加一个员工集合

对一 对的就是一个对象
对多 对的就是一个集合
 */

import java.util.List;

// 部门实体类
public class Dept {
    private Integer deptId;
    private String deptName;

    private List<Emp> emps;  // 添加的一个员工的集合

    public Dept() {
    }

    public Dept(Integer deptId, String deptName) {
        this.deptId = deptId;
        this.deptName = deptName;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptId=" + deptId +
                ", deptName='" + deptName + '\'' +
                ", emps=" + emps +
                '}';
    }
}

Emp类文件
员工实体类

package com.ruanjian.pojo;

/*
员工对部门 是多对一,多对一是在多的那个类(员工类)中添加一个部门对象
部门对员工 是一对多,一对多是在一的那个类中(部门类)中添加一个员工集合

对一 对的就是一个对象
对多 对的就是一个集合
 */


// 员工实体类

// 对一就是对应的一个对象
// 对多就是对应的一个集合
public class Emp {
    private Integer empId;
    private String empName;
    private Integer age;
    private String gender;

    private Dept dept;  // 加上一个部门的对象


    public Emp() {
    }

    public Emp(Integer empId, String empName, Integer age, String gender) {
        this.empId = empId;
        this.empName = empName;
        this.age = age;
        this.gender = gender;
    }

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", dept=" + dept +
                '}';
    }
}


DeptMapper

<?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">
<mapper namespace="com.atguigu.mybatis.mapper.DeptMapper">

<!-- 处理一对多的映射关系
    1. collection
    2. 分步查询
-->
<!--*************************** 一对多 collection ****************************************-->

    <resultMap id="deptAndEmpById_resultMap" type="dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <!--    collection : 处理一对多的映射关系(处理集合类型的属性)-->
        <!--        ofType表示的是集合中的类型-->
        <collection property="emps" ofType="Emp">
            <id column="emp_id" property="empId"></id>
            <result column="emp_name" property="empName"></result>
            <result column="age" property="age"></result>
            <result column="gender" property="gender"></result>
        </collection>

    </resultMap>

    <!--    Dept getDeptAndEmpById(@Param("deptId") Integer deptId);-->
    <select id="getDeptAndEmpById" resultMap="deptAndEmpById_resultMap">
        select *
        from t_dept
        left join t_emp on t_dept.dept_id = t_emp.dept_id
        where t_dept.dept_id=#{deptId}
    </select>


<!--*************************** 一对多 collection ****************************************-->

<!--*************************** 一对多  分步查询  ****************************************-->

    <resultMap id="deptAndEmpResultMapByStep" type="Dept">
        <id column="dept_id" property="deptId"></id>
        <result column="dept_name" property="deptName"></result>
        <collection property="emps"
                    select="com.atguigu.mybatis.mapper.DeptMapper.getDeptAndEmpByStepTwo"
                    column="dept_id"></collection>
    </resultMap>
    
    <!--    Dept getDeptAndEmpByStepOne(@Param("deptId") int deptId);
        // 先查出指定id的部门信息,部门信息中有对应员工的dept_id -->
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
        select * from t_dept where dept_id = #{deptId}
    </select>

    <!--    List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") int deptId);
    // 再根据dept_id查出相对应的员工信息-->
    <select id="getDeptAndEmpByStepTwo" resultType="Emp">
        select * from t_emp where dept_id = #{deptId}
    </select>

</mapper>

EmpMapper

<?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">
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">
    <!--
        处理多对一的映射关系
        有三种方法:
        第一种:级联方式处理
        第二种:association 处理多对一的映射关系(处理的是实体类类型的属性)
        第三种:分布查询
    -->

<!-- ************ 第一种:级联方式处理  *************** -->
    <resultMap id="EmpAndDeptById_resultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>

        <result column="dept_id" property="dept.deptId"></result>
        <result column="dept_name" property="dept.deptName"></result>
    </resultMap>

    <!--Emp getEmpAndDeptById(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptById" resultMap="EmpAndDeptById_resultMap">
        select *
        from t_emp
        left join t_dept on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id=#{empId}
    </select>

<!-- *********************************************-->

<!-- *************** 第二种 association ******************************-->

    <!--  第二种 association-->
    <resultMap id="getEmpAndDeptById_association_resultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <!--
            association: 处理多对一的映射关系(处理实体类类型的属性)
            property: 设置需要处理映射关系的属性的属性名
            javaType: 设置要处理的属性的类型, 就是把<association>标签下设置映射关系的字段,封装给某个类
        -->
        <association property="dept" javaType="Dept">
            <id column="dept_id" property="deptId"></id>
            <result column="dept_name" property="deptName"></result>
        </association>

    </resultMap>

    <!--    Emp getEmpAndDeptById_association(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptById_association" resultMap="getEmpAndDeptById_association_resultMap">
        select *
        from t_emp
        left join t_dept on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id=#{empId}
    </select>


<!-- *********************************************-->

<!-- ****************** 第三种:分布查询 ***************************-->
    <resultMap id="getEmpAndDeptByIdOne_resultMap" type="Emp">
        <id column="emp_id" property="empId"></id>
        <result column="emp_name" property="empName"></result>
        <result column="age" property="age"></result>
        <result column="gender" property="gender"></result>
        <!--
            property: 设置需要处理映射关系的属性的属性名
            select: 填写分步查询的sql的唯一标识,就是设置下一步要执行的sql语句
            column: 将上一个sql查询出的某个字段作为分步查询的下一个sql语句sql条件,相当于函数的参数,传给下一个sql语句
            fetchType: 在开启了延时加载的环境中,通过该属性设置当前的分步查询是否使用延迟加载
                有两个值:eager(立即加载) lazy(延迟加载)
        -->
        <association property="dept"
                     fetchType="eager"
                     select="com.atguigu.mybatis.mapper.EmpMapper.getEmpAndDeptByIdTwo"
                     column="dept_id">
        </association>
    </resultMap>

    <!--    Emp getEmpAndDeptByIdOne(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByIdOne" resultMap="getEmpAndDeptByIdOne_resultMap">
        select * from t_emp where emp_id = #{empId}
    </select>

    <!--    Dept getEmpAndDeptByIdTwo(@Param("deptId") Integer deptId);-->
    <select id="getEmpAndDeptByIdTwo" resultType="Dept">
        select * from t_dept where dept_id = #{deptId}
    </select>

<!-- *********************************************-->

</mapper>

ResultMapTest

import com.atguigu.mybatis.mapper.DeptMapper;
import com.atguigu.mybatis.mapper.EmpMapper;
import com.ruanjian.pojo.Dept;
import com.ruanjian.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class ResultMapTest {
    private SqlSession session;

    /*
    处理多对一的映射关系
    有三种方法:
    第一种:级联方式处理
    第二种:association 处理多对一的映射关系(处理的是实体类类型的属性)
    第三种:分步查询
    */


    // *********************** 多对一  ****************************************

    @Test
    // 第三种:分步查询
    public void textGetEmpAndDeptByIdOne() {
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByIdOne(1);
        System.out.println(emp);
    }


    @Test
    // 第二种:association
    public void textGetEmpAndDeptById_association() {
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptById_association(2);
        System.out.println(emp);
    }


    @Test
    // 第一种:级联方式处理
    public void textGetEmpAndDeptById() {
        EmpMapper mapper = session.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptById(2);
        System.out.println(emp);
    }


    // *********************** 一对多  ****************************************

    @Test
    // 分步查询
    public void textGetDeptAndEmpByStep() {
        DeptMapper mapper = session.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpByStepOne(2);
        System.out.println(dept);
    }


    @Test
    // 一对多查询
    public void textGetDeptAndEmpById() {
        DeptMapper mapper = session.getMapper(DeptMapper.class);
        Dept dept = mapper.getDeptAndEmpById(1);
        System.out.println(dept);
    }

    // ***************************************************************


    // junit会在每一个@Test方法前执行@Before方法
    @Before
    public void init() throws IOException {
        session = new SqlSessionFactoryBuilder()
                .build(
                        Resources.getResourceAsStream("mybatis-config.xml"))
                .openSession();
    }

    // junit会在每一个@Test方法后执行@After方法
    @After
    public void clear() {
        session.commit();
        session.close();
    }
}


db.properties

mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=123456

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n"/>
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug"/>
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info"/>
    </logger>
    <root>
        <level value="debug"/>
        <appender-ref ref="STDOUT"/>
    </root>
</log4j:configuration>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--环境配置-->
    <!--引入外部db.properties-->
    <properties resource="db.properties"/>

    <settings>
        <!--        <setting name="cacheEnabled" value="true" />-->
        <!--  开启延时加载-->
        <setting name="lazyLoadingEnabled" value="true"/>

        <!-- 开启时即为true时任何方法的调用都会加载相关类的全部属性
        false时是按需加载,true是全部加载
        -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <typeAliases>
        <package name="com.ruanjian.pojo"/>
    </typeAliases>

    <!--配置mybatis的连接环境(可以配置多个环境)-->
    <environments default="development">
        <!--开发环境-->
        <environment id="development">
            <!--使用JDBC事务管理-->
            <transactionManager type="JDBC"/>
            <!--数据库连接相关配置,db.properties文件中的内容-->
            <!--使用连接池技术-->
            <dataSource type="POOLED">
                <!--数据库驱动-->
                <property name="driver" value="${mysql.driver}"/>
                <!--连接字符串-->
                <property name="url" value="${mysql.url}"/>
                <!--数据库用户名-->
                <property name="username" value="${mysql.username}"/>
                <!--数据库密码-->
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!--mapping文件路径配置-->
    <mappers>
        <!--        <mapper resource="mapper/DeptMapper.xml"/>-->
        <package name="com.atguigu.mybatis.mapper"/>
    </mappers>
</configuration>




pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima</groupId>
    <artifactId>MyBaits_2</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <maven.compiler.sourece>11</maven.compiler.sourece>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>text</scope>
        </dependency>
        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>
</project>

注意

新建包时用点
例如:com.atguigu.mybatis.mapper

resources目录下建立多层目录的时候时是用分割线
例如:com/atguigu/mybatis/mapper


mybatis-config.xml文件中

<package name="com.atguigu.mybatis.mapper"/>

<package>的使用条件:
接口文件要和xml文件同名,并且在同一个目录下

使用注解写的接口,只能有class的方式注册,例:

<mapper class="com.atguigu.mybatis.mapper.DeptMapper"></mapper>

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

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

相关文章

2023年华为云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;华为云也开启了双11大促&#xff0c;推出了“华为云11.11”活动&#xff0c;那么&#xff0c;2023年华为云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、华为云双11活动入口 活动地址&#xff1a;点此直达 二、华为云双11…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

JAVA基础(JAVA SE)学习笔记(十)多线程

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第三阶段&#xff1a;Java高级应用 9.异常处理 10.多线程 11.常用类和基础API 12.集合框架 13.泛型 14…

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一&#xff1a;function function declarations2.1.1 示例 2.2 方式二&#xff1a;class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

TiDB 企业版全新升级,平凯数据库核心特性全解读

作为 TiDB 企业版的全新升级&#xff0c;平凯数据库一经推出便广受媒体及用户关注。 近日&#xff0c;平凯星辰首席科学家丁岩在“平凯数据库全解读”活动中&#xff0c;首次详细介绍了平凯数据库的核心能力。 本文为丁岩演讲实录全文&#xff0c;为方便阅读&#xff0c;已做部…

[激光原理与应用-72]:PLC架构与工作原理

目录 一、PLC简介 1.1 概述 1.2 基本组成 1.3 常见的PLC品牌比较 二、PLC程序执行原理 2.1 PLC有操作系统吗&#xff1f; 2.2 PLC程序执行 2.3 PLC编程语言 2.4 PLC编程过程 三、PLC编程工具 3.1 编程工具 四、PLC与工控机协同 4.1 PLC需要配置工控机吗&#xff1…

构建Web UI自动化测试平台

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 前言 什么是前端UI自动化测试平台&#xff1f;由于部门的业务域非常广&…

HCIP——MGRE实验

一、实验要求 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff1b;其所有地址均为公有IP地址 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用PPP的chap认证&#xff0c;R5为主认证方&#xff1b; R3与R5之间使用HDLC封装。 3.R1/R2/R3…

纪念基于JavaScript 实现的后台桌面 UI 设计

目录 前言 C/S 到 B/S ASP Builder 的诞生 关于 Craneoffice.net 开发环境配置 后台界面的 UI 区域要素 桌面系统的想法和设计 搜索引擎 导航面板 快捷访问 二级导航 小组件及其它 设置桌面壁纸 小时钟 附件小程序 计算器界面设计 日历与任务 系统设置 天气小…

ChineseChess.2023.10.30.02

中国象棋模拟器 接下来不管黑怎么走都是开始杀【卒】 中国象棋残局模拟器ChineseChess.2023.10.30.02_桌游棋牌热门视频

二叉搜索树的最小绝对差[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个二叉搜索树的根节点root&#xff0c;返回树中任意两不同节点值之间的最小差值。差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,6,1,3] 输出&#xff1a;1 示例 …

K8s集群

统一时间&#xff1a;ntpdate(都做) ntpdate -b ntp1.aliyun.com */1 * * * * /usr/sbin/ntpdate -b ntp1.aliyun.com systemctl status docker vi /etc/docker/daemon.json systemctl restart docker m: vim kubernetes.sh cat >> /etc/yum.repos.d/kubernetes.repo…

Unity中Shader的全局照明简介

文章目录 前言一、什么是全局照明GI1、全局照明&#xff08;Global Illumination&#xff09;&#xff0c;简称GI2、指既考虑场景中直接光源的光照&#xff08;Direct Light&#xff09;又考虑经过场景中其他物体反射后的光照&#xff08;Indirect Light&#xff09;的一种渲染…

小红书关键词类型有哪些,如何布局搜索流量?

通过搜索关键词寻找到关注的内容&#xff0c;是大部分小红书用户的浏览习惯。因此作为品牌方&#xff0c;找准搜索的关键词&#xff0c;并合理嵌入内容中&#xff0c;就显得尤为重要。今天为大家分享下小红书关键词类型有哪些&#xff0c;如何布局搜索流量&#xff1f; 一、关键…

加速生态培育,国产CPU走到哪了?

国产大飞机C919的成功商飞&#xff0c;证明我国已经拥有了设计制造大飞机的能力。继高铁、盾构机等多个领域后&#xff0c;再次证明即使是技术后来者&#xff0c;通过在起步阶段引进关键技术&#xff0c;吸收消化后&#xff0c;自主研发不断发展前行&#xff0c;这条“引进吸收…

智慧粮库挡粮门异动监测

我国以往粮食收储设施比较老化&#xff0c;如何减少粮食在存储运输过程中的人为因素&#xff0c;确保粮食安全&#xff0c;成为亟待解决的问题&#xff0c;为了减少粮食的损失&#xff0c;“智慧粮库”的建设在我国有着重要意义。“智慧粮库”充分利用物联网、人工智能等技术&a…

自定义点云的数据类型PointXYZIRT

PCL支持的点云数据类型有PointXYZ、PointXYZI等&#xff0c;但是对于速腾、Velodyne等激光雷达的原始点云中还包含了激光点线号ring和每个激光点的时间戳信息&#xff0c;在读取该类点云时需要基于PCL库自定义点云格式才能读到原始点云的所有信息&#xff0c;以速腾激光雷达点云…

回归测试:在不断变化的环境中确保软件的稳定性

软件开发是一个复杂的过程&#xff0c;需要不断变化和更新以满足客户不断变化的需求&#xff0c;但它们也可能产生新问题或导致旧问题重新出现。这就是回归测试的用武之地——它是在不断变化的环境中确保软件稳定性的重要组成部分。 在这篇文章中&#xff0c;我们将深入探讨什…

开放式耳机推荐排行榜、开放式耳机性价比推荐

随着无线耳机越来越普及&#xff0c;人们对于耳机的要求也越来越高。传统的入耳式耳机虽然音质好&#xff0c;但是长时间佩戴容易引起耳部不适&#xff0c;甚至可能导致听力损失。为此大家都开始选择入手舒适、安全的开放式耳机&#xff0c;现在耳机市场&#xff0c;各种品牌、…

*VS Code中的Ajax

下载插件并使用 下载插件,开放一个端口给要加载的资源&#xff0c;解决跨域问题&#xff0c;没有后端接收数据&#xff0c;用来做小模块很合适 建立文件夹&#xff0c;文件夹下放入jquery插件和json文件 data.json {"total": 4,"data": [{"name&qu…