mybatis动态SQL-sql片段

1、建库建表

create database `mybatis-example`;
use `mybatis-example`;
create table emp
(
    empNo   varchar(40),
    empName varchar(100),
    sal int,
    deptno varchar(10)
);
insert into emp values('e001','张三',8000,'d001');
insert into emp values('e002','李四',9000,'d001');
insert into emp values('e003','王五',10000,'d001');
insert into emp values('e004','赵六',11000,'d002');
insert into emp values('e005','田七',12000,'d002');
insert into emp values('e006','周八',13000,'d003');
insert into emp values('e007','吴九',14000,'d004');
insert into emp values('e008','郑十',15000,'d004');
insert into emp values('d8f9b794-95ba-11ee-ab75-84a93ea22bfb','张三丰',16000,'d001');

2、pom.xml

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
 
        <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 
        <!--junit5测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
 
        <!-- 日志 , 会自动传递slf4j门面-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
    </dependencies>

3、Emp.java

package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Emp;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface EmpMapper {
    //1.演示where-if标签
    List<Emp> getEmpList(Emp emp);
 
    //2、演示set标签
    void updateEmp(Emp emp);
 
    //3、演示trim标签
    List<Emp> getEmpList2(Emp emp);
 
    //4、演示choose/when/otherwise标签
    List<Emp> getEmpList3(Emp emp);
 
    //5、演示foreach标签
    List<Emp> getEmpList4(@Param("empNoList") List<String> empNoList);
}

5、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>
 
    <!-- 具体配置 -->
    <!-- 从org.apache.ibatis.session.Configuration类中可以查看能使用的配置项 -->
    <!-- 将mapUnderscoreToCamelCase属性配置为true,表示开启自动映射驼峰式命名规则 -->
    <!-- 规则要求数据库表字段命名方式:单词_单词 -->
    <!-- 规则要求Java实体类属性名命名方式:首字母小写的驼峰式命名 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="autoMappingBehavior" value="FULL"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
 
    <typeAliases>
        <!--<typeAlias type="com.atguigu.mybatis.pojo.Employee" alias="emp"/>-->
        <package name="com.atguigu.mybatis.pojo"/>
    </typeAliases>
 
    <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
    <environments default="development">
        <!-- environment表示配置Mybatis的一个具体的环境 -->
        <environment id="development">
            <!-- Mybatis的内置的事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 建立数据库连接的具体信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
 
    <mappers>
        <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
        <!-- mapper标签:配置一个具体的Mapper映射文件 -->
        <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
        <!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
        <mapper resource="mappers/EmpMapper.xml"/>
    </mappers>
 
</configuration>

6、mappers/EmpMapper.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">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">

    <select id="getEmpList" resultType="Emp">
        select * from emp
        <where>
            <if test="empNo!= null">
                empNo=#{empNo}
            </if>
            <if test="empName!= null">
                and empName=#{empName}
            </if>
            <if test="sal!=null">
                and sal &lt; #{sal}
            </if>
            <if test="deptno!=null">
                and deptno=#{deptno}
            </if>
        </where>
        <!--
                select * from emp
                select * from emp WHERE empNo=?
                select * from emp WHERE sal < ?
                select * from emp WHERE empName=?
                select * from emp WHERE deptno=?
                select * from emp WHERE empNo=? and sal < ?
                select * from emp WHERE empNo=? and empName=? and sal < ?
                select * from emp WHERE empNo=? and empName=? and sal < ? and deptno=?
        -->
    </select>

    <update id="updateEmp">
        update emp
        <set>
            <if test="empName!=null">
                empName=#{empName},
            </if>
            <if test="sal!=null">
                sal=#{sal},
            </if>
            <if test="deptno!=null">
                deptno=#{deptno}
            </if>
        </set>
        where empNo=#{empNo}
        <!--
               update emp SET empName=?, sal=?, deptno=? where empNo=?
               update emp SET empName=? where empNo=?
               update emp                    where empNo=?
        -->
    </update>

    <select id="getEmpList2" resultType="Emp">
        select * from emp
        <trim prefix="where" suffix=";" prefixOverrides="or|and" suffixOverrides="or">
            <if test="empNo!=null">
                or empNo=#{empNo} or
            </if>
            <if test="empName!=null">
                or empName=#{empName} or
            </if>
            <if test="sal!=null">
                or sal &lt; #{sal} or
            </if>
            <if test="deptno!=null">
                or deptno=#{deptno} or
            </if>
        </trim>
    </select>

    <select id="getEmpList3" resultType="Emp">
        select * from emp where
        <choose>
            <when test="empNo!=null">
                empNo=#{empNo}
            </when>
            <when test="empName!=null">
                 empName=#{empName}
            </when>
            <when test="sal!=null">
                 sal &lt; #{sal}
            </when>
            <when test="deptno!=null">
                 deptno=#{deptno}
            </when>
            <otherwise>
                1=1
            </otherwise>
        </choose>
    </select>

    <select id="getEmpList4" resultType="Emp">
        <include refid="allColumns"></include>
        from emp where empNo in
        <foreach collection="empNoList" item="employeeNumber" open="(" close=")" separator=",">
            #{employeeNumber}
        </foreach>
    </select>

    <sql id="allColumns">
        select empNo,empName,sal,deptno,'China' as 'address'
    </sql>
