40. 【Java教程】数据库编程

本小节我们将学习如何使用 Java 语言结合数据库进行编程。注意,学习本小节需要你有一定的 SQL 基础,了解 MySQL 数据库的 基础 CRUD 操作。

本小节我们将选择开源免费的 MySQL 5.7 作为数据库,可以去官网下载并安装 MySQL

通过本小节的学习,你将了解到什么是 JDBC,如何连接数据库,如何关闭数据库,JDBC 的新增、查询、更新和删除接口,如何执行批量等内容。

1. JDBC 概述

1.1 什么是 JDBC

JDBC 就是 Java DataBase Connectivity 的缩写,它是 Java 的标准库,定义了客户端访问数据库的 API。

市面上的数据库有很多种类,连接不同的数据库需要加载不同的数据库驱动。数据库驱动是由厂商提供的,需要我们引入。标准库编写了一套访问数据库的代码,因此不需要标准库代码的改动,只需加载不同的驱动,就可以访问不同的数据库。

1.2 JDBC 的作用

在 JDBC 出现之前,数据库驱动程序由不同的数据库厂商提供,程序员想要操作不同的数据库,就不得不学习各类不同驱动的用法,驱动的学习成本和代码的维护成本都非常高。

Sun 公司发现了这个问题,因此定义了一套标准的访问数据库的 API(即 JDBC),不同厂商按照这个 API 提供的统一接口,实现驱动,这保证了数据库操作的统一性。程序员也不需要再去学习不同厂商提供的五花八门的 API,只需要学习 JDBC 标准 API 即可。代码维护的成本也大大降低。

2. 连接数据库

2.1 建库建表

打开 MySQL 客户端,执行如下 sql 语句:

-- 创建数据库并使用
CREATE DATABASE jdbcdemo;
USE jdbcdemo;

-- 创建数据表
CREATE TABLE `user` (
	`id` int(11) PRIMARY KEY AUTO_INCREMENT,
  `username` varchar(20) NOT NULL comment "用户名",
  `nickname` varchar(20) NOT NULL comment "昵称",
  `password` CHAR(32) NOT NULL comment "密码"
);

-- 插入一些数据
insert into `user` values(null, "Colorful", "Colorful3", "123456");
insert into `user` values(null, "mybj123", "小码", "123456");
insert into `user` values(null, "Lillian", "小李", "123456");

2.2 引入驱动

去 maven 中央仓库找到 mysql-connector-java 驱动。如果你熟悉 Maven,可直接引入 maven 依赖:

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

如果你还不熟悉 Maven,请跟着我来做如下步骤:

到 maven 中央仓库下载 jar 包,鼠标左键单击 jar

在工程目录下新建一个 lib 包,并将刚刚下载好的 jar 包复制到其中:

在 jar 包上点击右键,选择 Add as Library

如果有弹窗,单击确定即可。此时就可以在你的项目中引入驱动里的类了。

2.3 实例

我们下面通过实例代码来演示 JDBC 的简单使用,以下实例代码有这样几个步骤:

  1. 加载数据库驱动;
  2. 建立连接;
  3. 创建 Statement 对象,用于向数据库发送 SQL 语句;
  4. 获取 ResultSet 对象,取出数据,此对象代表结果集;
  5. 释放资源,断开与数据库的连接。

具体实例如下:

package com.mybj.jdbc;

import com.mysql.jdbc.Driver;

import java.sql.*;

public class JDBCDemo1 {

    public static void main(String[] args) throws SQLException {
        // 1. 加载数据库驱动
        DriverManager.registerDriver(new Driver());
        // 2. 建立连接
        final String url = "jdbc:mysql://localhost:3306/jdbcdemo";  // 数据库 url
        final String user = "root"; // 数据库用户名
        final String password = "123456"; // 数据库密码
        Connection connection = DriverManager.getConnection(url, user, password);
        // 3. 创建 Statement 对象,用于向数据库发送 SQL 语句
        String sql = "SELECT * FROM `user`";
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery(sql);
        // 4. 获取 ResultSet 对象,取出数据,此对象代表结果集
        while (resultSet.next()) {
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String nickname = resultSet.getString("nickname");
            String pwd = resultSet.getString("password");
            System.out.println("id=" + id + "; username=" + username + "; nickname=" + nickname + "; password=" + pwd + '\r');
        }
        // 5. 释放资源,断开与数据库的连接(调用close()方法)
        // 5.1 释放 ResultSet
        resultSet.close();
        // 5.2 释放 Statement
        statement.close();
        // 5.3 释放 Connection
        connection.close();
    }
}

