详解Mybatis之自动映射 自定义映射问题

编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6

文章目录

  • 一、Mybatis中的自动映射是什么?
  • 二、Mybatis中的自定义映射是什么?
  • 三、为什么要使用自定义映射[resultMap]?
  • 四、自定义映射[resultMap]可以适用哪些场景?
    • 4.1 resultMap之级联映射
      • 4.1.1 级联映射之association映射[1:1]
      • 4.1.2 级联映射之collection映射[1:m]
    • 4.2 总结ResultMap中的相关标签及属性
    • 4.3 分步查询
      • 4.3.1 一对一的关联关系
      • 4.3.2 一对多的关联关系
      • 4.3.3 扩展
  • 五、Mybatis如何使用延迟加载【懒加载】?


在这里插入图片描述


一、Mybatis中的自动映射是什么?

Mybatis中的自动映射不是什么高大上的技术名词,而是我们使用Mybatis框架进行持久化层开发时常用select元素中的常见属性resultType它可以自动将数据库内表中的字段与类中的属性进行关联映射,故而得名。


二、Mybatis中的自定义映射是什么?

👉定义

自定义映射,简而言之,就是resultMap。Mybatis官方将resultMap称为结果映射,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。

👉设计思想

对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。


三、为什么要使用自定义映射[resultMap]?

💡原因

它可以解决自动映射[resultType]解决不了的两类问题

哪两类问题?

  • 🍓多表连接查询时,需要返回多张表的结果集

    不信?请看如下测试案例

    测试案例:通过员工id获取员工信息及员工所属的部门信息

    ①准备数据

    在这里插入图片描述

    在这里插入图片描述

    ②在Mapper接口书写相应的方法

    代码示例如下:

    //通过员工id获取员工信息及员工所属的部门信息
    public List<Employee> showempByempId(int empId);
    

    ③在接口对应的映射文件中书写相应的sql

    代码示例如下:

    <select id="showempByempId" resultType="employee">
        SELECT
            e.`id`,
            e.`last_name`,
            e.`email`,
            e.`salary`,
            d.`dpt_id`,
            d.`dpt_name`
        FROM
            `tbl_employee` e, `tbl_department` d
        WHERE
            e.`dept_id`=d.`dpt_id`
        AND
            e.`id`=1;
    </select>
    

    ③测试

    @Test
    public void test01(){
    
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
            //通过SqlSessionFactory对象调用openSession();
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            //获取EmployeeMapper的代理对象
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
    
            List<Employee> employees = employeeMapper.showempByempId(1);
            System.out.println(employees);
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    }
    

    在这里插入图片描述

    🙋 为什么员工所属的部门信息查不出来?

    🙇 原因

    书写的sql涉及到多表查询,映射文件中相应select子标签的属性为resultType。该属性不支持映射多表查询后的结果集,需要用到自定义映射来解决该问题

  • 🍓单表查询时,不支持驼峰式自动映射【如果不想为字段定义别名】

自定义映射【resultMap】:自动映射解决不了的问题,可以交给自定义映射

👇 注意

resultType与resultMap只能同时使用一个


四、自定义映射[resultMap]可以适用哪些场景?

4.1 resultMap之级联映射

🙋 何为级联映射?

👇 答曰

级联映射是指在保存主对象时,将关联的对象也一起保存到数据库中。例如,对于一对多或者多对一、多对多等关系对象时,当保存某个一对象时,与这个依赖的对象都应该自动保存或更新。比如:部门和员工表,一对多关系,当保存部门数据时,和部门有关联的员工表也同时保存。

用法案例

基于第三节中的案例,在映射文件中使用resultMap来解决多表查询后结果集中dept值为null的问题

代码示例如下:

①在在映射文件中使用自定义映射