</mapper>

7、logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置,ConsoleAppender表示输出到控制台 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
 
    <!-- 设置全局日志级别。日志级别按顺序分别是:TRACE、DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="DEBUG">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
 
    <!-- 根据特殊需求指定局部日志级别,可以是包名或全类名。 -->
    <logger name="com.atguigu.mybatis" level="DEBUG" />
</configuration>

8、MybatisTest.java

package mybatis;
import com.atguigu.mybatis.mapper.EmpMapper;
import com.atguigu.mybatis.pojo.Emp;
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 org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class MybatisTest {

    SqlSessionFactory sqlSessionFactory;
    SqlSession sqlSession;
    EmpMapper empMapper;

    @BeforeEach
    public void setup() throws IOException {
        // 获取资源流,读取"mybatis-config.xml"文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 使用资源流创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 使用SqlSessionFactory打开一个Session
        sqlSession = sqlSessionFactory.openSession();
        //基于Mapper接口编程
        empMapper=sqlSession.getMapper(EmpMapper.class);
    }

    // 在每个测试用例之后执行的清理方法
    @AfterEach
    public void teardown() {
        sqlSession.commit();  // 提交事务
        sqlSession.close();  // 关闭SqlSession
    }

    @Test
    public void selectWhereIFTest() {
        /**
         * 1、所有条件都不满足
         */
        Emp emp = new Emp();
        empMapper.getEmpList(emp).forEach(System.out::println);//select * from emp
        //Emp(empNo=e001, sal=8000, empName=张三, deptno=d001)
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)
        //Emp(empNo=e003, sal=10000, empName=王五, deptno=d001)
        //Emp(empNo=e004, sal=11000, empName=赵六, deptno=d002)
        //Emp(empNo=e005, sal=12000, empName=田七, deptno=d002)
        //Emp(empNo=e006, sal=13000, empName=周八, deptno=d003)
        //Emp(empNo=e007, sal=14000, empName=吴九, deptno=d004)
        //Emp(empNo=e008, sal=15000, empName=郑十, deptno=d004)
        //Emp(empNo=d8f9b794-95ba-11ee-ab75-84a93ea22bfb, sal=16000, empName=张三丰, deptno=d001)

        /**
         * 2、一个条件满足
         */
        Emp emp1 = new Emp();
        emp1.setEmpNo("e002");
        empMapper.getEmpList(emp1).forEach(System.out::println);//select * from emp WHERE empNo=?
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)

        Emp emp2 = new Emp();
        emp2.setSal(11000);
        empMapper.getEmpList(emp2).forEach(System.out::println);//select * from emp WHERE sal < ?
        //Emp(empNo=e001, sal=8000, empName=张三, deptno=d001)
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)
        //Emp(empNo=e003, sal=10000, empName=王五, deptno=d001)

        Emp emp3 = new Emp();
        emp3.setEmpName("张三丰");
        empMapper.getEmpList(emp3).forEach(System.out::println);//select * from emp WHERE empName=?
        //Emp(empNo=d8f9b794-95ba-11ee-ab75-84a93ea22bfb, sal=16000, empName=张三丰, deptno=d001)

        Emp emp4 = new Emp();
        emp4.setDeptno("d001");
        empMapper.getEmpList(emp4).forEach(System.out::println);//select * from emp WHERE deptno=?
        //Emp(empNo=e001, sal=8000, empName=张三, deptno=d001)
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)
        //Emp(empNo=e003, sal=10000, empName=王五, deptno=d001)
        //Emp(empNo=d8f9b794-95ba-11ee-ab75-84a93ea22bfb, sal=16000, empName=张三丰, deptno=d001)

        /**
         * 2、两个条件满足
         */
        Emp emp5 = new Emp();
        emp5.setEmpNo("e002");
        emp5.setSal(11000);
        empMapper.getEmpList(emp5).forEach(System.out::println);//select * from emp WHERE empNo=? and sal <?
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)

        /**
         * 3、三个条件都满足,以次类推
         */
        Emp emp6 = new Emp();
        emp6.setEmpNo("e002");
        emp6.setSal(11000);
        emp6.setEmpName("张三丰");
        empMapper.getEmpList(emp6).forEach(System.out::println);//select * from emp WHERE empNo=? and empName=? and sal < ?


        /**
         * 4、全部条件满足
         */
        Emp emp100 = new Emp("e001",8001,"张三","d001");
        empMapper.getEmpList(emp100).forEach(System.out::println);//select * from emp WHERE empNo=? and empName=? and sal < ? and deptno=?
        //Emp(empNo=e001, sal=8000, empName=张三, deptno=d001)
    }

    @Test
    public void updateSetIfTest() {

        /**
         * 1、所有条件都满足
         */
        Emp emp = new Emp("e001",4000,"张三","d001");
        empMapper.updateEmp(emp);//update emp SET empName=?, sal=?, deptno=? where empNo=?

        /**
         * 2、部分条件满足
         */
        Emp emp1 = new Emp();
        emp1.setEmpNo("e002");
        emp1.setEmpName("张无忌");
        empMapper.updateEmp(emp1);//update emp SET empName=? where empNo=?

        /**
         * 3、所有条件都不满足,报错SQLSyntaxErrorException
         */
        Emp emp2 = new Emp();
        emp2.setEmpNo("e003");
        empMapper.updateEmp(emp2);

    }

    @Test
    public void trimTest() {
        Emp emp = new Emp();
        empMapper.getEmpList2(emp).forEach(System.out::println);//select * from emp

        Emp emp1 = new Emp();
        emp1.setEmpNo("e001");
        empMapper.getEmpList2(emp1).forEach(System.out::println);//select * from emp where empNo=? ;
    }

    @Test
    public void chooseWhenTest() {

        Emp emp1 = new Emp();
        empMapper.getEmpList3(emp1).forEach(System.out::println);//select * from emp where 1=1

        Emp emp2 = new Emp();
        emp2.setEmpNo("e001");
        empMapper.getEmpList3(emp2).forEach(System.out::println);//select * from emp where empNo=?

        Emp emp3 = new Emp();
        emp3.setEmpNo("e002");
        emp3.setEmpNo("李四");
        empMapper.getEmpList3(emp3).forEach(System.out::println);//select * from emp where empNo=?
    }

    @Test
    public void foreachTest() {
        Emp emp = new Emp();
        empMapper.getEmpList4(Arrays.asList("e001","e002")).forEach(System.out::println);
        //select * from emp where empNo in ( ? , ? )
        //Emp(empNo=e001, sal=4000, empName=张三, deptno=d001)
        //Emp(empNo=e002, sal=9000, empName=李四, deptno=d001)
    }
}

 9、sql片段的作用

  • SQL片段的作用是将重复的SQL语句抽取出来,放到<sql>标签中,可以进行复用。这个SQL片段类似于代码片段,可以将部分SQL语句打包或封装到一个SQL片段里。使用SQL片段可以减少SQL语句冗余,便于SQL语句的维护和管理,类似于Java的方法,可以复用SQL语句。
  • SQL片段的作用是在SQL查询语句中使用,用于实现特定的功能或逻辑。SQL片段可以是一个表达式、函数、操作符、条件语句、连接语句等,它们可以在SQL查询中被引用和执行。使用SQL片段可以简化复杂的查询逻辑、重用代码、提高查询性能以及使查询语句更加可读。例如,可以使用SQL片段来实现计算字段、过滤数据、排序结果等操作。
  • SQL片段的存在是为了提高代码的可维护性和重用性。通过将重复的SQL语句片段抽象和封装,可以减少代码中的冗余,使得代码更加简洁和易于管理。同时,当需要修改或扩展SQL语句时,只需要修改或添加相应的片段,而不需要对整个SQL语句进行修改,从而提高了代码的灵活性和可扩展性。此外,SQL片段还可以提高代码的可读性和可维护性,使得代码更加清晰和易于理解。

