java jdbc的使用及实践

news2024/12/24 0:05:50

在这里插入图片描述

文章目录

  • 介绍
    • 背景
    • 发展
    • 目的和设计
    • 演进
    • 结论
  • JDBC的主要组件
    • JDBC使用流程
    • JDBC的事务管理
    • JDBC驱动类型
    • 结论
  • insert和batch insert
    • 示例:
  • update和batch update
    • 事务的重要性
  • delete和batch delete
    • 单条记录删除(Delete)
    • 批量删除多条记录(Batch Delete)
  • 查询
  • 参考资料
    • 官方文档和教程:
    • 官方API规范:

介绍

JDBC(Java Database Connectivity)的由来可以追溯到1990年代中期,当时Java语言正在蓬勃发展之中。在那个时期,Java以其“一次编写,到处运行”的理念迅速赢得了开发者的青睞。然而,为了进一步扩展Java语言在企业级应用中的可用性,需要一个标准化的接口,让Java应用能够与数据库进行交互,这就是JDBC诞生的背景。

背景

在JDBC出现之前,数据库互操作性常常依赖于数据库厂商特定的API,或者是采用诸如ODBC(Open Database Connectivity)这样的数据库互联接口。这些方法或多或少存在一定的限制,特别是对于Java这样旨在跨平台运行的语言来说。例如,使用ODBC需要通过JNI(Java Native Interface)来进行连接,这降低了Java程序的可移植性。

发展

为了解决这个问题,Java的母公司Sun Microsystems(太阳微系统)发布了JDBC API。JDBC 1.0在1997年随JDK 1.1发布,标志着Java程序可以直接,以一种跨平台的、与数据库厂商无关的方式来访问数据库。从那时起,JDBC API成为了Java SE(Standard Edition)的一部分。

目的和设计

JDBC API的主要目的是提供一个统一的、数据库无关的方法来访问多种关系型数据库。这意味着Java开发者可以用几乎相同的代码基础来与不同的数据库进行交互,仅需更换相应数据库的JDBC驱动即可完成对不同数据库的访问,大大提高了代码的可重用性和开发效率。

JDBC API通过“驱动管理器”和“数据库URL”简化了数据库连接过程。它提供了一套接口(如Connection、Statement、ResultSet等),开发者可以使用这些接口与数据库进行交互,而这些接口均由具体数据库的JDBC驱动实现。

演进

随着时间的推移,JDBC API经历了多个版本的更新,每个版本都增加了新的特性和性能改进。例如,JDBC 2.0(包含在JDK 1.2中)增加了批处理、滚动结果集等特性,JDBC 3.0提高了连接池管理,而JDBC 4.0引入了自动发现驱动的能力,简化了驱动的加载过程。

结论

总的来说,JDBC是Java技术栈中关键的一环,它有效地弥合了Java应用与数据库之间的鸿沟,使得Java成为了一个理想的选择,用于开发企业级数据库驱动的应用。JDBC以其强大的数据库操作能力、跨平台的特性、以及出色的扩展性,继续在当今的软件开发领域发挥着重要作用。

JDBC的主要组件

  1. DriverManager:这个类管理一组JDBC驱动程序的列表。当一个应用程序尝试连接数据库时,DriverManager会负责寻找合适的驱动来建立连接。

  2. Connection:表示应用程序和数据库之间的连接(或会话)。通过Connection对象,可以管理事务(比如提交或回滚事务)。

  3. Statement:用于在数据库上执行静态SQL语句并返回它所生成结果的对象。

  4. PreparedStatement:继承自Statement,它表示预编译的SQL语句。这种语句的性能更好,并且可以防止SQL注入攻击。

  5. CallableStatement:继承自PreparedStatement,用于执行数据库存储过程。

  6. ResultSet:表示SQL语句执行结果的数据集。它允许以迭代方式读取数据。

JDBC使用流程

  1. 加载JDBC驱动:加载连接数据库所需要的驱动,可以通过调用Class.forName()实现。