运行结果:

id=1; username=Colorful; nickname=Colorful3; password=123456
id=2; username=mybj123; nickname=小码; password=123456
id=3; username=Lillian; nickname=小李; password=123456

看了实例代码,你可能有些晕,这写类都是干嘛的呀?别担心,我们下面就来一一讲解。

4. JDBC 几个类的详解

在上面的实例程序中,我们用到了几个 JDBC 的类:DriverManagerCollectionStatement 和 ResultSet,下面我们将详细介绍这几个类。

4.1 DriverManager

DriverManager 是驱动管理类,此类用于注册驱动和获得连接。

在实际开发中,我们不是像实例这样注册驱动的,我们编写这样地代码会导致驱动注册两次:

// 1. 加载数据库驱动
DriverManager.registerDriver(new Driver());

通过查看 com.mysql.jdbc.Driver 源码,我们发现在静态代码块处已经注册过了驱动:

那么如何改写呢,我们可以使用反射机制来注册驱动:

Class.forName("com.mysql.jdbc.Driver");

加载了 Driver 类,其静态代码块就会执行,因此也就注册了驱动。

除了获得驱动,我们还可以调用 getConnection(url, user, password) 方法来获得连接,其中 url 这个参数不是很好理解:

String url = "jdbc:mysql://localhost:3306/jdbcdemo"; 

其中 jdbc 是协议,mysql 是子协议,localhost 是主机名,3306 是端口号,jdbcdemo 是数据库名。/ 这里的协议是固定地写法,连接不同类型地数据库需要不同地协议。

4.2 Connection

Connection 是连接对象,它可以创建执行 SQL 语句的对象,还可以进行事务的管理。

下面列举了 Connection 类的常用实例方法:

  • Statement createStatement():创建执行 SQL 语句对象,又 SQL 注入风险;
  • PrepareStatement prepareStatement(String sql):预编译 SQL 语句,解决 SQL 注入的漏洞;
  • CallableStatement prepareCall(String sql):执行 SQL 中存储过程;
  • setAutoCommit(boolean autoCommit):设置事务是否自动提交;
  • commit():事务提交;
  • rollback():事务回滚。

4.3 Statement

Statement 是执行 SQL 语句的对象,下面列举了 Statement 类的常用实例方法:

  • boolean execute(String sql):执行 SQL 语句,如果返回的第一个结果为 ResultSet 对象,则返回 true,如果其为更新计数或者不存在任何结果,则返回 false。该方法不常用;
  • ResultSet executeQuery(String sql):执行 SQL 中的 select 语句;
  • int executeUpdate(String sql):执行 SQL 中的 insertupdatedelete 语句,返回影响的行数。

Statement 还可以执行批量操作,关于批量操作,我们将在下面学习。

4.4 ResultSet

ResultSet 是结果集对象,它是 select 语句查询的结果的封装。下面列举了 ResultSet 类的常用实例方法:

  • boolean next():将光标从当前位置向前移一行,判断是否有下一行记录;
  • getString(String columnLable):以 Java 语言中 String 的形式获取此 ResultSet 对象的当前行中指定的值;
  • getInt(String columnLable):以 Java 语言中 int 的形式获取此 ResultSet 对象的当前行中指定的值;
  • getXXX():对于不同类型的数据,可以使用 getXXX() 来获取数据(例如 getString()getInt()),另外还有一个通用的 getObject() 方法,用于获取所有 Object 类型的数据。

4.5 JDBC 资源的释放

JDBC 程序运行完成后,一定要记得释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是 ResultSetStatement 和 Connection 对象。特别是 Connection 对象,它是非常稀有的资源,用完后必须马上释放,如果此对象不能及时、正确的关闭,极易导致系统的宕机。Connection 对象的使用原则是尽量晚创建,尽量早释放。