SQL片段是SQL代码的一个部分,它可以在大型SQL查询或复杂的数据库操作中使用。以下是为什么要使用SQL片段的一些原因:

  1. 重用性:SQL片段可以在多个查询中重复使用,避免重复编写相同的代码。这有助于简化代码并提高开发效率。

  2. 可维护性:通过将代码逻辑分解为片段,可以更容易地理解和维护。如果需要进行更改或修复,只需更改片段而不是整个查询。

  3. 可读性:较长或复杂的SQL查询可能会变得难以理解。将其分解为片段可以提高代码的可读性,易于阅读和理解。

  4. 灵活性:SQL片段允许开发人员根据需要组合不同的代码块,以创建适应特定需求的查询。这提供了更大的灵活性和可定制性。

  5. 性能优化:通过使用SQL片段,可以更容易地对查询进行优化。可以通过调整和优化片段,以提高整个查询的性能。

总之,SQL片段提供了一种组织和管理SQL代码的有效方式,可以提高开发效率、可维护性和可读性,并允许进行更好的性能优化。

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

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

相关文章

生活是自己的,请尽情打扮,尽情可爱

端庄大气又尽显GAO级感 的明制汉服处处都是是惊喜 领口袖口拼接仿貂毛环保毛条 保暖又精致 袖子贴民族风珠片刺绣织带 门襟搭配金属子母扣 前胸欧根纱刺绣圆形布贴 每一处都是用心制作 红色喜庆&#xff0c;用来做拜年服来穿再合适不过啦