<resultMap id="empAnddeptResultMap" type="employee">
    <!--  column:返回的结果集中的字段  property:返回值类型(employee)中的属性,要映射的类      -->
    <!--  id属性是定义主键字段与属性之间的关联关系      -->
    <id column="id" property="id"></id>

    <!--  result属性是定义非主键字段与属性之间的关联关系      -->
    <result column="last_name" property="lastName"></result>
    <result column="email" property="email"></result>
    <result column="salary" property="salary"></result>
    <result column="dpt_id" property="dept.deptId"></result>
    <result column="dpt_name" property="dept.deptName"></result>
</resultMap>




<select id="showempByempId" resultMap="empAnddeptResultMap">
    SELECT
        e.`id`,
        e.`last_name`,
        e.`email`,
        e.`salary`,
        d.`dpt_id`,
        d.`dpt_name`
    FROM
        `tbl_employee` e, `tbl_department` d
    WHERE
        e.`dept_id`=d.`dpt_id`
    AND
        e.`id`=1;
</select>

②测试运行

在这里插入图片描述

4.1.1 级联映射之association映射[1:1]

👉特点

解决一对一的关联关系

👉用法案例

基于4.1小结中的案例,对映射文件中的sql部分进行association映射的改写,观察效果

代码示例如下:

①对映射文件中的sql部分进行association映射的改写

<resultMap id="empAnddeptResultMap" type="employee">
    <!--  column:返回的结果集中的字段  property:返回值类型(employee)中的属性,要映射的类      -->
    <!--  id属性是定义主键字段与属性之间的关联关系      -->
    <id column="id" property="id"></id>

    <!--  result属性是定义非主键字段与属性之间的关联关系      -->
    <result column="last_name" property="lastName"></result>
    <result column="email" property="email"></result>
    <result column="salary" property="salary"></result>
  

    <!--  javaType: 用来指定某个属性(dept)或字段在 Java 代码中所对应的具体数据类型 (mybatis.pojo.Dept)    -->
    <!--  dept属性指的是employee对象中的属性    -->
    <association property="dept" javaType="mybatis.pojo.Dept">
        <id column="dpt_id" property="deptId"></id>
        <result column="dpt_name" property="deptName"></result>
    </association>


</resultMap>


<select id="showempByempId" resultMap="empAnddeptResultMap">
    SELECT
        e.`id`,
        e.`last_name`,
        e.`email`,
        e.`salary`,
        d.`dpt_id`,
        d.`dpt_name`
    FROM
        `tbl_employee` e, `tbl_department` d
    WHERE
        e.`dept_id`=d.`dpt_id`
    AND
        e.`id`=1;
</select>

②测试运行

在这里插入图片描述

4.1.2 级联映射之collection映射[1:m]

👉特点

解决一对多的关联关系

👉用法案例

根据部门编号查询对应的部门信息,然后拿着部门编号去员工表里去找所属的员工信息(此时部门与员工是一对多的关系)

代码示例如下:

准备数据

在这里插入图片描述

①在DeptMapper接口书写相应的方法

//根据部门编号查询对应的部门信息,然后拿着部门编号去员工表里去找所属的员工信息(一对多)
public Dept showEmployeesByDeptId(int deptId);

②在在DeptMapper接口对应的映射文件中书写相应的sql

<!-- collection property="employees" ofType="mybatis.pojo.Employee" -> 在Dept类中名为employees的集合中存储的元素类型  -->
    <resultMap id="showEmployeesByDeptIdResultMap" type="dept">
        <id property="deptId" column="dpt_id"></id>
        <result property="deptName" column="dpt_name"></result>

        <collection property="employees" ofType="mybatis.pojo.Employee">
            <!--  id属性是定义主键字段与属性之间的关联关系      -->
            <id column="id" property="id"></id>

            <!--  result属性是定义非主键字段与属性之间的关联关系      -->
            <result column="last_name" property="lastName"></result>
            <result column="email" property="email"></result>
            <result column="salary" property="salary"></result>
        </collection>


    </resultMap>

    <select id="showEmployeesByDeptId" resultMap="showEmployeesByDeptIdResultMap">
        SELECT
            e.`id`,
            e.`last_name`,
            e.`email`,
            e.`salary`,
            d.`dpt_id`,
            d.`dpt_name`
        FROM
            `tbl_employee` e, `tbl_department` d
        WHERE
            e.`dept_id`=d.`dpt_id`
        AND
            d.`dpt_id`=#{dptId};
    </select>