Class.forName("com.mysql.jdbc.Driver");
  1. 建立连接:使用DriverManager.getConnection()方法通过数据库的URL、用户名和密码来建立连接。
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/数据库名", "用户名", "密码");
  1. 创建Statement:创建一个Statement或PreparedStatement对象,用于执行SQL语句。
Statement stmt = conn.createStatement();
  1. 执行SQL语句:执行SQL查询或更新语句。
ResultSet rs = stmt.executeQuery("SELECT * FROM 表名");
  1. 处理结果:处理ResultSet中的数据(仅针对查询操作)。
while (rs.next()) {
    System.out.println(rs.getString("列名"));
}
  1. 清理环境:关闭ResultSet、Statement和Connection对象。
rs.close();
stmt.close();
conn.close();

JDBC的事务管理

JDBC允许开发者通过Connection对象控制事务。默认情况下,JDBC的事务是自动提交的,这意味着每条SQL语句被执行后会立即提交。如果需要手动控制事务,可以关闭自动提交模式,然后显式地提交或回滚事务:

// 关闭自动提交
conn.setAutoCommit(false);

// 执行SQL语句
// ...

// 提交事务
conn.commit();

// 或回滚事务
// conn.rollback();

JDBC驱动类型

JDBC驱动主要分为四种类型:

  1. 类型1:JDBC-ODBC桥驱动(不再推荐使用)
  2. 类型2:本地API部分Java驱动
  3. 类型3:网络协议全Java驱动
  4. 类型4:数据库协议全Java驱动(直接连接数据库,无需其他服务器或桥接程序,通常推荐使用类型4驱动)

结论

JDBC为Java应用提供了一种与数据库交互的强大机制,通过将Java代码与数据库交互细节解耦,使数据库访问更加标准化和简化。了解和掌握JDBC对于任何从事Java开发,并需要与关系型数据库交互的开发者来说,都是非常重要的。

insert和batch insert

  1. 插入单条记录(Insert)
    插入单条记录通常使用 PreparedStatement。预编译的 SQL 语句提高了性能,并且有助于防止SQL注入攻击。

示例:

假设我们有一个数据库名为 mydatabase,表名为 students,表结构包含两列:id(INT 类型)和 name(VARCHAR 类型)。