ros2+gazebo建立机器人

Building your own robot In this tutorial we will learn how to build our own robot in SDFormat. We will build a simple two wheeled robot.本文用SDF文件建立一个2轮机器人 You can find the finished SDF file for the tutorial here.SDF文件点击下载 What is SDF SD…

电脑和手机中的日历提醒怎么进行同步

作为一名忙碌的现代人&#xff0c;我常常需要在电脑和手机上记录各种日程和提醒。然而&#xff0c;我发现电脑和手机“日历提醒无法同步”是一个令人头疼的问题。如果我在电脑中添加了一个提醒&#xff0c;但是我没有把它同步到我的手机上&#xff0c;那么当我离开电脑时&#…

关于shell的面试题小练习(三道)

目录 第一题&#xff1a;&#xff08;关于内存&#xff09; 第一步&#xff1a;需了解使用的大纲命令 第二步过滤取得具体所需的值 第三步&#xff1a;具体执行步骤及命令 1&#xff09;安装邮件软件 2&#xff09;编辑脚本 方法一&#xff1a;脚本编辑1 方法二&#x…

玩转 K8s 权限控制:RBAC + kubeconfig 搞定 kubectl 权限管理那些事

1. 先抛需求 当一个 K8s 集群需要被多个租户共享时&#xff0c;就涉及到了权限问题&#xff0c;比如你是管理员&#xff0c;这时候你会面临着“给每个用户分配一个 Namespace”类似的需求。 更进一步&#xff0c;可能你需要限制特定用户只能够对集群进行特定的操作&#xff0c;…

Dialogue Transformers:如何解决医学大模型【偏离主诉和没抓住核心】,建立抗干扰的能力,使得发现用户问题会一追到底?

Dialogue Transformers&#xff1a;实现抗干扰能力的对话模型 抗干扰能力基于 Transformer 的实现技术优化目标 抗干扰能力 前置知识&#xff1a;从【注意力机制】开始&#xff0c;到【Transformer】的零基础【大模型】系列 Dialogue Transformers 论文地址&#xff1a;https:/…

如何用CHAT写复习教案?

近日天气恶劣&#xff0c;好多地方的学校都停课了&#xff0c;改为线上学习&#xff0c;那作为老师&#xff0c;如何安排好线上的教学方案呢&#xff1f;下面小编分享下朋友用CHATGPT写的这份复习教案。 问CHAT&#xff1a;一年级语文上册复习计划教案 CHAT回复&#xff1a;教…

网络安全事件分级指南

文章目录 一、特别重大网络安全事件符合下列情形之一的&#xff0c;为特别重大网络安全事件&#xff1a;通常情况下&#xff0c;满足下列条件之一的&#xff0c;可判别为特别重大网络安全事件&#xff1a; 二、重大网络安全事件符合下列情形之一且未达到特别重大网络安全事件的…