③测试

@Test
public void test04(){

    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取EmployeeMapper的代理对象
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        
        //查询部门编号为1的部门信息,并得到所属员工的所有员工信息
        Dept dept = deptMapper.showEmployeesByDeptId(1);
        System.out.println(dept);

    } catch (IOException e) {
        e.printStackTrace();
    }

}

在这里插入图片描述

4.2 总结ResultMap中的相关标签及属性

  • resultMap标签自定义映射标签

    • id属性定义唯一标识
    • type属性设置映射类型
  • resultMap子标签

    • id标签定义主键字段与属性关联关系

    • result标签定义非主键字段与属性关联关系

      • column属性定义表中字段名称
      • property属性定义类中属性名称
    • associationi标签定义一对一的关联关系

      • property属性定义关联关系属性
      • javaType属性定义关联关系属性的类型
      • select属性设置分步查询SQL全路径
      • colunm属性设置分步查询SQL中需要参数
      • fetchType:设置局部延迟加载【懒加载】
    • collection标签定义一对多的关联关系

      • property属性定义关联关系属性
      • ofType属性定义关联关系属性类型
      • select属性设置分步查询SQL全路径
      • colunm属性设置分步查询SQL中需要参数
      • fetchType:设置局部延迟加载【懒加载】是否开启

4.3 分步查询

🙋 为什么使用分步查询【分步查询优势】?

将多表连接查询,改为【分步单表查询】,从而提高程序运行效率

4.3.1 一对一的关联关系

👉用法案例

使用分步查询实现通过员工id获取员工信息及员工所属的部门信息,比如说1.通过员工id获取员工信息,2.通过员工信息中的部门id获得所属部门得信息(员工与部门是一对一的关系,即一个员工只能归属一个部门)

代码示例如下:

①在EmployeeMapper接口中定义实现通过员工id获取员工信息的方法

//使用分步查询实现通过员工id获取员工信息及员工所属的部门信息
//1.通过员工id获取员工信息
//2.通过员工信息中的部门id获得所属部门得信息
public Employee selectEmpByempId(int empId);

②在DeptMapper接口中定义实现通过从查出来的员工信息中的部门编号去查所属部门信息

//通过部门id查询所属部门得信息
public Dept selectDeptByDeptId(int deptId);

③在EmployeeMapper接口对应的映射文件书写相应的sql

 <resultMap id="selectEmpByempIdResultMap" type="mybatis.pojo.Employee">
        <id property="id" column="id"></id>
        <result property="lastName" column="last_name"></result>
        <result property="email" column="email"></result>
        <result property="salary" column="salary"></result>

<!--  column="deptId"  设置分步查询SQL中需要得参数dept_Id;将此值传入到mybatis.mapper.DeptMapper中的selectDeptByDeptId()方法中     -->
        <association property="dept"
                     select="mybatis.mapper.DeptMapper.selectDeptByDeptId"
                     column="dept_Id"   >

        </association>

    </resultMap>




    <select id="selectEmpByempId" resultMap="selectEmpByempIdResultMap">
        SELECT
            `id`,
            `last_name`,
            `email`,
            `salary`,
            `dept_id`
        FROM
            `tbl_employee`
       WHERE
            `id`=#{empId};

    </select>

④在DeptMapper接口对应的映射文件中书写相应的sql

<resultMap id="selectDeptByDeptIdResultMap" type="dept">
    <id property="deptId" column="dpt_Id"></id>
    <result property="deptName" column="dpt_name"></result>
</resultMap>

<select id="selectDeptByDeptId" resultMap="selectDeptByDeptIdResultMap">
    select
        dpt_Id,
        dpt_name
    from
        tbl_department
    where
        dpt_Id=#{dptId}