5. CRUD

5.1 新增数据

在执行新增数据的代码前,user 表中有如下数据:

mysql> select * from user;
+----+--------------+--------------+----------+
| id | username     | nickname     | password |
+----+--------------+--------------+----------+
|  1 | Colorful     | Colorful3    | 123456   |
|  2 | mybj123      | 小码         | 123456   |
|  3 | Lillian      | 小李         | 123456   |
+----+--------------+--------------+----------+
3 rows in set (0.00 sec)

新增数据的实例代码如下:

package com.mybj.jdbc;

import java.sql.*;

public class JDBCDemo2 {

    /**
     * 插入语句
     * @return 受影响的行数
     */
    public static int insert() {
        final String url = "jdbc:mysql://localhost:3306/jdbcdemo";  // 数据库 url
        final String user = "root"; // 数据库用户名
        final String password = "123456"; // 数据库密码

        Connection connection = null;
        Statement  statement = null;
        int result = 0;

        try {
            // 1. 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 建立连接
            connection = DriverManager.getConnection(url, user, password);
            // 3. 创建 Statement 对象,用于向数据库发送 SQL 语句
            String sql = "INSERT INTO `user` VALUES(null, \"testUsername\", \"testNickname\", \"123456\")";
            statement = connection.createStatement();
            result = statement.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4. 释放资源,断开与数据库的连接(调用close()方法)
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                // 此处手动设置为 null,有益于垃圾回收机制更早地回收对象
                connection = null;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int rows = JDBCDemo2.insert();
        System.out.println("受影响的行数为:" + rows);
    }

}

运行结果:

受影响的行数为:1

此时,查询数据库中的记录,可以发现多了 1 条:

mysql> select * from user;
+----+--------------+--------------+----------+
| id | username     | nickname     | password |
+----+--------------+--------------+----------+
|  1 | Colorful     | Colorful3    | 123456   |
|  2 | mybj123      | 小码         | 123456   |
|  3 | Lillian      | 小李         | 123456   |
|  4 | testUsername | testNickname | 123456   |
+----+--------------+--------------+----------+
4 rows in set (0.00 sec)

5.2 读取数据

读取数据的示例如下:

package com.mybj.jdbc;

import java.sql.*;

public class JDBCDemo3 {

