Java入坑之 数据库编程

news2025/3/9 10:32:53

一、基础概念

1.1JDBC 步骤

导入驱动jar包
注册驱动
获取数据库连接对象 Connection
DataSource dSource;
dSource.getConnection();
定义sql语句
String sql = "update account set balance = 500 where id = 1";
获取执行sql语句的对象 Statement
PreparedStatement stmt = conn. prepareStatement(sql);
执行sql,接受返回结果
 int count = stmt.executeUpdate(sql);
处理结果 System.out.println(count);
释放资源  stmt.close(); conn.close();

 1.2相关类介绍

1.3相关代码

在Maven中声明MySQL的JDBC实现依赖

1.3.1查询

package org.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectTest {
    public static void main(String[] args) {
        // 注册 MySQL 驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
            return;
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建 Java 和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            System.out.println("连接数据库成功!");

            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建 Statement 成功!");

            // 执行 SQL 语句并返回结果到 ResultSet
            ResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");

            // 开始遍历 ResultSet 数据
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "," + rs.getString(2) + "," + rs.getInt("price"));
            }

            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                    System.out.println("关闭数据库连接成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

1.3.2增删改

package org.example;

import java.sql.*;

public class UpdateTest {
    public static void main(String[] args) {
        executeUpdate("update book set price = 300 where bookid = 1");
        executeUpdate("insert into book(bookid, bookname, price) values(4, '编译原理', 90)");
        executeUpdate("delete from book where bookid = 4");
    }

    /**
     * 执行数据更新操作
     * @param sql 要执行的 SQL 语句
     */
    public static void executeUpdate(String sql) {
        // 注册 MySQL 驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建 Java 和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            System.out.println("连接数据库成功!");

            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建 Statement 成功!");
            int rs = stmt.executeUpdate(sql);
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                    System.out.println("关闭数据库连接成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

1.3.3事务逻辑

package org.example;

import java.sql.*;

public class TransactionTest {
    public static void main(String[] args) throws Exception {
        // 构建Java和数据库之间的桥梁介质
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }
        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            conn.setAutoCommit(false);

            insertBook(conn, "insert into book values(101, 'aaaa', 10)");
            insertBook(conn, "insert into book values(102, 'bbbb', 10)");
            insertBook(conn, "insert into book values(103, 'cccc', 10)");

            Savepoint phase1 = conn.setSavepoint(); // 设置一个保存点

            insertBook(conn, "insert into book values(104, 'cccc', 10)");
            insertBook(conn, "insert into book values(105, 'cccc', 10)");

            conn.rollback(phase1); // 回滚到phase1保存点,即上面2行无效
            conn.commit();

            System.out.println("操作成功");
        } catch (SQLException e) {
            e.printStackTrace();
            conn.rollback();
        } finally {
            if (null != conn) {
                conn.close();
            }
        }
    }

    public static void insertBook(Connection conn, String sql) {
        try {
            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            // 执行SQL语句
            int result = stmt.executeUpdate(sql);
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

1.3.4拼接字符串 

package org.example;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class InsertTest {
    public static void main(String[] a) {
        //concatInsertBook();
        unsafeConcatInsertBook();
    }

    public static void concatInsertBook() {
        // 构建Java和数据库之间的桥梁介质
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建Statement成功!");
            // 执行SQL语句
            int bookid = 11;
            String bookName = "Effective Java";
            int price = 50;
            String sql = "insert into book(bookid,bookname,price) values("
                    + bookid + ", '" + bookName + "', " + price + ")";
            int result = stmt.executeUpdate(sql);
            stmt.close();
            System.out.println("操作成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void unsafeConcatInsertBook() {
        // 构建Java和数据库之间的桥梁介质
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建Statement成功!");
            // 执行SQL语句
            int bookid = 13;
            String bookName = "Effective Java',50);delete from t_book;insert into t_book values(101, 'faked book";
            int price = 50;
            String sql = "insert into book(bookid,bookname,price) values("
                    + bookid + ", '" + bookName + "', " + price + ");";
            System.out.println(sql);
            int result = stmt.executeUpdate(sql);
            stmt.close();
            System.out.println("操作成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

1.3.5batch函数

package org.example;

import java.sql.*;

public class InsertTest1 {
    public static void main(String[] a) {
        safeInsertBook();
        batchInsertBook();
    }

    public static void safeInsertBook() {
        Connection conn = null;
        try {
            // 注册 MySQL 驱动
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            String sql = "insert into book(bookid,bookname,price) values (?, ?, ?)";
            // 构建数据库执行者
            PreparedStatement pstmt = conn.prepareStatement(sql);

            // 设置参数
            int bookid = 15;
            String bookName = "Effective Java',50);delete from t_book;insert into t_book values(101, 'faked book";
            int price = 50;
            pstmt.setInt(1, bookid);
            pstmt.setString(2, bookName);
            pstmt.setInt(3, price);

            // 执行SQL语句
            int result = pstmt.executeUpdate();
            pstmt.close();
            System.out.println("操作成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                    System.out.println("关闭数据库连接成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void batchInsertBook() {
        Connection conn = null;
        try {
            // 注册 MySQL 驱动
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            String sql = "insert into book(bookid,bookname,price) values (?,?,?)";
            // 构建数据库执行者
            PreparedStatement pstmt = conn.prepareStatement(sql);

            // 设置参数
            String bookName = "aaaaaaaaaaaaaaaa";
            int price;

            // 执行批量插入操作
            for (int i = 210; i < 202; i++) {
                price = 50;
                pstmt.setInt(1, i);
                pstmt.setString(2, bookName);
                pstmt.setInt(3, price);
                pstmt.addBatch();
            }
            pstmt.executeBatch();
            pstmt.close();
            System.out.println("操作成功");
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                    System.out.println("关闭数据库连接成功!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

如果有大量的sq语句,它们结构相同,仅仅差别在具体数值上,那么可以通过addBatch
方法进行批量操作。这样会提高性能,减少数据库负担。 

1.3.6ResultSetMetaData类

package org.example;

import java.sql.*;

public class ResultSetMetaDataTest {
    public static void main(String[] args) {
        // 构建Java和数据库之间的桥梁介质
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("注册驱动成功!");
        } catch (ClassNotFoundException e1) {
            System.out.println("注册驱动失败!");
            e1.printStackTrace();
            return;
        }

        String url = "jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC";
        Connection conn = null;
        try {
            // 构建Java和数据库之间的桥梁:URL,用户名,密码
            conn = DriverManager.getConnection(url, "root", "b123456");
            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建Statement成功!");
            // 执行SQL语句并返回结果到ResultSet
            ResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");
            // 获取结果集的元数据
            ResultSetMetaData meta = rs.getMetaData();
            int cols = meta.getColumnCount();
            for (int i = 1; i <= cols; i++) {
                System.out.println(meta.getColumnName(i) + "," + meta.getColumnTypeName(i));
            }
            rs.close();
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 二、数据库连接池

2.1流程重述

2.2亨元模式 

享元模式, Flyweight Pattern
-  经典23个设计模式的一种,属于结构型模式。
- 一个系统中存在大量的相同的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。

 2.3 数据库连接池概念

2.4C3P0连接池

2.4.1配置文件

   <!-- https://mvnrepository.com/artifact/com.mchange/c3pθ -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

2.4.2相关代码

package org.example;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SelectTest1 {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 从c3p0获取数据库连接
            conn = C3p0Factory1.getConnection();
            //conn = C3p0Factory2.getConnection();
            从Druid获取
            conn = DruidFactory1.getConnection();
            //conn = DruidFactory2.getConnection();
            // 构建数据库执行者
            Statement stmt = conn.createStatement();
            System.out.println("创建Statement成功!");

            // 执行SQL语句并返回结果到ResultSet
            ResultSet rs = stmt.executeQuery("select bookid, bookname, price from book order by bookid");

            // 开始遍历ResultSet数据
            while (rs.next()) {
                System.out.println(rs.getInt(1) + "," + rs.getString(2) + "," + rs.getInt("price"));
            }

            rs.close();
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2.4.3相关配置

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>    <!--  默认配答 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </default-config>
</c3p0-config>

package org.example;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;

public class C3p0Factory2 {
    private static ComboPooledDataSource dataSource = null;

    public static void init() throws Exception {
        // 创建 ComboPooledDataSource 实例,会自动加载 c3p0-config.xml 文件的配置
        dataSource = new ComboPooledDataSource();
        // 此时 dataSource 是一个完全配置好的可用连接池 DataSource
    }

    public static Connection getConnection() throws Exception {
        if (null == dataSource) {
            init();
        }
        // 返回从连接池获取的数据库连接
        return dataSource.getConnection();
    }
}

2.4.4 DruidData类

package org.example;

import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;

public class DruidFactory1 {
    private static DruidDataSource dataSource = null;

    public static void init() throws Exception {
        dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("b123456");
        dataSource.setUrl("jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC");
        dataSource.setInitialSize(5);
        dataSource.setMinIdle(1);
        dataSource.setMaxActive(10);
        // 启用监控统计功能
        dataSource.setFilters("stat");
    }

    public static Connection getConnection() throws Exception {
        if (null == dataSource) {
            init();
        }
        return dataSource.getConnection();
    }
}

 2.4.6配置

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/t_book?serverTimezone=UTC
username=root
password=b123456
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
package org.example;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class DruidFactory2 {
    private static DruidDataSource dataSource = null;

    public static void init() throws Exception {
        Properties properties = new Properties();
        // 加载属性文件 druid.properties
        InputStream in = DruidFactory2.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(in);
        // 通过属性创建 Druid 数据源
        dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        in.close();
    }

    public static Connection getConnection() throws Exception {
        if (null == dataSource) {
            init();
        }
        return dataSource.getConnection();
    }
}

三、基于web的数据库开发

3.1配置DataSource

3.2相关类(driverClassName,驱动类)

3.3Connection接口

java.sql.Connection接口表示与特定数据库的会话。在Connection的上下文中,执行SQL语句并返回结果。Connection接口对于连接到数据库和执行SQL语句至关重要。

3.4Statement接口 

Statement接口是Java执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement接口提供了执行语句和获取结果的基本方法。PreparedStatement接口添加了处理IN参数的方法;而CallableStatement添加了处理OUT参数的方法。

​​​​​​​

3.5PreparedStatement接口

PreparedStatement接口是Java中的一个接口,它是用来执行预编译的SQL语句的。PreparedStatement是Statement的子接口,继承了Statement的所有功能。PreparedStatement接口提供了补充占位符变量的方法 

​​​​​​​ 

 

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

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

相关文章

Linux权限维持—Strace监控Alias别名Cron定时任务

Linux权限维持—Strace监控&Alias别名&Cron定时任务 1. 前言2. 隐藏手法2.1. 时间伪造2.1.1. 修改时间 2.2. 隐藏文件2.3. chattr命令2.3.1. 命令参考2.3.2. 属性添加2.3.3. 属性解除 2.4. 历史命令2.4.1. 隐藏命令 2.5. 清除登录日志2.5.1. 清除登录成功日志2.5.2. 清…

计算机竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/po…

Linux:编写编译脚本Makefile文件

一、生成可执行文件 1、一个源文件编译 本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。 1).c文件 // testadd.c #include <stdio.h> int main() {int a 1;int b 2;int sum a b;printf("sum %d\n", sum);return 0; }// Makefie GXX g CC gcc…

详解!视频云存储/安防监控视频AI智能分析平台区域入侵/周界报警功能

区域入侵/周界报警入侵检测技术是TSINGSEE青犀智能分析平台推出的一种视频监控系统&#xff0c;可检测划定区域内是否有可疑人员并且在检测出这样的事件时生成警报。 视频监控/安防监控/视频存储TSINGSEE青犀视频智能分析平台可以在监控范围内划定特定区域&#xff0c;有人员入…

@Transactional注解和Mybatis缓存问题,Mybatis 查询结果 List 对List修改后再次查询,结果与数据库不一致

Mybatis 查询结果 List 对List修改后再次查询&#xff0c;结果与数据库不一致 使用 Mybatis 查询&#xff0c;结果为对象的 List &#xff0c;修改List内的参数后&#xff0c;使用相同参数再次查询&#xff0c;发现查询结果与数据库不一致&#xff0c;而是第一次查询结果操作后…

L0,L1,L2范数(双竖线,有下标)

概念&#xff1a;”范数是具有“长度”概念的函数。在向量空间内&#xff0c;为所有的向量的赋予非零的增长度或者大小。不同的范数&#xff0c;所求的向量的长度或者大小是不同的。 举个例子&#xff0c;2维空间中&#xff0c;向量(3,4)的长度是5&#xff0c;那么5就是这个向量…

C#使用自定义的比较器对版本号(编码)字符串进行排序

给定一些数据&#xff0c;如下所示: “1.10.1.1.1.2”, “1.1”, “2.2”, “1.1.1.1”, “1.1.3.1”, “1.1.1”, “2.10.1.1.1”, “1.1.2.1”, “1.2.1.1”, “2.5.1.1”, “1.10.1.1”, “1.10.2.1”, “1.11.3.1”, “1.11.12.1”, “1.11.11.1”, “1.11.3.1”, “1”, “…

通过springMVC拦截器进行后台统一校验

通过springMVC拦截器统一解析token&#xff0c;判断是否有效。可以对请求进行前置或后置处理 /*** 配置拦截器*/ public class TokenInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,…

必备技巧:使用RHEL系统角色让Podman自动化

微思| 微思| 红帽RHCE试听课程&#xff1a;linux系统下&#xff0c;用这个命令可以提高60%的工作效率 自动化有助于提高效率、节省时间并提高一致性。所以红帽企业Linux&#xff08;RHEL&#xff09;包含了许多让任务自动化的功能。RHEL系统角色是一组Ansible内容&#xff0…

JMeter 接口自动化测试:从入门到精通的完全指南

JMeter 是一个开源的负载测试工具&#xff0c;它可以模拟多种协议和应用程序的负载&#xff0c;包括 HTTP、FTP、SMTP、JMS、SOAP 和 JDBC 等。在进行接口自动化测试时&#xff0c;使用 JMeter 可以帮助我们快速地构建测试用例&#xff0c;模拟多种场景&#xff0c;发现接口的性…

只出现一次的数字——力扣136

class Solution {public:int singleNumber(vector<int>& nums) {int res=0

Linux 可重入、异步信号安全和线程安全

可重入函数 当一个被捕获的信号被一个进程处理时&#xff0c;进程执行的普通的指令序列会被一个信号处理器暂时地中断。它首先执行该信号处理程序中的指令。如果从信号处理程序返回&#xff08;例如没有调用exit或longjmp&#xff09;&#xff0c;则继续执行在捕获到信号时进程…

k8s节点pod驱逐、污点标记

一、设置污点&#xff0c;禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后&#xff0c;可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…

【ThingJS | 3D可视化】开发框架,一站式数字孪生

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; 数字孪生 | 3D可视化框架 开发工具&#xff1a;ThingJS在线开发工具 ThingJs 低代码开发 ThingJs 低代码开发注意点场景效果配置层级层级常用API实例化 Thing&#xff0c;加载场景load 加载函数ThingJs 层级关系图查找层…

带你走进 字节跳动 消息队列

区别于#创作活动那一篇文章&#xff0c;这篇文章有我自己的重点内容颜色标记等注释&#xff0c;有注释的参加不了那个活动&#xff0c;所以发了两篇&#xff0c;不久之后那篇文章将会删除 消息队列前世今生 1.1 案例一&#xff1a; 系统崩溃 首先大家跟着我想象一下下面的这个的…

(2023)Linux安装pytorch并使用pycharm远程编译运行

&#xff08;2023&#xff09;Linux安装pytorch并使用pycharm远程编译运行 安装miniconda 这部分参考我这篇博客的前半部分Linux服务器上通过miniconda安装R&#xff08;2022&#xff09;_miniconda 安装r_Dream of Grass的博客-CSDN博客 创建环境 创建一个叫pytorch的环境…

Nodejs-nrm:快速切换npm源 / npm官方源和其他自定义源之间切换

一、理解 Nodejs nrm Nodejs nrm 是一个管理 npm 源的工具。由于 npm 在国内的速度较慢&#xff0c;很多开发者会使用淘宝的 npm 镜像源&#xff0c;但是也会遇到一些问题&#xff0c;例如某些包在淘宝镜像源中不存在&#xff0c;或者淘宝镜像源本身也会有问题。 Nodejs nrm …

【C++ 学习 ⑯】- 继承(上)

目录 一、继承的概念和定义 1.1 - 概念 1.2 - 定义 二、继承时的对象内存模型 三、向上转型和向下转型 四、继承时的名字遮蔽问题 4.1 - 有成员变量遮蔽时的内存分布 4.2 - 重名的基类成员函数和派生类成员函数不构成重载 一、继承的概念和定义 1.1 - 概念 C 中的继承…

java八股文面试[java基础]——浅拷贝和深拷贝

自验证&#xff1a;创建Class Student两个类&#xff0c; Student中含有Class对象 public class Class implements Cloneable {public String getName() {return name;}public void setName(String name) {this.name name;}private String name;public Class(String name) {t…

无涯教程-PHP - IntlChar类

在PHP7中&#xff0c;添加了一个新的 IntlChar 类&#xff0c;该类试图公开其他ICU函数。此类定义了许多静态方法和常量&#xff0c;可用于操作unicode字符。使用此类之前&#xff0c;您需要先安装 Intl 扩展名。 <?phpprintf(%x, IntlChar::CODEPOINT_MAX);print (IntlCh…