</select>

⑤测试

@Test
public void test02(){

    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取EmployeeMapper的代理对象
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee = employeeMapper.selectEmpByempId(2);
        System.out.println(employee);

    } catch (IOException e) {
        e.printStackTrace();
    }

}

在这里插入图片描述

4.3.2 一对多的关联关系

👉用法案例

通过部门id获取部门信息,及部门所属员工信息【使用分步查询来实现】,其中按1.通过部门id获取部门信息;2.通过部门id获取员工信息等这两个步骤完成分步查询

代码示例如下:

①在DeptMapper接口中书写查询通过部门id获取部门信息的方法

//通过部门id获取部门信息
public Dept showEmployeesByDeptIdBetter(int deptId);

②在DeptMapper接口对应的映射文件中书写相应的sql

<!--  type="dept" 设置映射类型为dept,为什么不是dept类的全称,因为我在配置文件给它起了别名  -->
    <resultMap id="showEmployeesByDeptIdBetterResultMap" type="dept">
        <id property="deptId" column="dpt_id"></id>
        <result property="deptName" column="dpt_name"></result>

        <collection property="employees"
                    select="mybatis.mapper.EmployeeMapper#selectEmployeeByempId"
                    column="dpt_Id">

        </collection>
    </resultMap>

    <select id="showEmployeesByDeptIdBetter" resultMap="showEmployeesByDeptIdBetterResultMap">
        SELECT
            `dpt_id`,
            `dpt_name`
        FROM
            `tbl_department`
        WHERE
            `dpt_id`=#{dptId};

    </select>

③在EmployeeMapper接口中书写查询通过部门id获取所属员工信息的方法

//通过部门id查询对应的员工信息
public Employee selectEmployeeByempId(int empId);

④在EmployeeMapper接口对应的映射文件中书写相应的sql

<select id="showEmployeesByDeptIdBetter" resultMap="showEmployeesByDeptIdBetterResultMap">
    SELECT
        `dpt_id`,
        `dpt_name`
    FROM
        `tbl_department`
    WHERE
        `dpt_id`=#{dptId};

</select>

⑤测试

@Test
//测试分步查询版(根据部门编号查询对应的部门信息,然后拿着部门编号去员工表里去找所属的员工信息)
public void test05(){

    try {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //通过SqlSessionFactory对象调用openSession();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取EmployeeMapper的代理对象
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept = deptMapper.showEmployeesByDeptId(1);
        System.out.println(dept);

    } catch (IOException e) {
        e.printStackTrace();
    }

}

在这里插入图片描述

4.3.3 扩展

如果使用分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成 Map来进行传递,语法如下:{k1=v1,k2=v2}


五、Mybatis如何使用延迟加载【懒加载】?

🙋什么是延迟加载?

需要时加载,不需要暂时不加载,如何理解?举个生活中的例子,就好比当你非常饥饿时,才会去吃饭

👉优势

可以提高程序运行效率

👉语法

🚀①全局设置

在核心配置文件中这样写,示例代码如下

<settings>
    <!--    开启驼峰命名自动映射    -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>

    <!--  开启全局延迟加载模式      -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--  关闭按需延迟加载模式,在3.4.2版本及以后该步骤可省略      -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

👉用法案例

在核心配置文件开启全局延迟加载模式,借助8.6小结中的案例代码,演示全局延迟加载模式的效果

代码示例如下:

测试运行如下

try {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //通过SqlSessionFactory对象调用openSession();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //获取EmployeeMapper的代理对象
    EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

    Employee employee = employeeMapper.selectEmpByempId(2);
    System.out.println("employee.getLastName() = "+employee.getLastName());
    System.out.println("--------------------------------------");
    System.out.println("employee.getDept() = "+employee.getDept());

} catch (IOException e) {
    e.printStackTrace();
}

在这里插入图片描述

