MyBatis - 10 - 处理多对一映射关系 + MyBatis延时加载

news2024/9/27 23:32:42

文章目录

    • 1.准备工作
      • 1.1 建表
      • 1.2 创建Maven项目
        • 1.2.1 在pom文件中,修改打包方式为jar包,导入依赖
        • 1.2.2 创建日志配置文件和jdbc.properties
        • 1.2.3 创建Mybatis核心配置文件
        • 1.2.4 创建实体类以及实体类之间的关系
        • 1.2.5 创建SqlSession工具类
    • 2.为什么要单独处理“多对一”和“一对多”关系
    • 3.解决多对一映射关系的三种方案
      • 3.1 方案1 级联属性赋值 【简单,但用的不多】
      • 3.2 方案2 association
      • 3.3 方案3 分步查询【用的比较多的处理方式】
        • 3.3.1 查询员工信息
        • 3.3.2 根据员工所对应的部门id查询部门信息
        • 3.3.3 ⭕️ 延迟加载
          • 3.3.3.1 注意

1.准备工作

1.1 建表

t_emp
在这里插入图片描述
在这里插入图片描述

t_dept
在这里插入图片描述
将两张表建立关系
在这里插入图片描述

添加测试数据:
在这里插入图片描述
在这里插入图片描述

1.2 创建Maven项目

1.2.1 在pom文件中,修改打包方式为jar包,导入依赖

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.rqs.mybatis</groupId>
   <artifactId>MyBatis_demo2</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <dependencies>
       <!-- Mybatis核心 -->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.7</version>
       </dependency>

       <!-- junit测试 -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
       </dependency>

       <!-- MySQL驱动 -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>5.1.3</version>
       </dependency>

       <!-- log4j日志 -->
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.17</version>
       </dependency>
   </dependencies>

</project>

1.2.2 创建日志配置文件和jdbc.properties

** 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>

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

1.2.3 创建Mybatis核心配置文件

** 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>



    <!--    MyBatis核心配置文件,标签的顺序
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?-->

    <properties resource="jdbc.properties"></properties>

    <!-- 设置MyBatis的全局配置-->
    <settings>
        <!--将_自动映射为驼峰 , emp_name:empName-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>



    <!--设置类型别名,大小写不敏感。
        如果不设置alias,则默认为类名(大小写不敏感)-->
    <typeAliases>
        <!--
            typeAlias: 设置某个类型的别名
            属性:
                type 设置需要设置别名的类型
                alias 设置某个类型的别名,如果不设置该属性,那么该类型拥有默认的类名,且不区分大小写
        -->
        <!--<typeAlias type="com.rqs.mybatis.pojo.User" alias="User"></typeAlias>-->

        <!--推荐以包为单位,将包下所有的类型设置默认的类型别名且不区分大小写-->
        <package name="com.rqs.mybatis.pojo"/>
    </typeAliases>



    <!--设置连接数据库的环境-->
    <!--每一个environment都是具体连接数据库的环境-->
    <!--
        一个项目中只会用一个环境,default用于使用默认使用的环境:
        id:表示连接数据库的环境的唯一标识 不能重复

    -->
    <environments default="development">
        <!--
        transactionmanager:设置事务管理方式
        属性:
            type="JDBC/MANAGED"
            JDBC: 在当前环境中,执行sql时,使用的时jdbc原声的事务管理方式,需要手动的提交和回滚事务
            MANAGED:被管理,例如Spring
        -->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--        dataSource:配置数据源
            属性"
                type:设置数据源的类型
                type=""
                POOLED:表示使用数据库连接池缓存数据库连接
                UNPOOLED:表示不使用数据库连接池
                JNDI:表示使用上下文中的数据源
            -->
            <dataSource type="POOLED">
                <!--设置连接数据库的驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--注意:如果在建sql表单的时候选了字符集(如utf8),
                这里的value要改成:value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"-->
                <!--用户名和密码-->
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!--引入映射文件-->
    <mappers>
        <!--
                    推荐以包为单位引入映射文件,要求:
                        1。 mapper接口所在的包要和映射文件所在的包一致
                        2。 mapper接口要和映射文件的名字一致-->
        <!--        com.rqs.mybatis.mapper创建包时要用/分隔,这样才是目录,否则这整一个就只是文件夹名字而已-->
        <package name="com.rqs.mybatis.mapper"/>
    </mappers>


</configuration>


1.2.4 创建实体类以及实体类之间的关系

Dept类:

package com.rqs.mybatis.pojo;


public class Dept {

    private Integer did;

    private String deptName;

    public Dept() {
    }

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

