mybatis动态SQL-choose-when-otherwise

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.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    private String empNo;
    private Integer sal;
    private String empName;
    private String deptno;
}

4、EmpMapper.java

package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Emp;
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、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>
</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;
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=?
    }
}

 9、choose/when/otherwise标签

在MyBatis中,choosewhen, 和 otherwise 标签是用于条件判断的。它们可以组合在一起,形成一个条件判断的链式结构。

  1. choose 标签:

    • choose 标签内部可以包含多个 when 和/或 otherwise 子标签。
    • 当所有条件都不满足时,会执行 otherwise 中的内容。
    • 可以使用 otherwise 标签来指定默认的操作或返回值。
  2. when 标签:

    • when 标签用于判断条件是否满足。
    • 如果条件满足,则执行 when 标签中的内容。
    • 条件表达式可以使用 MyBatis 的动态 SQL 语法,例如 ${variable} 或 ${#variable}
  3. otherwise 标签:

    • 当所有条件都不满足时,会执行 otherwise 标签中的内容。
    • otherwise 标签通常用于提供一个默认的选项或值。

下面是一个简单的示例,展示了如何使用这些标签:

<select id="selectUsers" resultType="User">  
  SELECT * FROM user  
  WHERE 1=1  
  <choose>  
    <when test="name != null">  
      AND name = #{name}  
    </when>  
    <when test="age != null">  
      AND age = #{age}  
    </when>  
    <otherwise>  
      AND status = 'ACTIVE'  
    </otherwise>  
  </choose>  
</select>

在上面的示例中,我们根据不同的条件来构建查询语句。如果 name 不为空,则添加一个条件来过滤名字;如果 age 不为空,则添加一个条件来过滤年龄。如果两个条件都为空,则使用默认的条件来过滤状态为 'ACTIVE' 的用户。

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

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

相关文章

从零开始搭建企业管理系统(三):集成 Spring Data Jpa

集成 Spring Data Jpa 什么是 Jpa什么是 Spring Data Jpa什么是 HibernateJPA、Spring Data Jpa、Hibernate 之间的关系集成 Spring Data JpaPOM 依赖配置文件UserEntity启动程序Jpa 配置Jpa 注解UserRepositoryUserServiceUserServiceImplUserControllerBaseEntity 什么是 Jpa…

YOLOv8-Seg改进:ASF-YOLO助力小目标分割| 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自多尺度图像的全局或高级语义信息;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8-seg创新专栏:ht…

什么是接口测试?如何做接口测试

接口测试是指对系统或应用程序接口进行测试&#xff0c;以验证接口的功能、可靠性、性能、安全性等方面的需求是否被满足。接口测试可以用于测试不同系统、模块、组件之间的交互和通信&#xff0c;包括 Web 接口、网络接口、数据库接口等。其重点是测试数据传输、数据格式、数据…

CTF竞赛二进制类题型解析(逆向工程、二进制漏洞利用、缓冲区溢出)

在CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;二进制&#xff08;Binary&#xff09;类题型通常涉及逆向工程、二进制漏洞利用、缓冲区溢出等方面的挑战。这些题目考验参赛者对底层编程和系统安全的理解。以下是15道二进制类题目及其标准答案&#xff0c;并…

【深度学习】PHP操作mysql数据库总结

一.PHP数据库的扩展分类 1.MySQL 扩展是针对 MySQL 4.1.3 或更早版本设计的&#xff0c;是 PHP 与 MySQL数据库交互的早期扩展。由于其不支持 MySQL 数据库服务器的新特性&#xff0c;且安全性差&#xff0c;在项目开发中不建议使用&#xff0c;可用 MySQLi 扩展代替。 2.MySQ…

python:五种算法(PSO、RFO、HHO、WOA、GWO)求解23个测试函数(python代码)

一、五种算法简介 1、粒子群优化算法PSO 2、红狐优化算法RFO 3、哈里斯鹰优化算法HHO 4、鲸鱼优化算法WOA 5、灰狼优化算法GWO 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary program…

设计模式再探——装饰模式

目录 一、背景介绍二、思路&方案三、过程1.装饰模式简介2.装饰模式的类图3.装饰模式代码4.装饰模式&#xff0c;职责父类拆分的奥义5.装饰模式&#xff0c;部件抽象类的无中生有 四、总结五、升华 一、背景介绍 最近公司在做架构模型的时候&#xff0c;涉及到装饰模式的研…

ChatGLM3:打造更智能、更安全的代码解释器和工具使用体验

ChatGLM3 是由智谱AI训练的第三代大型语言模型&#xff0c;它不仅能理解和生成人类语言&#xff0c;还能执行代码、调用工具&#xff0c;并以 markdown 格式进行响应。为了提高用户体验&#xff0c;同时避免用户输入的注入攻击&#xff0c;ChatGLM3 采用了全新的对话格式。下载…

Qt::UniqueConnection和lambda一块用无效

如果槽函数是lambda。 那么用了Qt::UniqueConnection也会出现槽函数被多次调用的问题。 原因&#xff1a; 参考官方文档&#xff1a; QObject Class | Qt Core 5.15.16https://doc.qt.io/qt-5/qobject.html#connect

小航助学2023年9月电子学会Scratch二级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 单选题2.00分 删除编辑附件图文 答案:D 第1题点击绿旗&#xff0c;运行程序后&#xff0c;舞台上的图形是&#xff1f;&#xff08; &#xff09; A、画笔粗细…

【JMeter】使用nmon进行性能资源监控

一、前言 ​ 在工作中可能会遇到需要在压测的时候对Linux服务器进行性能资源监控的情况。这时可以用nmon来对服务器进行监控。 二、nmon的下载安装 1.查看系统信息 shell cat /etc/os-release结果为 shell PRETTY_NAME"Debian GNU/Linux 12 (bookworm)" NAME&qu…

Linux shell编程学习笔记35:seq

0 前言 在使用 for 循环语句时&#xff0c;我们经常使用到序列。比如&#xff1a; for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列&#xff0c;Linux提供了…

AdobeXD 是什么?你想知道的都在这里!

AdobeXD 是一个功能强大的原型创建工具。使用这个工具&#xff0c;你可以更快地开发你的设计。让你的项目有条不紊&#xff0c;消除拖延工作流程的重复任务和单调任务。快速与开发团队分享详细的设计规范。使用 AdobeXD 能够把创意迅速转化为原型&#xff0c;创建、构建、共享原…

vivado约束方法2

排序约束条件 因为XDC约束是按顺序应用的&#xff0c;并且是基于明确的优先级排列的规则&#xff0c;您必须仔细检查约束的顺序。 Vivado IDE为您的设计提供了全面的可视性。要逐步验证约束&#xff0c;请执行以下操作&#xff1a; 1.运行相应的报告命令。 2.查看Tcl控制台…

I/O设备模型

I/O设备模型 绝大部分的嵌入式系统都包括一些I/O&#xff08;Input/Outut&#xff0c;输入/输出&#xff09;设备&#xff0c;例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的Flash或SD卡&#xff0c;以及网络设备的以太网接口等。 I/O设备模型…

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本&#xff08;Version&#xff09;首部长度&#xff08;Header Length&#xff09;区分服务&#xff08;Differentiated Services Field&#xff09;可选字段填充总长度&#xff08;Total Length&#xff09;标识、标…

算法Day32 买卖椰子水

买卖椰子水 Description 在海滩上&#xff0c;一杯椰子水的售价为5元。一名顾客一次购买一杯椰子水&#xff08;按照bills支付的顺序&#xff09;。 每位顾客购买椰子水时&#xff0c;可能向你支付 5 元、10 元或 20 元。你必须给每个顾客正确找零&#xff0c;对于支付 5 元的…

CentOS7 OpenSSL升级到OpenSSH9.5p1

原文链接&#xff1a; CentOS7 OpenSSL升级1.1.1w&#xff1b;OpenSSH 升级 9.5p1 保姆级教程 openssl从3.1.0升级到3.1.1遇到的问题 注意操作时需要联网请参考如下链接 内网服务器联网安装依赖参见我的另一篇文章 一、 前言 OpenSSH 的加密功能需要用到OpenSSL&#xff0c;所…

在服务器上配置jupyter notebook便于本地访问

文章目录 需求配置1. 安装jupyter2. 生成配置文件3. 设置登录密码并生成秘钥a. 打开服务器的终端b. 设置密码 4. 修改配置文件a. 进入配置文件所在的文件夹b. 编辑配置文件jupyter_notebook_config.pyc. 保存文件 5. 在服务器上生成jupyter访问地址 关注公众号&#xff1a;『 …

别整那么复杂,一二三就行了!Windows下vscode运行c++代码

这里写自定义目录标题 别整那么复杂&#xff0c;三步就行&#xff01;Windows下vscode运行c代码下载VScode&#xff1a;https://code.visualstudio.com/Download#安装四个插件下载mingw-64&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/大功告成&am…