🚀②局部设置

  • fetchType
    • eager关闭局部延迟加载
    • lazy开启局部延迟加载

👉用法案例

在上述案例中EmployeeMapper接口对应的映射文件里属性id的值为"selectEmpByempId"的sql设置关闭延迟加载(已经设置了全局延迟加载模式,这里再开启局部延迟加载,效果不明显,遂采用关闭局部延迟加载测试效果)

代码示例如下:

    <resultMap id="selectEmpByempIdResultMap" type="mybatis.pojo.Employee">
        <id property="id" column="id"></id>
        <result property="lastName" column="last_name"></result>
        <result property="email" column="email"></result>
        <result property="salary" column="salary"></result>

<!--  column="deptId"  设置分步查询SQL中需要得参数dept_Id;将此值传入到mybatis.mapper.DeptMapper中的selectDeptByDeptId()方法中     -->
        <!--   fetchType="lazy" 为此方法设置局部延迟加载                   -->
        <association property="dept"
                     select="mybatis.mapper.DeptMapper.selectDeptByDeptId"
                     column="dept_Id"
               
                     fetchType="lazy"   >

        </association>

    </resultMap>

    <select id="selectEmpByempId" resultMap="selectEmpByempIdResultMap">
        SELECT
            `id`,
            `last_name`,
            `email`,
            `salary`,
            `dept_id`
        FROM
            `tbl_employee`
       WHERE
            `id`=#{empId};

    </select>

运行测试如下

在这里插入图片描述


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

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

相关文章

Spring的创建及使用

文章目录 什么是SpringSpring项目的创建存储Bean对象读取Bean对象getBean()方法 更简单的读取和存储对象的方式路径配置使用类注解存储Bean对象关于五大类注解使用方法注解Bean存储对象Bean重命名 Bean对象的读取 使用Resource注入对象Resource VS Autowired同一类型多个bean对…

租赁固定资产管理

智能租赁资产管理系统可以为企业单位提供RFID资产管理系统。移动APP资产管理&#xff0c;准确总结易损耗品和固定资金&#xff0c;从入库到仓库库存实时跟踪&#xff0c;控制出库和入库的全过程。同时&#xff0c;备件和耗材与所属资产设备有关&#xff0c;便于备件的申请和管理…

express学习笔记3 - 三大件

便于统一管理router&#xff0c;创建 router 文件夹&#xff0c;创建 router/index.js&#xff1a; const express require(express)// 注册路由 const router express.Router() router.get(/,function(req,res){res.send(让我们开始express之旅) }) /*** 集中处理404请求的…

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

python与深度学习(十二):CNN和猫狗大战二

目录 1. 说明2. 猫狗大战的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章猫狗大战训练的模型进行测试。…

NIDEC COMPONENTS尼得科科宝滑动型DIP开关各系列介绍

今天AMEYA360对尼得科科宝电子滑动型DIP开关各系列参数进行详细介绍&#xff0c;方便大家选择适合自己的型号。 系列一、滑动型DIP开关 CVS 针脚数&#xff1a;1, 2, 3, 4, 8 安装类型&#xff1a;表面贴装&#xff0c;通孔 可水洗&#xff1a;无 端子类型&#xff1a;PC引脚(只…

PostgreSql 进程及内存结构

一、进程及内存架构 PostgreSQL 数据库运行时&#xff0c;使用如下命令可查询数据库进程&#xff0c;正对应上述结构图。 [postgreslocalhost ~]$ ps -ef|grep post postgres 8649 1 0 15:05 ? 00:00:00 /app/pg13/bin/postgres -D /data/pg13/data postgres …

一文掌握linux系统管理命令

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

百度:文心千帆 网页搭建和示例测评

文章目录 官方文档代码示例token获取流式回答官网完整示例 制作一个网页端 官方文档 https://cloud.baidu.com/doc/WENXINWORKSHOP/s/flfmc9do2按照这个操作进行创建一个应用&#xff1a; 代码示例 token获取 # 填充API Key与Secret Key import requests import jsondef ma…