    public Integer getDid() {
        return did;
    }

    public void setDid(Integer did) {
        this.did = did;
    }

    public String getDeptName() {
        return deptName;
    }

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

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

Emp类:

package com.rqs.mybatis.pojo;

public class Emp {
    private Integer eid;
    private String empName;
    private Integer age;
    private String sex;
    private String email;
    private Dept dept;

    public Dept getDept() {
        return dept;
    }

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

    public Integer getEid() {
        return eid;
    }

    public void setEid(Integer eid) {
        this.eid = eid;
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Emp() {
    }

    public Emp(Integer eid, String empName, Integer age, String sex, String email, Dept dept) {
        this.eid = eid;
        this.empName = empName;
        this.age = age;
        this.sex = sex;
        this.email = email;
        this.dept = dept;
    }

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

设置实体类之间的关系
表和表之间是有关系的,实体类和实体类之间也有映射关系,所以需要设置实体类之间的关系,例如如何描述员工所对应的部门,如何描述部分所对应的员工。
1.多对一,需要在“多”所对应的实体类创建“一”对应的对象,即在Emp类中创建Dept对象

在这里插入图片描述

1.2.5 创建SqlSession工具类

SqlSessionUtils:

package com.rqs.mybatis.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtils {
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSession;
    }
}

2.为什么要单独处理“多对一”和“一对多”关系

假如需要查询员工以及员工所对应的部门信息,那么部门信息可以通过两表联查,在员工表中把员工的部门did查出来,再在部门表中把did对应的dept_name查出来,而这两个字段无法映射员工实体类中的Dept对象,并且数据库中这两个字段并不是实体类类型,所以只能通过resultMap来自定义映射关系。
在这里插入图片描述在这里插入图片描述

3.解决多对一映射关系的三种方案

查询员工以及员工所对应的部门信息

3.1 方案1 级联属性赋值 【简单,但用的不多】

创建EmpMapper接口及其映射文件
EmpMapper接口

package com.rqs.mybatis.mapper;

import com.rqs.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;

import java.util.List;


public interface EmpMapper 
    /**
     * 查询员工以及员工所对应的部门信息
     */
    Emp getEmpAndDept(@Param("eid") Integer eid);


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.rqs.mybatis.mapper.EmpMapper">

    <resultMap id="empAndDeptResultMapOne" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <result property="dept.did" column="did"></result>
        <result property="dept.deptName" column="dept_name"></result>
    </resultMap>
    <!--    Emp getEmpAndDept(@Param("eid") Integer eid);-->
    <select id="getEmpAndDept" resultMap="empAndDeptResultMapOne">
        <!--两表联查(用左外连接方式,还有内连接或右外连接)-->
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid=#{eid}
    </select>



</mapper>

测试代码:
ResultMapTest:

package com.rqs.mybatis.test;


import com.rqs.mybatis.mapper.EmpMapper;
import com.rqs.mybatis.pojo.Emp;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class ResultMapTest {
    @Test
    public void testGetEmpAndDept() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByStepOne(1);
        System.out.println(emp);
    }

}

测试结果:
在这里插入图片描述

3.2 方案2 association

EmpMapper接口

package com.rqs.mybatis.mapper;

import com.rqs.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;

import java.util.List;


public interface EmpMapper 
    /**
     * 查询员工以及员工所对应的部门信息
     */
    Emp getEmpAndDept(@Param("eid") Integer eid);


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.rqs.mybatis.mapper.EmpMapper">

    <!--处理多对一映射关系 【方案2 association】-->
    <resultMap id="empAndDeptResultMapTwo" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <!--
            association:处理多对一的映射关系
            property:需要处理多对一关系的属性名
            javaType:该属性的类型
        -->
        <association property="dept" javaType="Dept">
            <id property="did" column="did" ></id>
            <result property="deptName" column="dept_name" ></result>
        </association>

    </resultMap>


    <!--    Emp getEmpAndDept(@Param("eid") Integer eid);-->
    <select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">
        <!--两表联查(用左外连接方式,还有内连接或右外连接)-->
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid=#{eid}
    </select>



</mapper>

测试代码:
ResultMapTest:

package com.rqs.mybatis.test;


import com.rqs.mybatis.mapper.EmpMapper;
import com.rqs.mybatis.pojo.Emp;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class ResultMapTest {
    @Test
    public void testGetEmpAndDept() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByStepOne(1);
        System.out.println(emp);
    }

}

测试结果:
在这里插入图片描述

3.3 方案3 分步查询【用的比较多的处理方式】

3.3.1 查询员工信息

EmpMapper接口