以下是插入单条记录到 students 表的 JDBC 代码示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class JdbcInsertDemo {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "user";
        String password = "password";

        try {
            Connection connection = DriverManager.getConnection(jdbcURL, username, password);

            // 插入SQL语句
            String sql = "INSERT INTO students (id, name) VALUES (?, ?)";

            // 创建PreparedStatement
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1, 1);  // 设置第一个问号(id)的值为 1
            statement.setString(2, "John Doe");  // 设置第二个问号(name)的值为 John Doe

            int rowsInserted = statement.executeUpdate();

            // 检查插入是否成功
            if (rowsInserted > 0) {
                System.out.println("A new student was inserted successfully!");
            }

            // 关闭连接
            statement.close();
            connection.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 批量插入多条记录(Batch Insert)
    当需要插入多条记录时,使用批处理方式可以大大提高性能,减少对数据库的操作次数。

示例:
我们使用相同的数据库和表结构执行批量插入操作。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class JdbcBatchInsertDemo {
    public static void main(String[] args) {
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "user";
        String password = "password";

        try {
            Connection connection = DriverManager.getConnection(jdbcURL, username, password);

            // 关闭自动提交
            connection.setAutoCommit(false);

            // 插入SQL语句
            String sql = "INSERT INTO students (id, name) VALUES (?, ?)";

            // 创建PreparedStatement
            PreparedStatement statement = connection.prepareStatement(sql);

            // 添加多批次操作到PreparedStatement
            for (int i = 1; i <= 5; i++) {
                statement.setInt(1, i);
                statement.setString(2, "Student " + i);
                statement.addBatch();  // 将这个设置的参数加入到批处理中
            }
            
            // 执行批处理操作
            int[] rowsInserted = statement.executeBatch();

            // 提交事务
            connection.commit();

            System.out.println("Inserted rows: " + rowsInserted.length);
            
            // 关闭连接
            statement.close();
            connection.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,我们用 PreparedStatement.addBatch() 方法添加了多个插入操作到批处理任务中,最后用 executeBatch() 方法执行这些操作。使用 connection.setAutoCommit(false) 和 connection.commit() 来手动管理事务,保证所有插入操作要么全部成功,要么全部失败,从而保持数据的一致性。

update和batch update

  1. 更新单条记录(Update)
    更新操作通常使用 PreparedStatement 来实现,以提高性能并防止SQL注入攻击。

示例:
假设我们有一个数据库名为 mydatabase,表名为 students,要更新这个表中的记录。

String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";

try {
    Connection connection = DriverManager.getConnection(jdbcURL, username, password);

    // 更新SQL语句
    String sql = "UPDATE students SET name = ? WHERE id = ?";

    // 创建PreparedStatement
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setString(1, "John Doe Updated");  // 将名字更新为 'John Doe Updated'
    statement.setInt(2, 1);  // 更新id为1的记录

    int rowsUpdated = statement.executeUpdate();

    // 检查更新是否成功
    if (rowsUpdated > 0) {
        System.out.println("An existing student was updated successfully!");
    }

    // 关闭连接
    statement.close();
    connection.close();

} catch (Exception e) {
    e.printStackTrace();
}
  1. 批量更新多条记录(Batch Update)
    当需要更新多条记录时,使用批处理(Batch Processing)方式可以大大提高效率,减少对数据库的操作次数。

示例:
仍然使用相同的数据库和表结构来执行批量更新操作。

String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";

try {
    Connection connection = DriverManager.getConnection(jdbcURL, username, password);

    // 关闭自动提交
    connection.setAutoCommit(false);

    // 更新SQL语句
    String sql = "UPDATE students SET name = ? WHERE id = ?";

    // 创建PreparedStatement
    PreparedStatement statement = connection.prepareStatement(sql);

    // 添加多个批次操作到PreparedStatement
    for (int i = 1; i <= 5; i++) {
        statement.setString(1, "Student " + i + " Updated");
        statement.setInt(2, i);  // 更新id为i的记录
        statement.addBatch();  // 将这个设置的参数加入到批处理中
    }
    
    // 执行批处理操作
    int[] rowsUpdated = statement.executeBatch();

    // 提交事务
    connection.commit();

    System.out.println("Updated rows count: " + rowsUpdated.length);
    
    // 关闭连接
    statement.close();
    connection.close();

} catch (Exception e) {
    e.printStackTrace();
}

在这个例子中,我们通过使用 addBatch() 方法向 PreparedStatement 添加了多个更新操作。然后,使用 executeBatch() 方法执行这些操作。使用 connection.setAutoCommit(false) 来关闭自动提交,并手动调用 connection.commit() 提交事务,从而确保这些更新操作要么全部成功,要么在遇到错误时全部撤回,以保持数据的一致性。

事务的重要性

在批量更新中,手动管理事务非常重要,因为它可以保障数据的完整性和一致性。如果在处理过程中发生错误,它允许我们回滚到事务开始之前的状态,撤销所有的更新操作。通过调用 connection.rollback() (在捕获异常时)实现。

delete和batch delete

单条记录删除(Delete)

删除操作通常使用 PreparedStatement 来实现,以提高性能并防止 SQL 注入攻击。

示例:
假设我们有一个数据库名为 mydatabase,表名为 students,并想删除该表中的某些记录。

String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";

try {
    Connection connection = DriverManager.getConnection(jdbcURL, username, password);

    // DELETE SQL语句
    String sql = "DELETE FROM students WHERE id = ?";

    // 创建PreparedStatement
    PreparedStatement statement = connection.prepareStatement(sql);
    statement.setInt(1, 1);  // 删除id为1的记录

    int rowsDeleted = statement.executeUpdate();

    // 检查删除是否成功
    if (rowsDeleted > 0) {
        System.out.println("A student was deleted successfully!");
    }

    // 关闭连接
    statement.close();
    connection.close();

} catch (Exception e) {
    e.printStackTrace();
}

这段代码将删除 students 表中 id 等于 1 的记录。

批量删除多条记录(Batch Delete)

与批量插入或更新相似,可以使用批处理来删除多条记录,从而减少数据库操作的次数和提高性能。

示例:
使用相同的数据库和表结构来执行批量删除操作。

String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";

try {
    Connection connection = DriverManager.getConnection(jdbcURL, username, password);

    // 关闭自动提交
    connection.setAutoCommit(false);

    // DELETE SQL语句
    String sql = "DELETE FROM students WHERE id = ?";

    // 创建PreparedStatement
    PreparedStatement statement = connection.prepareStatement(sql);

    // 添加多个批次操作到PreparedStatement
    for (int i = 1; i <= 5; i++) {
        statement.setInt(1, i);  // 删除id为i的记录
        statement.addBatch();  // 将这个设置的参数加入到批处理中
    }
    
    // 执行批量删除操作
    int[] rowsDeleted = statement.executeBatch();

    // 提交事务
    connection.commit();

    System.out.println("Deleted rows count: " + rowsDeleted.length);
    
    // 关闭连接
    statement.close();
    connection.close();

} catch (Exception e) {
    e.printStackTrace();
}

在这个例子中,我们通过使用 addBatch() 方法向 PreparedStatement 中添加了多个删除操作。然后,使用 executeBatch() 方法执行这些操作。使用 connection.setAutoCommit(false) 来关闭自动提交,并手动调用 connection.commit() 提交事务。与更新操作类似,这样做可以确保这些删除操作要么全部成功,要么在遇到错误时全部撤回,以保持数据的一致性。

在处理可能遇到的任何 SQLException 时,应该对事务进行回滚,使用 connection.rollback()。这会撤销自上一个提交或回滚以来执行的所有更改。在生产环境中,你通常也需要添加适当的错误处理,并且始终确保资源在使用后被适当地关闭,最好是在 finally 块或使用 try-with-resources 语句。

查询

在 JDBC 中,执行查询操作通常涉及到以下步骤:编写 SQL 查询语句、执行查询、处理 ResultSet 对象并提取数据,以及最后清理资源。

下面是一个使用 JDBC 执行查询操作并处理结果集的完整示例。

示例:
假设我们有一个数据库名为 mydatabase,表名为 employees,表结构包含以下列:id(INT 类型)、name(VARCHAR 类型)和 department(VARCHAR 类型)。

要查询 employees 表中的数据,可以使用以下 JDBC 代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JdbcSelectDemo {

    public static void main(String[] args) {
        String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        
        try {
            // 建立数据库连接
            connection = DriverManager.getConnection(jdbcURL, username, password);
            
            // 准备 SQL 查询语句
            String sql = "SELECT id, name, department FROM employees";
            
            // 创建 PreparedStatement 对象
            statement = connection.prepareStatement(sql);
            
            // 执行查询语句并获取结果集
            resultSet = statement.executeQuery();
            
            // 遍历结果集并获取数据
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String department = resultSet.getString("department");
                
                // 打印出从数据库中检索的数据
                System.out.println("ID: " + id + ", Name: " + name + ", Department: " + department);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭 ResultSet
                if (resultSet != null) {
                    resultSet.close();
                }
                // 关闭 PreparedStatement
                if (statement != null) {
                    statement.close();
                }
                // 关闭 Connection
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

在这个例子中,我们建立了与数据库的连接,使用了一个 SELECT 语句来查询 employees 表。然后使用 PreparedStatement.executeQuery 方法执行了查询,并返回了一个 ResultSet 对象。

通过 while 循环和 ResultSet.next 方法遍历结果集,我们可以逐行读取数据。通过 ResultSet 的 getInt、getString 等方法根据列的数据类型来获取每列的值。

最后,我们在 finally 块中关闭了 ResultSet、PreparedStatement 和 Connection。这样做是很重要的,因为它可以释放数据库和 JDBC 资源,避免内存泄漏和其他潜在问题。一个更清洁的替代方案是使用 Java 7 引入的 try-with-resources 语法,这将自动关闭在 try 语句中打开的资源。

JDBC 的查询操作是 数据库交互的核心,不仅可以检索整个表格或者特定列,还可以根据需要进行条件查询、联合查询或其他复杂的数据库操作。

参考资料

官方文档和教程:

  • Oracle官方JDBC文档:Oracle提供了完整的JDBC参考文档,其中包含了API的全部细节。
  • Oracle的JDBC教程:一个涵盖JDBC基础概念到高级特性的综合性教程。
    这些资源对理解 JDBC 的不同方面以及如何与数据库交互非常有帮助。您可以在 Oracle 的官方网站或Java的官方文档中找到这些资源。

官方API规范:

  • 访问Java SE API规范可以查看关于 JDBC 接口和类的官方说明。

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

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

相关文章

电脑打开游戏的时候提示缺少.dll文件?照着这个来就行。

前言 小白曾经也是一个很喜欢玩游戏的人&#xff0c;但那只是曾经。那时候宿舍里一共6个人&#xff0c;都是比较喜欢玩游戏的小伙子。 话题好像偏了…… 有些小伙伴下载玩游戏之后&#xff0c;高高兴兴地想要开始玩。结果游戏根本没办法运行&#xff0c;可恶&#xff01;这该…

Fecify 商品标签功能

关于商品标签 商品标签是指商家可以在展示商品时&#xff0c;自己创建一个自定义标签&#xff0c;可自定义某个关键词或短语。这样顾客在浏览商城时&#xff0c;只需要通过标签就能看到更直观的展示信息。 商品标签可以按照用户的属性、行为、偏好等进行分类&#xff0c;标签要…

基于Java+SpringBoot+Vue美容院业务管理系统(源码+文档+部署+讲解)

一.系统概述 悦己美容院后台管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比…

数据结构DAY4--哈希表

哈希表 概念&#xff1a;相当于字典&#xff0c;可以根据数据的关键字来寻找相关数据的查找表。 步骤&#xff1a;建立->插入->遍历->查找->销毁 建立 建立数据&#xff0c;形式随意&#xff0c;但一般为结构体&#xff08;储存的数据量大&#xff09;&#xff…

apply call bind的使用区别

bind(this对象&#xff0c;arg1&#xff0c;arg2。。。) &#xff0c;第二个参数为参数列表 用于改变this指向&#xff1b;调用会返回一个新的改变了this指向的函数&#xff0c;并不会立即执行而是需要调用新的函数&#xff1b;可以进行部分传参&#xff1b;如果是箭头函数无法…

TCP-IP详解卷一:协议——阅读总结

该内容适合程序员查看 第1章 概述 1.1 引言 WAN全称是 Wide Area Network&#xff0c;中文名为广域网。 LAN全称是 Local Area Network&#xff0c;中文名为局域网。 1.2分层 ICP/IP协议族通常被认为是一个四层协议系统 分层协议应用层Telnet、FTP和e-mail运输层TCP和UDP网…

编程新手必看,学习python中字典数据类型内容(11)

介绍&#xff1a; Python3中的字典是一个非常重要的内置数据结构&#xff0c;它以键值对的形式存储数据&#xff0c;允许通过键来快速访问相应的值。 字典的特点和操作如下&#xff1a; 创建字典&#xff1a;可以通过一对大括号{}来创建一个空字典&#xff0c;或者在大括号内部…

计算机考研择校|408还是自命题,哪个上岸难度大?

我一般是建议选择408&#xff0c;但是现在考408的同学太多了 所以408的竞争压力会比较大&#xff0c;加上复习难度大&#xff0c;复习过程中&#xff0c;心态很容易崩掉。 其实到底选自命题还是408&#xff0c;我觉得还是要看自己的目标。如果目标院校是自命题&#xff0c;那…

linux自动下载rpm的依赖包的方法

背景 rpm安装包是存在依赖关系的。通常在离线安装的时候&#xff0c;没有下全依赖包&#xff0c;安装就会失败。 分析 1.首先我们要使用yumdownloader来下载指定的包。 yumdownloader --disablerepo* --enablerepobase,epel,extras --releasever7 --archx86_64 --downloadd…

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence&#xff0c;AI)&#xff0c;是新一轮科技革命和产业变革的重要驱动力量&#xff0c; [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE&#xff0c;也就是java企业版&#xff0c;也就是java后端(后端javaSE) 利用javaEE和前端交互&#xff0c;javaSE和数据库交互&#xff0c;javaSE和javaEE之间再进行交互就实现了前后端的交互…

open graph简述

场景 在我们使用twitter的时候&#xff0c;会发现有的链接会显示预览卡片&#xff0c;有的不会。 这是因为有的网站设置了open graph&#xff0c;有的没有。 那么什么是open graph&#xff1f; open graph是一个由facebook在2010年发布的协议&#xff0c;用于在社交网络上分享…

每日OJ题_两个数组dp⑤_力扣10. 正则表达式匹配

目录 力扣10. 正则表达式匹配 解析代码 力扣10. 正则表达式匹配 10. 正则表达式匹配 难度 困难 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c…

A Learning-Based Approach for IP Geolocation

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:185 Abstract 定位IP主机地理位置的能力对于在线广告和网络攻击诊断等应用程序是非常吸引力的。虽然先前的方…

如何基于开源大模型搭建自己的智能体?魔搭社区推出AI Agent开发框架

阿里云牵头建设的AI模型社区魔搭(ModelScope)又上新了&#xff0c;推出适配开源大语言模型的AI Agent开发框架ModelScope-Agent。借助ModelScope-Agent&#xff0c;所有开发者都可基于开源 LLM 搭建属于自己的智能体应用&#xff0c;最大限度释放想象力和创造力。ModelScope-Ag…

苍穹外卖亮点再梳理 ||

一、项目整体亮点&#xff1a; 【注&#xff1a;基于每个亮点&#xff0c;均有整理的相关知识&#xff0c;可在博客中查看】 1.数据库的设计采用RBAC&#xff08;基于角色访问控制&#xff09;的权限设计。 RBAC将权限授予角色&#xff0c;然后将用户分配给角色&#xff0c;…

对ps的曲线的认识

首先利用取色器看看新建文档的填充颜色是什么。 为了了解曲线的图形是横坐标和纵坐标代表什么&#xff0c;我把曲线从yx&#xff0c;变成了y1-x。 这里的通道是RGB&#xff0c;观察颜色的数值变化&#xff0c;发现&#xff0c;正好是原来颜色的补色。即是1-R, 1-G, 1-B。 所以…

【spring】@Scope注解学习

Scope介绍 Scope注解是Spring框架中用于指定bean作用域的注解。在Spring中&#xff0c;一个bean的作用域定义了该bean的生命周期和创建bean实例的上下文。Spring提供了几种预定义的作用域&#xff0c;同时也支持自定义作用域。通过使用Scope注解&#xff0c;开发者可以更精确地…

Node2Vec论文翻译

node2vec: Scalable Feature Learning for Networks node2vec&#xff1a;可扩展的网络特征学习 ABSTRACT 网络中节点和边缘的预测任务需要在学习算法使用的工程特征上付出仔细的努力。最近在更广泛的表示学习领域的研究通过学习特征本身在自动化预测方面取得了重大进展。然…

win:Ollama安装和大模型的集成

一、Ollama介绍 Ollama 是一个用于在本地运行大型语言模型 (LLM) 的开源框架。它支持多种平台&#xff0c;包括 Windows、Linux 和 macOS。 Ollama 的主要功能包括&#xff1a; 将 LLM 模型转换为可执行文件 提供简单的命令行界面来运行 LLM 模型 支持多种 LLM 模型&#x…