earth靶机详解

earth靶机复盘 靶场下载地址&#xff1a;https://download.vulnhub.com/theplanets/Earth.ova 这个靶场还是非常有意思的&#xff0c;值得去打一下。 我们对拿到的ip进行一个单独全面的扫描&#xff0c;发现有两个DNS解析。 就把这两条解析添加到hosts文件中去&#xff0c;要…

Java maven的下载解压配置(保姆级教学)

mamen基本概念 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 Maven 除了以程序构建能力为特色之外&#xff0c;还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性&#xff0c;所以…

分布式异步任务处理组件(五)

节点上线和下线的逻辑-- 节点下线分为两种--心跳失败主动或被动和主节点断开连接&#xff0c;但是节点本身没有发生重启&#xff1b;第二种就是节点宕机重启--其实这两中情况下处理逻辑都是一样的&#xff0c;只是节点本身如果还能消费到kafka的时候可以继续执行任务但是不能从…

Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储

深入理解Cookie与Session&#xff1a;实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断…

[SSM]GoF之代理模式

目录 十四、GoF之代理模式 14.1对代理模式的理解 14.2静态代理 14.3动态代理 14.3.1JDK动态代理 14.3.2CGLIB动态代理 十四、GoF之代理模式 14.1对代理模式的理解 场景&#xff1a;拍电影的时候&#xff0c;替身演员去代理演员完成表演。这就是一个代理模式。 演员为什…

数控机床主轴品牌选择及选型,如何维护和保养?

数控机床主轴品牌选择及选型&#xff0c;如何维护和保养&#xff1f; 数控机床是一种高精度、高效率、高自动化的机床。其中&#xff0c;主轴是数控机床的核心部件&#xff0c;承担着转动工件、切削加工的任务&#xff0c;决定了加工的转速、切削力度和加工效率。因此&#xff…

解决多线程环境下单例模式同时访问生成多个实例

如何满足单例&#xff1a;1.构造方法是private、static方法、if语句判断 ①、单线程 Single类 //Single类&#xff0c;定义一个GetInstance操作&#xff0c;允许客户访问它的唯一实例。GetInstance是一个静态方法&#xff0c;主要负责创建自己的唯一实例 public class LazySi…

八大排序算法--快速排序(动图理解)

快速排序 概念 快速排序是对冒泡排序的一种改进。其基本原理是通过选取一个基准元素&#xff0c;将数组划分为两个子数组&#xff0c;分别对子数组进行排序&#xff0c;最终实现整个数组的有序排列。快速排序的时间复杂度最好为O(nlogn)&#xff0c;最坏为O(n^2)&#xff0c;…

Jupyter Notebook 7重磅发布,新增多个特性!

本文分享Jupyter Notebook大版本v7.0.0更新亮点&#xff0c;及简单测试&#xff01; 近日&#xff0c;Jupyter Notebook大版本v7.0.0更新&#xff0c;Jupyter Notebook 7基于JupyterLab&#xff0c;因此它包含了过去几年JupyterLab中添加的许多新功能和改进&#xff0c;部分亮…

学习笔记——压力测试案例,监控平台

测试案例 # 最简单的部署方式直接单机启动 nohup java -jar lesson-one-0.0.1-SNAPSHOT.jar > ./server.log 2>&1 &然后配置执行计划&#xff1a; 新建一个执行计划 配置请求路径 配置断言配置响应持续时间断言 然后配置一些查看结果的统计报表或者图形 然后我…

Linux之 centos、Ubuntu 安装常见程序 (-) Mysql 5.7 版本和8.0版本

CentOS 安装 MySql 注意 需要有root权限 安装5.7版本 – 由于MySql并不在CentOS的官方仓库中&#xff0c;所以需要通过rmp命令&#xff1a; 导入MySQL仓库密钥 1、配置MySQL的yum仓库 配置yum仓库 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 安装…
最新文章