java jdbc的使用及实践

在这里插入图片描述

文章目录

  • 介绍
    • 背景
    • 发展
    • 目的和设计
    • 演进
    • 结论
  • 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 (?, ?)";// 创建PreparedStatementPreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, 1);  // 设置第一个问号(id)的值为 1statement.setString(2, "John Doe");  // 设置第二个问号(name)的值为 John Doeint 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 (?, ?)";// 创建PreparedStatementPreparedStatement statement = connection.prepareStatement(sql);// 添加多批次操作到PreparedStatementfor (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 = ?";// 创建PreparedStatementPreparedStatement 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 = ?";// 创建PreparedStatementPreparedStatement statement = connection.prepareStatement(sql);// 添加多个批次操作到PreparedStatementfor (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 = ?";// 创建PreparedStatementPreparedStatement 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 = ?";// 创建PreparedStatementPreparedStatement statement = connection.prepareStatement(sql);// 添加多个批次操作到PreparedStatementfor (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 {// 关闭 ResultSetif (resultSet != null) {resultSet.close();}// 关闭 PreparedStatementif (statement != null) {statement.close();}// 关闭 Connectionif (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.rhkb.cn/news/303797.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 &#x1f4f…

《高通量测序技术》分享,生物信息学生信流程的性能验证,以肿瘤NGS基因检测为例。

这是这本书&#xff0c;第四章第五节的内容&#xff0c;这一部分是以NGS检测肿瘤基因突变为例&#xff0c;描述了其原理和大概流程&#xff0c;这和以前我分享的病原宏基因组高通量测序性能确认方案可以互相补充&#xff0c;大家可以都看一下&#xff0c;但是想要真正的弄懂&am…

使用Mac自带终端进行远程ssh连接Linux服务器

废话不多说&#xff0c;直接上图 好吧&#xff0c;我承认我是多此一举&#xff0c;脱裤子放pi了&#xff0c;其实只需要在终端输入一行命令就可以了&#xff08;呜呜&#xff5e;&#xff09; ssh rootip -p 22 需要注意的是&#xff0c;命令里的ip地址同样要替换成你自己的服…

SQLyog连接数据库8.0版本解析错误问题解决方案

问题描述&#xff1a; 解决方案&#xff1a; alter userrootlocalhostidentified with mysql_native_password by 密码; 再次连接就可以了。

【PyQt5篇】和子线程进行通信

文章目录 &#x1f354;使用QtDesigner进行设计&#x1f6f8;和子线程进行通信&#x1f388;运行结果 &#x1f354;使用QtDesigner进行设计 我们首先使用QtDesigner设计界面 得到代码login.ui <?xml version"1.0" encoding"UTF-8"?> <ui …

什么是企业邮箱?如何选择合适的企业邮箱?

企业邮箱和个人邮箱不同&#xff0c;它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱&#xff1f;如何选择合适的企业邮箱&#xff1f;好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…

Path Aggregation Network for Instance Segmentation

PANet 摘要1. 引言2.相关工作3.框架 PANet 最初是为 proposal-based 实例分割框架提出来的&#xff0c;mask 是实例的掩码&#xff0c;覆盖了物体包含的所有像素&#xff0c;proposal 在目标检测领域是可能存在目标的区域。在实例分割中&#xff0c;首先利用RPN(Region Proposa…

机器学习中的激活函数

激活函数存在的意义&#xff1a; 激活函数决定了某个神经元是否被激活&#xff0c;当这个神经元接收到的信息是有用或无用的时候&#xff0c;激活函数决定了对这个神经元接收到的信息是留下还是抛弃。如果不加激活函数&#xff0c;神经元仅仅做线性变换&#xff0c;那么该神经网…

Linux 线程:线程同步、生产者消费者模型

目录 一、死锁 二、条件变量实现线程同步 1、为什么需要线程同步 2、条件变量、同步、竞态条件 3、条件变量函数&#xff1a;初始化 销毁 等待 唤醒 4、实现简单的多线程程序 不唤醒则一直等待 实现线程同步 三、生产者消费者 1、借助超市模型理解 2、优点 四、基于…

