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

news2024/11/16 23:48:45

本小节我们将学习如何使用 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 操作,可大大提高执行效率。

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

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

相关文章

nosql数据库的特点

NoSQL简介 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守ACID约束。因此…

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

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

SpringBoot集成slf4j日志配置

目录 前言 1、slf4j概述 2、pom.xml的日志依赖 3、application.yml的日志配置 4、logback.xml配置文件定义 5、logback.xml配置文件解析 5.1 定义日志的存储路径 5.2 定义日志的输出格式 5.3 定义控制台输出 5.4 定义日志相关参数 5.5 定义日志的输出级别 6、测试日…

mysql中 redo日志(下)

大家好。上篇文章我们介绍了什么是redo日志以及redo日志的写入过程。建议没看过上篇文章的同学先看一下上一篇文章&#xff0c;今天我们继续来说一说redo日志。 一、redo日志文件 1. redo日志刷盘时机 我们知道mtr运行过程中产生的一组redo日志在mtr结束时会被复制到log buf…

利用AI大模型,将任何文本语料转化为知识图谱,可本地运行!

几个月前&#xff0c;基于知识的问答&#xff08;KBQA&#xff09;还是一个新奇事物。 现在&#xff0c;对于任何 AI 爱好者来说&#xff0c;带检索增强生成&#xff08;RAG&#xff09;的 KBQA 就像小菜一碟。看到自然语言处理&#xff08;NLP&#xff09;的可能性领域由于大…

JVM性能优化案例:优化垃圾回收器的年轻代和老年代占比

JVM性能优化案例&#xff1a;优化垃圾回收器的年轻代和老年代占比 我们有一款在线交易系统&#xff0c;要求低延迟和高吞吐量。系统运行在Ubuntu服务器上&#xff0c;使用OpenJDK 11&#xff0c;并启用了G1垃圾回收器。以下是系统的基本配置和GC日志信息&#xff1a; 操作系统…

学习笔记丨嵌入式BI分析的12个关键功能

编者注&#xff1a;以下内容节选编译自嵌入式分析厂商Qrvey发表的《What is Embedded Analytics?》&#xff08;什么是嵌入式分析&#xff09;一文&#xff0c;作者为Qrvey产品市场主管Brian Dreyer。 什么是嵌入式分析&#xff1f; 嵌入式分析是指能够将数据分析的特性和功…

React+TS前台项目实战(七)-- 全局常用组件Select封装

文章目录 前言Select组件1. 功能分析2. 代码详细注释说明3. 使用方式4. 效果展示&#xff08;1&#xff09;鼠标移入效果&#xff08;2&#xff09;下拉框打开效果&#xff08;3&#xff09;回调输出 总结 前言 今天这篇主要讲全局select组件封装&#xff0c;可根据UI设计师要…

java1.8运行arthas-boot.jar运行报错解决

报错内容 输入java -jar arthas-boot.jar&#xff0c;后报错。 [INFO] JAVA_HOME: D:\developing\jdk\jre1.8 [INFO] arthas-boot version: 3.7.2 [INFO] Can not find java process. Try to run jps command lists the instrumented Java HotSpot VMs on the target system.…

资源付费系统小程序APP公众号h5源码

&#x1f510; 揭秘“资源付费系统”&#xff1a;知识、技能与价值的交汇点 &#x1f48e; &#x1f31f; 引言&#xff1a;为何资源需要付费&#xff1f; 在数字化时代&#xff0c;我们周围充斥着大量的信息。但并非所有信息都具有同等的价值。其中&#xff0c;那些经过精心…

项目五串行通信系统 任务5-3温度信息上传

任务描述&#xff1a;DS18B20测量温度&#xff0c;单片机采集温度数据转换显示代码&#xff0c;并通过串行口发送到上位机显示。 底层文件&#xff1a; /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…

算法课程笔记——线段树动态开点

算法课程笔记——线段树动态开点 、

大模型高考数学测评结果,国内AI大模型成绩超GPT-4o!

每年高考都是备受全社会关注的一件大事&#xff0c;而今年略有不同&#xff0c;因为除了鱼跃龙门的高三学子们&#xff0c;还多了许多陪他们一同参加考试的 AI 大模型。 在所有的考试科目中&#xff0c;数学显然一直都是最难的那一门&#xff0c;不论是对考生还是对大模型。因…

设备管理系统——设备台账管理

设备管理系统中的设备台账管理是一项关键的功能&#xff0c;它涵盖了设备从购入、使用、维护到报废的全生命周期管理。以下是设备台账管理在设备管理系统中的详细功能和重要性&#xff1a; 一、设备台账管理的基本功能 设备信息录入&#xff1a; 录入设备的基本信息&#xff0…

B端系统的颜值问题:成也框架,败也框架!

B端UI框架和前端框架的出现&#xff0c;让系统的搭建就像堆积木一样&#xff0c;十分的容易了。这也一下子把程序员的设计和审美水平拔高到了UI框架能够达到的高度。伴随而来的则是系统的堆砌、同质化、糟糕的体验&#xff0c;以及各种违和的组件被生搬硬套的绑定在一块&#x…

传统工厂该如何做数字化转型?

传统工厂实现数字化转型需多方面着手&#xff0c;包括树立战略意识、明确目标规划&#xff0c;加强信息化建设、提升数据能力&#xff0c;培养引进人才、推动技术创新&#xff0c;优化业务流程、提高生产效率与质量管控&#xff0c;加强协同合作、实现产业链整合&#xff0c;建…

男士内裤买便宜还是贵的?2024年高性价比男士内裤汇总分享

男生内裤&#xff0c;作为贴身衣物&#xff0c;承载着男性的私密与舒适。然而&#xff0c;许多男士的内裤状况却让人大跌眼镜&#xff1a;穿到变形、腰部松垮无弹性&#xff0c;屁股后面甚至出现破洞&#xff0c;这样的景象已然屡见不鲜。更有些男士的内裤&#xff0c;中间一个…

lnmp的介绍与源码部署以及 |什么是正向、反向、透明代理 | 常见的集群有哪些

lnmp 文章目录 lnmp1.LNMP是什么2. lnmp简介3.系统特点4.优点5.lnmp部署5.1 nginx安装5.2 mysql安装5.3 php安装5.4配置nginx服务处理php 6.扩展知识点1.什么是集群2.常见的集群有哪些集群的分类1、高可用集群2、负载均衡集群3、分布式计算集群4、高性能集群(High Performance …

你为什么不相信 LLM 模型评测:深入评测 LLM 接口

我相信你已经看过很多机构发布的 LLM&#xff08;大语言模型&#xff09; 的模型效果质量的评测文章了。 其实呢&#xff0c;大家看了很多自称权威&#xff0c;或者不怎么权威的评测文章&#xff0c;基本上也就看看就完了&#xff0c;很少有人真的相信这些测试结果。 为什么你…

基于Simufact Welding定向沉积增材仿真的几何变形补偿

在DED&#xff08;Directed energy deposition定向能量沉积&#xff0c;下述简称DED&#xff09;增材工艺过程中&#xff0c;由于零部件的重复加热&#xff0c;极易产生部件的变形问题。借助专业的金属定向能量沉积仿真软件Simufact Welding&#xff0c;能够对目标件进行瞬态数…