package com.rqs.mybatis.mapper;

import com.rqs.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;

import java.util.List;


public interface EmpMapper {

    /**
     * 通过分步查询查询员工以及员工所对应的部门信息
     * 分步查询第一步:查询员工信息
     */
    Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);

    /**
     * 通过分步查询查询部门以及部门中所有的员工信息
     * 分步查询第二步:根据did查询员工信息
     */
    List<Emp> getDeptAndEmpByStepTwo(@Param("did") Integer did);

}



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.rqs.mybatis.mapper.EmpMapper">

    <!--处理多对一映射关系 【方案2 association】-->
    <resultMap id="empAndDeptResultMapTwo" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <!--
            association:处理多对一的映射关系
            property:需要处理多对一关系的属性名
            javaType:该属性的类型
        -->
        <association property="dept" javaType="Dept">
            <id property="did" column="did" ></id>
            <result property="deptName" column="dept_name" ></result>
        </association>

    </resultMap>


    <!--    Emp getEmpAndDept(@Param("eid") Integer eid);-->
    <select id="getEmpAndDept" resultMap="empAndDeptResultMapTwo">
        <!--两表联查(用左外连接方式,还有内连接或右外连接)-->
        select * from t_emp left join t_dept on t_emp.did = t_dept.did where t_emp.eid=#{eid}
    </select>



</mapper>

3.3.2 根据员工所对应的部门id查询部门信息

DeptMapper接口文件

package com.rqs.mybatis.mapper;

import com.rqs.mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;

public interface DeptMapper {
    /**
     * 分步查询的第二步:根据员工所对应的did查询部门信息
     * @param did
     * @return
     */
    Dept getEmpAndDeptByStepTwo(@Param("did") int did);
}

EmpMapper.xml

<?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.rqs.mybatis.mapper.EmpMapper">


    <!--    com.rqs.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo是这条sql语句的全类名-->
    <resultMap id="empAndDeptByStepResultMap" type="Emp">
        <id property="eid" column="eid"></id>
        <result property="empName" column="emp_name"></result>
        <result property="age" column="age"></result>
        <result property="sex" column="sex"></result>
        <result property="email" column="email"></result>
        <!--
                select中写什么?
                   由于需要将DeptMapper接口中的getEmpAndDeptByStepTwo()方法所查询出来的结果赋值给association中的property属性
                   而这个方法查询的结果是通过DeptMapper.xml中的sql语句查到的,所以需要知道这个sql语句的唯一标识
                   而sql的唯一标识是sql语句的命名空间namespace加上.SQLId,即com.rqs.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo
                   而命名空间namespace其实就是Mapper接口的全类名,SQLId其实就是Mapper接口中的方法名,所以也可以理解为 mapper接口的全类名.方法名
                   即   select属性中写写第二步的sql语句的namespace.SQLId或第二步的mapper接口的全类名.方法名


                select: 设置分步查询的sql的唯一标识(namespace.SQLId或mapper接口的全类名.方法名)
                column:分步查询的条件  由前一个查询的结果提供
                fetchType: 当开启了全局的延迟记载后,可通过此属性手动控制延迟加载的效果
                fetchType:"lazy/eager" lazy表示延迟加载,eager表示立即加载
        -->
        <association property="dept"
                     select="com.rqs.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                     column="did"">
        </association>
    </resultMap>

    <!--Emp getEmpAndDeptByStepOne(@Param("eid") Integer eid);-->
    <select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
        select * from t_emp where eid = #{eid}
    </select>
</mapper>

DeptMapper.xml

<?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.rqs.mybatis.mapper.DeptMapper">
    <!--        Dept getEmpAndDeptByStepTwo(Integer did);-->
    <!--    分步查询可以实现懒加载-->
    <!-- 在mybatis-config.xml中打开MyBatis的全局配置,将_自动映射为驼峰,这样就不用谢resultMap了,直接用resultType-->
    <select id="getEmpAndDeptByStepTwo" resultType="Dept">
        select * from t_dept where did = #{did}
    </select>

</mapper>

测试代码:

package com.rqs.mybatis.test;


import com.rqs.mybatis.mapper.EmpMapper;
import com.rqs.mybatis.pojo.Emp;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class ResultMapTest {
    @Test
    public void testGetEmpAndDeptByStep() {
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpAndDeptByStepOne(1);
        System.out.println(emp);
    }

}

测试结果:
在这里插入图片描述

3.3.3 ⭕️ 延迟加载

分步查询的优点:可以实现延迟加载
延迟加载默认不开启,必须在核心配置文件mybatis-config.xml中设置全局配置信息:

  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。 否则,每个 属性会按需加载