【刷题】备战蓝桥杯 — dfs 算法

送给大家一句话&#xff1a; 风度真美&#xff01; 即使流泪&#xff0c;也要鼓掌&#xff0c; 即使失望&#xff0c;也要满怀希望。 ——刘宝增 dfs 算法 1 前言2 洛谷 P1030 [NOIP2001 普及组] 求先序排列题目描述算法思路 3 洛谷 P1294 高手去散步题目描述算法思路 4 蓝桥…

pdfjs-4.0.379-dist直接打开viewer.html报错

下载了pdfjs-4.0.379-dist&#xff0c;但是直接打开viewer.html报错。解决方法&#xff1a;安装live Sever&#xff0c;并用live Server打开 打开浏览器截图 错误提示如下&#xff1a; Access to image at file:///D:/work/web-common/car-knowledge-base-web/static/pdfjs-4…

STM32 H7系列学习笔记

必备的API知识 第 1 步&#xff1a;系统上电复位&#xff0c;进入启动文件 startup_stm32h743xx.s&#xff0c;在这个文件里面执行复位中断服务程序。 在复位中断服务程序里面执行函数 SystemInit&#xff0c;在system_stm32h7xx.c 里面。*之后是调用编译器封装好的函数&…

[CSS]样式属性+元素设置

哎呀&#xff0c;好多东西&#xff0c;根本记不住&#xff0c;更多的还是边用边记吧&#xff0c;这里的代码就当使用范例&#xff0c;但其实如果可以让gpt应该会更好&#xff0c;哎学吧&#xff0c;反正记得住当然更好 文本 属性名描述word-break单词换行。取值如下&#xff1…

Java System类和Runtime类

System常见API exit:退出程序currentTimeMillis &#xff1a;获取当前的毫秒数&#xff08;1970年是c语言诞生的那一年&#xff09; 代码 System.out.println("Hello, World!"); // System.exit(0); // 退出程序 尽量别使用long currentTimeMillis System.currentTi…

计算机进制

进制 进制也就是进位制&#xff0c;是人们规定的一种进位方法对于任何一种进制—X进制&#xff0c;就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一&#xff0c;十六进制是逢十六进一&#xff0c;二进制就是逢二进一&#xff0c;以此类推&#xff0c;x进制就是逢x进…

管理用户(删除指定用户)shell脚本实现

系统中删除一个用户&#xff0c;要慎之又慎。编写一个shell脚本交互式实现用户删除。代码逻辑&#xff1a; 1、获取正确用户名 2、创建函数获取正确的用户名 3、验证获取的用户名 4、确认获取的用户是否存在 5、删除属于用户的进程 6、查找属于用户的文件并输出文件报告便于后续…

600MA线性锂电池充电芯片 - YB4054DJ

描述: YB4054一款完整的单节锂离子电池充电器。其SOT23-5的封装与较少的外部元件数使得YB4054成为便携式应用的理想选择。采用了内部PMOSFET架构&#xff0c;加上防倒充电路&#xff0c;不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行自动调节&#xff0c;以便在大…

Commitizen:规范化你的 Git 提交信息

简介 在团队协作开发过程中&#xff0c;规范化的 Git 提交信息可以提高代码维护的效率&#xff0c;便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具&#xff0c;它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…

面试(02)————Java基础和集合

一、Java基础知识 1、面向对象的特征 2、Java 的基本数据类型有哪些 3、JDK JRE JVM 的区别 4、重载和重写的区别 5、Java中和equals的区别 6 、String、StringBuffer、StringBuilder三者之间的区别 7、接口和抽象类的区别是什么&#xff1f; 8、反射 9、jdk1.8 的新特…

AI大模型日报#0409:Llama 3下周发布、特斯联20亿融资、Karpathy新项目

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 120亿Stable LM 2上线即开源&#xff01;2万亿token训练&#xff0c;碾压Llama 2 70B 摘要: Stable LM 2 12B参数版本发布&#x…