HarmonyOS--基础组件Text

Text组件 可以包含Span子组件。 接口 Text(content? : string | Resource) string: Text(我是ttttt) Resource: Text($r(app.string.aaaaaa)) 先找限定词目录&#xff0c;找不到内容 找base目录 属性 除支持通用属性外&#xff0c;还支持以下属性&#xff1a; 名称 参数…

工厂设备数据采集如何更高效?

​随着工业4.0时代的到来&#xff0c;工厂设备数据采集变得越来越重要。然而&#xff0c;在实际的生产环境中&#xff0c;工厂设备数据采集面临着诸多痛点和难点。本文将分析这些痛点和难点&#xff0c;并介绍如何解决这些问题&#xff0c;提高工厂设备数据采集的效率。 一、工…

Linux 线程池源码剖析

1 了解线程池 1-1线程池的概述 由一个任务队列和一组处理队列的线程组成。一旦工作进程需要处理某个可能“阻塞”的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。 1-2线程池的组件 任务 待处理的工作,通常由标识、上下文和处理…

xilinx 产品系列分类

1. 按照产品代数&#xff0c;分为6代&#xff0c;7代&#xff0c;ultrascale&#xff0c;ultrascale&#xff0c;Versal。6代是较早的器件&#xff0c;现在基本是7代及之后的产品&#xff0c;最新的一代是Versal&#xff0c;网上很多说法提到7系列也即是7代&#xff0c;在第二章…

以柔克刚:软体机器人的柔性革命与无限可能

原创 | 文 BFT机器人 戳“精彩内容”不容错过 你知道什么是软体机器人吗&#xff1f;真的是表面所理解的那样&#xff0c;这个“机器人是软的&#xff1f;”。当然不是啦&#xff01;那下面小编将带你具体解读一下软体机器人的来源与发展。 软体机器人是一类由软体驱动材料构成…

seata的安装及基本使用

seata的安装及基本使用 安装注意事项1. 启动时需要带上seata所在服务器的地址和端口&#xff08;默认是8091&#xff09;2. seata的服务端配置文件application.yml中在配置nacos的namespace时&#xff0c;需要注意的是&#xff1a;对应的值是nacos中namespace的id, 而不是名称&…

3分钟打造私人微信ChatGPT助手:新手友好指南!

接上文&#xff1a; https://mp.weixin.qq.com/s/RCqX0rx7TEu1gIwHEBBWKQ 本文适用于小白用户&#xff0c;技术大佬勿入&#xff01; 前言 这里教大家如何快速的拥有一个属于自己的微信GPT助手 我个人其实不是这么部署的&#xff0c;但是为了方便小白用户&#xff0c;探索了一个…

【AI底层逻辑】——“数学华尔兹”之一元线性回归

一元线性回归模型想必大家都耳熟能详&#xff0c;这里不再赘述。但在使用python中机器学习包时一定见过类似模型评价参数的输出&#xff0c;这一章我们就讲一讲回归分析里一些模型评价概念&#xff01; 一、方差分析ANOVA 方差分析是一种用于确定线性回归模型中不同变量对目标…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提…

数字孪生轻量化引擎——AMRT3D引擎

随着全球经济亟待复苏&#xff0c;作为科技发展主要需求技术之一&#xff0c;数字孪生已经成为全球多个国家重点布局行业。例如&#xff0c;美国工业互联网盟将数字孪生作为工业互联网落地的核心和关键&#xff0c;德国工业4.0参考架构将数字孪生作为重要内容。 数字孪生已经形…

【问题解决】将页面下载为PDF文件(前端实现)

在前端开发过程中&#xff0c;将html页面下载为pdf文件的思路&#xff1a;使用html2canvas和jsPDF两个库&#xff0c;大致流程就是首先使用html2canvas库将组件内容转换为图像&#xff0c;然后使用jsPDF库将图像生成为PDF文件。 安装html2canvas库 npm install html2canvas安…

联邦学习算法介绍-FedAvg详细案例-Python代码获取

联邦学习算法介绍-FedAvg详细案例-Python代码获取 一、联邦学习系统框架二、联邦平均算法&#xff08;FedAvg&#xff09;三、联邦随梯度下降算法 (FedSGD&#xff09;四、差分隐私随联邦梯度下降算法 (DP-FedSGD&#xff09;五、差分隐私联邦平均算法 (DP-FedAVG&#xff09;六…