此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。此时可通过association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加 载)|eager(立即加载)”


通过下面的例子来测试:

由于分步查询既能查询员工信息,又能根据分步查询的第二步来查询员工所对应的部门信息,所以在获取员工信息之后,顺便去查询了部门信息,只是没有显示。如下图所示
在这里插入图片描述

在这里插入图片描述

如果获取员工信息后不进行部门信息的查询,就需要在核心配置文件的全局设置中开启延时加载,如下图所示
在这里插入图片描述

此时在获取员工姓名的结果如下图所示,不会查询部门信息

在这里插入图片描述


如果不开启延时加载,查询员工姓名后再查询部门信息,sql语句会先全部执行,执行完之后,再去获取数据。

在这里插入图片描述
在这里插入图片描述
如果开启了延时加载,此时,sql不会全部执行。要获取员工姓名的时候,则执行获取员工姓名的sql语句
要部门信息的时候,则执行获取部门信息的sql语句,这就是延时加载。在这里插入图片描述

3.3.3.1 注意

在核心配置文件mybatis-config.xml中设置了lazyLoadingEnabled和aggressiveLazyLoading的全局配置信息处理延时加载后,
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的sql。另外还可通过association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加 载)|eager(立即加载)”

此时可通过association和 collection中的fetchType属性设置当前的分步查询是否使用延迟加载,fetchType=“lazy(延迟加载)|eager(立即加载)
在这里插入图片描述

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

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

相关文章

Ubuntu配置静态IP的方法

Ubuntu配置静态IP的方法前言一、查看虚机分配的网卡IP二、查看网卡的网关IP三、配置静态IP1.配置IPv4地址2.执行netplan apply使改动生效3.配置的网卡未生效&#xff0c;修改50-cloud-init.yaml文件解决4.测试vlan网络通信总结前言 Ubuntu18.04 欧拉环境 vlan网络支持ipv6场景…

树状数组讲解

树状数组 文章目录树状数组引入例题AcWing241.楼兰图腾思路代码AcWing 242. 一个简单的整数问题思路代码AcWing 244. 谜一样的牛思路代码总结引入 树状数组主要维护的是这样一个数据结构&#xff1a; tr[x]表示以x为终点的长度为lowbit(x)的前缀和 对于树状数组主要就两种操作 …

机器学习系统架构的10个要素

这是一个AI赋能的时代&#xff0c;而机器学习则是实现AI的一种重要技术手段。那么&#xff0c;是否存在一个通用的通用的机器学习系统架构呢&#xff1f;在老码农的认知范围内&#xff0c;Anything is nothing&#xff0c;对系统架构而言尤其如此。但是&#xff0c;如果适用于大…

风力发电机组浪涌保护器安全防护方案

风机的庞大与危险高空作业注定了其在基建和维护中不易操作&#xff0c;风机设备的主电源、过程控制、网络与通讯、现场设备需要高等级的防雷浪涌保护器冲击保护&#xff0c;提高系统及设备的可靠性和可用性。风电场的主要发电设备风力发电机组“大风车”是风电场的主要发电设备…

【数据分析】缺失数据如何处理?pandas

本文目录1. 基础概念1.1. 缺失值分类1.2. 缺失值处理方法2. 缺失观测及其类型2.1. 了解缺失信息2.2. 三种缺失符号2.3. Nullable类型与NA符号2.4. NA的特性2.5. convert_dtypes方法3. 缺失数据的运算与分组 3.1. 加号与乘号规则3.2. groupby方法中的缺失值4. 填充与剔除4.1. fi…

什么是让ChatGPT爆火的大语言模型(LLM)

什么是让ChatGPT爆火的大语言模型(LLM) 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncidref-dev-876561 文章目录什么是让ChatGPT爆火的大语言模型(LLM)大型语言模型有什么用&#xff1f;大型语言模型如何工作&#xff1f;大型语言模型的热门应用在哪里可以找到大型语言…

王道操作系统课代表 - 考研计算机 第一章 计算机概述 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “计算机概述” 章节知识点总结的十分全面&#xff0c;涵括了《操作系统》课程里的全…

(五十七)插入数据时到底是如何维护好不同索引的B+树的?

之前我们已经给大家彻底分析清楚了MySQL数据库的索引结构了&#xff0c;大家都知道不同索引的结构是如何的&#xff0c;大致是如何建立的&#xff0c;然后搜索的时候是如何根据不同的索引去查找数据的。 那么今天我们来给大家彻底讲清楚&#xff0c;你在插入数据的时候&#x…