    /**
     * 根据 id 查询用户
     * @param id 用户的 id
     */
    public static void selectUserById(int id) {
        final String url = "jdbc:mysql://localhost:3306/jdbcdemo";  // 数据库 url
        final String user = "root"; // 数据库用户名
        final String password = "123456"; // 数据库密码
        Connection connection = null;
        Statement statement = null;
        ResultSet result = null;
        try {
            // 1. 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 建立连接
            connection = DriverManager.getConnection(url, user, password);
            // 3. 创建 Statement 对象,用于向数据库发送 SQL 语句
            String sql = "SELECT * FROM `user` WHERE id = " + id;
            statement = connection.createStatement();
            // 4. 获取 ResultSet 对象,取出数据
            result = statement.executeQuery(sql);
            while (result.next()) {
                String nickname = result.getString("nickname");
                String username = result.getString("username");
                String pwd = result.getString("password");
                System.out.println("id=" + id + "; username=" + username + "; nickname=" + nickname + "; password=" + pwd + '\r');
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 5. 释放资源,断开与数据库的连接(调用close()方法)
            if (result != null) {
                try {
                    result.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                result = null;
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                // 此处手动设置为 null,有益于垃圾回收机制更早地回收对象
                connection = null;
            }
        }
    }

    public static void main(String[] args) throws SQLException {
        JDBCDemo3.selectUserById(4);
    }

}

运行结果:

id=3; username=Lillian; nickname=小李; password=123456

5.3 更新数据

在执行更新数据的代码前,user 表中有如下数据:

mysql> select * from user;
+----+--------------+--------------+----------+
| id | username     | nickname     | password |
+----+--------------+--------------+----------+
|  1 | Colorful     | Colorful3    | 123456   |
|  2 | mybj123      | 小码         | 123456   |
|  3 | Lillian      | 小李         | 123456   |
|  4 | testUsername | testNickname | 123456   |
+----+--------------+--------------+----------+
4 rows in set (0.00 sec)

更新数据的实例代码如下:

package com.mybj.jdbc;

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

public class JDBCDemo4 {

    /**
     * 更新
     * @return 受影响的行数
     */
    public static int updateById(int id) {
        final String url = "jdbc:mysql://localhost:3306/jdbcdemo";  // 数据库 url
        final String user = "root"; // 数据库用户名
        final String password = "123456"; // 数据库密码
        Connection connection = null;
        Statement  statement = null;
        int result = 0;

        try {
            // 1. 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 建立连接
            connection = DriverManager.getConnection(url, user, password);
            // 3. 创建 Statement 对象,用于向数据库发送 SQL 语句
            String sql = "UPDATE `user` SET `nickname` = '更新后的nickname' WHERE id = " + id;
            statement = connection.createStatement();
            result = statement.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4. 释放资源,断开与数据库的连接(调用close()方法)
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                // 此处手动设置为 null,有益于垃圾回收机制更早地回收对象
                connection = null;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int rows = JDBCDemo4.updateById(4);
        System.out.println("受影响的行数为:" + rows);
    }

}

运行结果:

受影响的行数为:1

更新数据代码执行完成后,可以观察到 id 为 4 的记录 nickname 字段发生了改变:

mysql> select * from user;
+----+--------------+----------------------+----------+
| id | username     | nickname             | password |
+----+--------------+----------------------+----------+
|  1 | Colorful     | Colorful3            | 123456   |
|  2 | mybj123      | 小码                 | 123456   |
|  3 | Lillian      | 小李                 | 123456   |
|  4 | testUsername | 更新后的nickname     | 123456   |
+----+--------------+----------------------+----------+
4 rows in set (0.00 sec)

5.4 删除数据

在执行删除数据的代码前,user 表中有如下数据:

mysql> select * from user;
+----+--------------+----------------------+----------+
| id | username     | nickname             | password |
+----+--------------+----------------------+----------+
|  1 | Colorful     | Colorful3            | 123456   |
|  2 | mybj123      | 小码                 | 123456   |
|  3 | Lillian      | 小李                 | 123456   |
|  4 | testUsername | 更新后的nickname     | 123456   |
+----+--------------+----------------------+----------+
4 rows in set (0.00 sec)

删除数据的实例代码如下:

package com.mybj.jdbc;

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

public class JDBCDemo5 {

    /**
     * 删除
     * @return 受影响的行数
     */
    public static int deleteById(int id) {
        final String url = "jdbc:mysql://locahost:3306/jdbcdemo";  // 数据库 url
        final String user = "root"; // 数据库用户名
        final String password = "123456"; // 数据库密码

        Connection connection = null;
        Statement  statement = null;
        int result = 0;

        try {
            // 1. 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 建立连接
            connection = DriverManager.getConnection(url, user, password);
            // 3. 创建 Statement 对象,用于向数据库发送 SQL 语句
            String sql = "DELETE FROM `user` WHERE id = " + id;
            statement = connection.createStatement();
            result = statement.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 4. 释放资源,断开与数据库的连接(调用close()方法)
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                statement = null;
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                // 此处手动设置为 null,有益于垃圾回收机制更早地回收对象
                connection = null;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        int rows = JDBCDemo5.deleteById(4);
        System.out.println("受影响的行数为:" + rows);
    }

}

运行结果:

受影响的行数为:1

在执行删除数据的代码后,可观察到 id 为 4 的记录被成功删除,数据库只剩下了 3 行记录:

mysql> select * from user;
+----+--------------+----------------------+----------+
| id | username     | nickname             | password |
+----+--------------+----------------------+----------+
|  1 | Colorful     | Colorful3            | 123456   |
|  2 | mybj123      | 小码                 | 123456   |
|  3 | Lillian      | 小李                 | 123456   |
+----+--------------+----------------------+----------+
3 rows in set (0.00 sec)

6. 批量操作

当我们需要向 user 表插入多条数据的时候,可以循环调用我们在上面 JDBCDemo2 实例代码中封装的 insert() 方法,但这样的效率是非常低的。

Statement 对象有如下常用的用于批量操作的方法:

  • void addBatch(String sql):将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中;
  • int[] executeBatch():将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组;
  • void clearBatch():清空此 Statement 对象的当前 SQL 命令列表。

7. 小结

通过本小节的学习,我们了解了 JDBC 定义了客户端访问数据库的 API,不同厂商通过实现统一的 JDBC 接口,降低了程序员的学习成本和维护成本。
DriverManager 类用于注册驱动和获得连接;
Connection 是连接对象,它可以创建执行 SQL 语句的对象,还可以进行事务的管理;
Statement 是执行 SQL 语句的对象、ResultSet 是结果集对象,它是 select 语句查询的结果的封装。
为了防止 SQL 注入,推荐使用 PrepareStatement 对象来预编译 SQL 语句,对于内容相同,参数不同的 SQL,推荐使用 JDBC 的 batch 操作,可大大提高执行效率。

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

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

相关文章

【Gitlab】访问默认PostgreSQL数据库

本地访问PostgreSQL gitlab有可以直接访问内部PostgreSQL的命令 sudo gitlab-rails dbconsole # 或者 sudo gitlab-psql -d gitlabhq_production效果截图 常用SQL # 查看用户状态 select id,name,email,state,last_sign_in_at,updated_at,last_credential_check_at,last_act…

【React】配置别名路径@

别名路径配置 1. 路径解析配置&#xff08;webpack&#xff09; CRA本身把webpack配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件 - craco步骤 安装craco npm i -D craco/craco项目根目录下创建配置文件 craco.config.js配置文件中添加路径解析配置 const pa…

无法在地址[localhost]和端口[8005]上创建服务器关闭套接字(基本端口[8005]和偏移量[0])

今天小伙伴问我一个问题&#xff0c;说是新服务器启动应用&#xff0c;报了一个错误&#xff0c;如下&#xff1a; 一开始我怀疑是端口被占用 经过排查端口没有被占用&#xff0c;然后我怀疑localhost解析有问题 经过 ping localhost 后&#xff0c;得到以下结果到这里很明…

基于若依的ruoyi-nbcio-plus里抄送人多页选择人员的bug修复

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

阿里云香港服务器怎么样?

大家都知道阿里云是国内最受欢迎的云服务商&#xff0c;那么阿里云香港服务器究竟怎么样呢&#xff1f;和硅云的香港服务器用于做外贸网站等业务相比各有哪些优缺点呢&#xff1f; 阿里云和硅云在香港云服务领域有着广泛的应用和良好的口碑。然而&#xff0c;它们各自的特点和…

短剧cps平台有哪些,短剧cps系统搭建

一、短剧CPS平台主要包括以下几个&#xff1a; 1&#xff0c;快手平台 拥有庞大的用户基础和活跃的短剧消费群体&#xff0c;通过快手的推广&#xff0c;短剧可以获得更多的曝光。同时&#xff0c;快手还提供CPS分佣模式。 2&#xff0c;抖音平台 作为国内最大的短视频平台…

我国的AI大模型前景如何?

目前&#xff0c;我国的AI大模型市场前景很好。这个产业的发展源于多领域的广泛需求&#xff0c;包括办公、制造、金融、医疗、政务等场景中的降本增效、生产自动化、降低风险、提高诊断准确率、提高政务服务效率等诉求。这些领域的创新和发展共同推动了我国AI大模型产业的蓬勃…

CentOS7服务器中安装openCV4.8的教程

参考链接&#xff1a;Centos7环境下cmake3.25的编译与安装 参考链接&#xff1a;Linux安装或者升级cmake&#xff0c;例子为v3.10.2升级到v3.25.0(自己指定版本) 参考链接&#xff1a;Linux安装Opencv&#xff08;C&#xff09; 一、下载资源 1.下载cmake3.25.0的压缩包&am…

zerotier自建moon方法

简介 使用zerotier已经有一段时间了&#xff0c;现在偶尔会出现服务器连接不上的情况。我就想自己建个moon来试试。记录一下过程&#xff0c;用作备忘录。 准备工作 准备一个有公网IP的云主机。我用的是“三丰云”&#xff0c;速度很快同时提供"免费虚拟主机"和“免费…

第17章通信系统架构设计理论与实践

常见的5种常用的网络架构和构建网络的相关技术&#xff0c;以及网络构建的分析和设计方法。 17.1通信系统概述 通信技术和网络技术的发展&#xff0c;通信网络发生很大变化&#xff0c;入网的形式变化&#xff0c;传输的速率的提高、接入网络的方式多样化、网络结构的更为复杂…

“中国第一慢病医疗平台”冲刺港股IPO,方舟云康如何脱颖而出?

“中国第一线上慢性病管理平台”--方舟云康&#xff0c;6月10日通过了港交所聆讯&#xff0c;预计将在香港主板IPO上市。 作为一家2015年成立的互联网医疗企业&#xff0c;方舟云康此前分别在2022年11月、2023年6月、2024年2月三次递表。从最初的坚持数智化管理模式&#xff0…

如何通俗并尽可能详细地解释卡尔曼滤波?

参考书 射影定理 递推射影公式 关于线性流型 source&#xff1a; 线性流型_百度百科 后续再更。

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC Isilon S200集群存储&#xff0c;共三个节点&#xff0c;每节点配置12块SATA硬盘。 服务器存储故障&#xff1a; 工作人员误操作删除虚拟机&#xff0c;虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…

中心极限定理的MATLAB例

独立同分布的中心极限定理&#xff1a; 设 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​ 是独立同分布的随机变量序列&#xff0c;且 E ( X i ) μ E(X_i) \mu E(Xi​)μ&#xff0c; D ( X i ) σ 2 > 0 D(X_i) \sigma^2 > 0 D(Xi​)σ2>0&a…

收藏一些毕业论文技术路线图

*信息来源&#xff1a;xhs 立青Jill 原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247693272&idx3&snf6c8513eaee894c5158dc5c3620bf93c&chksmfa76ace5cd0125f3169b2782c137f6308c6d201d3a845db1be8b397758a1f11e3719524e601b&token18515…

九种常见可视化大屏入场动效,绝对足够惊艳。

Hi&#xff0c;10经验的前端开发和UI设计老司机→贝格前端工场&#xff0c;为您分享。本期带来一批可视化大屏的入场动效&#xff0c;这种效果绝对是先声夺人&#xff0c;惊艳无数人。 在可视化大屏中&#xff0c;入场动画是非常重要的&#xff0c;可以通过各种形式的动画效果…

基于WPF技术的换热站智能监控系统07--实现左侧数据报表

1、区域划分 2、UI布局 LiveCharts是一个比较漂亮的WPF图表控件&#xff0c;在数据变化时还会有动画切换的效果&#xff0c;并且样式也可以控制。 Values&#xff1a;数据值 Fill&#xff1a;填充颜色 StrokeThickness:粗细 LabelPosition:标签位置 3、运行效果 走过路过不…

额定值高于 1 kW 的电机驱动应用使用 GaN 逆变器 IC

GaN 技术的三个重要的参数是更高的带隙、临界场和电子迁移率。当这些参数结合起来时&#xff0c;由于 GaN 晶体的临界场高 10 倍&#xff0c;因此与硅 MOSFET 相比&#xff0c;电端子之间的距离可以近 10 倍。这导致了 GaN 和硅之间的明显区别&#xff1a;中压 GaN 器件可以基于…

Python 最强的5个高级函数,你会几个?

Python是一门灵活而强大的编程语言&#xff0c;具有丰富的内置函数和库。今天&#xff0c;我们将深入探讨五个非常有用的Python高级函数。这些函数不仅能够简化代码&#xff0c;还能提高代码的可读性和可维护性。 首先&#xff0c;了解下什么是高级函数&#xff1f; 高级函数…

SpringBoot不用写Controller、不用写Service、不用建表,直接起飞是什么感觉

Spring Data REST 提供了一种简单的方式来暴露 JPA 实体为 RESTful 服务&#xff0c;这使得构建基于 REST 的数据服务变得非常快速和高效。下面是一个使用 Spring Data REST 构建通用架构的基本示例&#xff1a; 首先&#xff0c;我们需要创建一个实体类&#xff08;例如&…