JavaSE学习笔记day17

零、 复习昨日 File: 通过路径代表一个文件或目录 方法: 创建型,查找类,判断类,其他 IO 输入& 输出字节&字符 try-catch代码 一、作业 给定路径删除该文件夹 public static void main(String[] args) {deleteDir(new File("E:\\A"));}// 删除文件夹public s…

openjdk:8镜像中安装工具命令的方法

文章目录前言一、获取openjdk:8环境1.下载并运行openjdk:82.获取当前镜像的基础环境信息3.更换源并安装软件二、更新Dockerfile1.增加命令2.尝试构建3.测试镜像是否可用总结前言 记录一下openjdk:8镜像安装命令的方法 同事使用openjdk:8作为基础镜像构建业务镜像&#xff0c;但…

蚂蚁CTO线五年测试开发,年后被优化,跟大家唠几句

夙兴夜寐&#xff0c;回顾从毕业出来到现在的这五年&#xff0c;也是在这里给大家抛砖引玉了。先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入蚂蚁金服&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一…

软件测试的主要工作内容是什么

平时说起程序员印象中大都是做Java、做前端、做后端&#xff0c;用着非常晦涩难懂的语言。在电脑前哐哐哐&#xff0c;没一会满屏代码显现出来。然而程序员并不全是印象中这样&#xff0c;还有一部分&#xff1a;他们不常写代码&#xff0c;主要去检查代码&#xff0c;是不是出…

人工智能前置研究-神经元/离子通道

专栏目录: 高质量文章导航_GZVIMMY的博客-CSDN博客 前言: 《生命是什么》:来自有序中的有序,非周期性晶体!有机体内在生命及其外部世界的相互作用,都能被精确的定律所概述,但前提是它自身必须有一个巨大结构,分子数目太少的话,定律也就不准确了。 《神秘的量子生命…

基于RT-Thread完整版搭建的极简Bootloader

项目背景Agile Upgrade: 用于快速构建 bootloader 的中间件。example 文件夹提供 PC 上的示例特性适配 RT-Thread 官方固件打包工具 (图形化工具及命令行工具)使用纯 C 开发&#xff0c;不涉及任何硬件接口&#xff0c;可在任何形式的硬件上直接使用加密、压缩支持如下&#xf…

Python抓取数据具体流程

之前看了一段有关爬虫的网课深有启发&#xff0c;于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来&#xff0c;方便后期其他人一起来学习。 抓取策略 确定目标&#xff1a;重要的是先确定需要抓取的网站具体的那些部分&#xff0c;下面实例是…

MySQL Buffer Pool 详解

1. Buffer Pool 概述 Buffer Pool 到底是什么&#xff1f;从字面上看是缓存池的意思&#xff0c;没错&#xff0c;它其实也就是缓存池的意思。它是MySQL当中至关重要的一个组件&#xff0c;可以这么说&#xff0c;MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。 但…

90%的人都不算会爬虫,这才是真正的技术,从0到高手的进阶

很多人以为学会了urlib模块和xpath等几个解析库&#xff0c;学了Selenium就会算精通爬虫了&#xff0c;但到外面想靠爬虫技术接点私活&#xff0c;才发现寸步难行。 龙叔我做了近20年的程序员&#xff0c;今天就告诉你&#xff0c;真正的爬虫高手应该学哪些东西&#xff0c;就…

相向双指针 leetcode 15 16 18 611

简单介绍 与同向双指针区别就是&#xff0c;同向查找的是子串最明显得区别就是两侧进行搜索比较快 基本得模板如下 while(left < right) {if( ){}else if(){}else{ // left与right得遍历while(){}} }具体以题目为例 两数之和比较简单 不展示了 leetcode 15 三数之和 这个…

NOC·核桃编程马拉松复赛低年级组 A 卷真题

1. 舞台区如下所示,角色足球的初始坐标为(0,0)。等待下图程序运行完毕后,足 球的坐标是多少?( ) A(100,100) B(-100,100) C(100,-100) D(0,0) 2. 亮亮设计了一个“击落陨石”的游戏。点击开始按钮后,陨石会出现在舞台区的随机位置,碰到炸弹后就会消失…

webrtc处理视频丢包的机制

1.摘要WebRTC是一个开源的实时交互式音频和视频通信框架。本文讨论了WebRTC中用于处理视频通信路径中数据包丢失的一些机制。讨论了各种系统细节&#xff0c;提出了一种基于时间层的自适应混合NACK/FEC方法。结果显示了该方法如何控制实时视频通信的质量权衡2.介绍WebRTC[1]是一…