JDBC基础关键_002_JDBC 增删改
目 录
一、步骤
二、数据准备
1.PowerDesigner
(1)概述
(2)物理数据建模
2.初始化
三、利用 JDBC 实现增、删、改
1.新增
2.修改
3.删除
四、URL
1.概述
2.JDBC 连接 MySQL 的 URL
3.MySQL 的 URL 中其他常用参数
(1)serverTimeZone
(2)useSSL
(3)useUnicode
(4)characterEncoding
4.连接 MySQL 的 JDBC URL 表示实例
五、注册驱动常用方式
1.new Driver 方式
2.Class.forName 方式
3.无需手动注册
六、getConnection 方法
一、步骤
- 注册驱动;
- 将 JDBC 驱动程序从硬盘上的文件系统加载到内存中;
- 使 DriverManager 可以通过一个统一的接口,管理该驱动程序的所有连接操作。
- 获取数据库连接;
- 获取 java.sql.Connection 对象。该对象被创建标志着 MySQL 进程和 JVM 进程间的通道打开。
- 获取数据库操作对象;
- 获取 java.sql.Statement 对象。负责将 SQL 语句发送给数据库,数据库负责执行该 SQL 语句。
- 执行 SQL 语句;
- 处理查询结果集;
- DQL 操作才会处理查询结果集;
- 执行 DQL 语句通常返回查询结果集对象 java.sql.ResultSet;
- 对于 ResultSet 查询结果集而言,通常的操作是针对查询结果集进行遍历。
- 释放资源。
- 避免资源浪费:每次使用完 Connection、Statement、ResultSet 等资源后,都需要显示地调用对应的 close 方法释放资源;
- 避免资源泄漏:在 Java 中,当一个对象不再被引用,会被 JVM 的垃圾回收机制回收。但在 JDBC 编程中,若不显示地关闭资源,这些资源不会被 JVM 的垃圾回收机制回收,从而导致内存泄漏。
二、数据准备
1.PowerDesigner
(1)概述
一款专业的建模工具,可以完成数据库设计、数据建模、过程建模、企业业务建模等工作。支持多种数据库、多种操作系统,适用于大型项目中数据库设计和建模。
(2)物理数据建模
物理数据模型(PDM)是数据管理领域中,表示数据库逻辑设计后,通过物理设计最终转化为实际数据结构的过程。即在逻辑模型的基础上,进行数据存储结构设计。
PDM 是一个详细的数据库设计计划,描述如何在关系数据库中存储数据,物理数据模型包含了所有数据表,列、键和索引以及物理存储的详细信息,包括数据类型、字段宽度、默认值、统计信息等。
此外,PDM 还描述了如何将数据表存储在文件或表空间中,这些信息可以帮助开发人员建立实际的数据库系统。
通常,PDM 包含了完整的 ER 模型,数据表和关系的详细信息,包括数据的主键、外键、唯一键、索引、约束条件等。
物理数据模型可以使用各种建模工具来手工创建或自动生成。在数据库设计阶段,生成 PDM 是非常重要的一步,是将逻辑设计转换为实际实现的重要步骤之一。它可以帮助开发人员在实现时更加清晰地了解数据的存储结构,同时也方便后续的数据库管理和维护工作。
2.初始化
drop table if exists t_user;/*==============================================================*/
/* Table: t_user */
/*==============================================================*/
create table t_user
(id bigint auto_increment not null,name varchar(10),passward varchar(20),realname varchar(10),gender char(2),phone varchar(11),primary key (id)
);
insert into t_user(name, passward, realname, gender, phone) values ('2231953312', '954387', '张观', '男', '19835142233'),('1739884106', '123456', '王岩', '男', '17322567899'),('1189356221', 'qazwsx', '刘歆蕊', '女', '13622567639'),('2366781025', '9qq132', '何东洋', '男', '17729036577'),('1473332901', 'qwe123', '余小念', '女', '14823098865');
三、利用 JDBC 实现增、删、改
1.新增
public class JDBCInsertTest {public static void main(String[] args) {Connection connection = null;Statement statement = null;try {// 1.创建驱动Driver driver = new com.mysql.cj.jdbc.Driver();DriverManager.registerDriver(driver);// 2.获取连接String url = "jdbc:mysql://localhost:3306/jdbc";String user = "root";String password = "root";connection = DriverManager.getConnection(url, user, password);// 3.创建数据库操作对象statement = connection.createStatement();// 4.执行 SQLString insertSQL = "insert into t_user values(null, '2289701965', '123456', '王珊', '女', '19934205358')";int count = statement.executeUpdate(insertSQL);System.out.println(count > 0 ? "插入成功" : "插入失败");} catch (SQLException e) {e.printStackTrace();} finally {// 5.释放资源if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
2.修改
public class JDBCUpdateTest {public static void main(String[] args) {Connection connection = null;Statement statement = null;try {// 1.创建驱动Driver driver = new com.mysql.cj.jdbc.Driver();DriverManager.registerDriver(driver);// 2.获取连接String url = "jdbc:mysql://localhost:3306/jdbc";String user = "root";String password = "root";connection = DriverManager.getConnection(url, user, password);// 3.创建数据库操作对象statement = connection.createStatement();// 4.执行 SQLString updateSql = "update t_user set realname = '刘梓珊' where realname = '王珊'";int updateCount = statement.executeUpdate(updateSql);System.out.println(updateCount > 0 ? "更新成功" : "更新失败");} catch (SQLException e) {e.printStackTrace();} finally {// 5.释放资源if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
3.删除
public class JDBCDeleteTest {public static void main(String[] args) {Connection connection = null;Statement statement = null;try {// 1.注册驱动Driver driver = new com.mysql.cj.jdbc.Driver();DriverManager.registerDriver(driver);// 2.获取连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "root");// 3.创建数据库操作对象statement = connection.createStatement();// 4.执行 SQLString DeleteSQL = "delete from t_user where id = 4";int count = statement.executeUpdate(DeleteSQL);System.out.println(count > 0 ? "删除成功" : "删除失败");} catch (SQLException e) {e.printStackTrace();} finally {// 5.关闭资源if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
四、URL
1.概述
- 统一资源定位符,是互联网上标识、定位、访问资源的字符串,。可以用来指定互联网上各种资源的位置;
- URL 通常以 协议、服务器名、服务器端口、路径、查询字符串组成:
- 协议:规定访问资源所采用的通信协议;
- 服务器名:资源所在服务器的 主机名 或 IP 地址;
- 服务器端口:资源所在服务器的端口号;
- 路径:资源所在服务器上的路径、文件名等信息;
- 查询字符串:向服务器提交的参数信息,用来定位更具体的资源。
- URL 是互联网上资源的唯一标识。
2.JDBC 连接 MySQL 的 URL
jdbc:mysql://<host>:<port>/<database_name>?<connection_parameters>
协议:表示使用的数据库管理系统的类型。【 jdbc:mysql 】表示使用 MySQL 数据库;
<host>:<port>:表示要连接的数据库所在的服务器的 IP 地址或域名,以及数据库所在服务器监听的端口号;
<database_name>:表示要连接的数据库的名称;
<connection_parameters>:其他可选参数,包括连接的超时时间、使用的字符集、连接池相关配置等。
3.MySQL 的 URL 中其他常用参数
(1)serverTimeZone
MySQL 服务器时区,默认为 UTC,可以通过该参数指定客户端和服务器的时区;
在 JDBC 的 URL 中设置 serverTimeZone 的作用是指定数据库服务器的时区。这个时区信息会影响 JDBC 驱动在处理日期时间相关数据类型时如何将其映射到服务器上的日期时间值。 如果不设置 serverTimeZone,则 JDBC 驱动程序默认将使用客户端的时区,来处理日期时间数据。在这种情况下,如果服务器的时区和客户端机器的时区不同,那么处理日期时间数据时可能会出现问题,从而导致数据错误或不一致。
(2)useSSL
是否使用 SSL 安全传输协议进行连接,默认为 true;
当设置为 true 时,JDBC 驱动程序将使用 SSL 加密协议来保障客户端和服务器之间的通信安全。这种方式下,所有数据都会使用 SSL 加密后再传输,可以有效防止数据在传输过程中被窃听、篡改等。当然,也要求服务器端必须支持 SSL,否则会连接失败;
当设置为 false 时,JDBC 驱动程序会以明文方式传输数据,这种方式下,虽然数据传输的速度会更快,但也会存在被恶意攻击者截获和窃听数据的风险;
在不安全的网络环境下,或是要求数据传输安全性较高的情况下,建议使用 SSL 加密连接。但使用 SSL 连接会对系统资源和性能消耗有一定的影响,特别是当连接数较多时,对 CPU 和内存压力都比较大。因此,在性能和安全之间需要权衡,根据实际应用场景合理设置 useSSL 参数。
(3)useUnicode
是否使用Unicode编码进行数据传输,默认是 true;
Unicode 是计算机科学中的一种字符编码方案,可以用于表示全球各种语言中的字符,包括 ASCII 码、中文等。因此,使用 Unicode 编码可以确保数据在传输过程中能够正确、完整地呈现各种语言的字符;
若设置【useUnicode=true】,JDBC 驱动程序会在传输数据时使用 Unicode 编码。意味着无论数据源中使用的是什么编码方案,都会先将数据转换为 Unicode 编码进行传输,确保数据能够跨平台、跨数据库正确传输;
若设置【useUnicode=false】,则表示使用当前平台默认的字符集进行数据传输。这可能会导致在跨平台或跨数据库时出现字符编码不一致的问题,因此通常建议在进行数据传输时启用 Unicode 编码。
(4)characterEncoding
- 连接使用的字符编码,默认为 UTF-8;
- 用于设置 MySQL 服务器和 JDBC 驱动程序之间进行字符集转换时使用的字符集编码;
useUnicode 设置的是数据在传输过程中是否使用 Unicode 编码方式。characterEncoding 设置的是数据被传输到服务器之后,服务器采用哪一种字符集进行编码。
4.连接 MySQL 的 JDBC URL 表示实例
jdbc:mysql://localhost:3306/jdbc?useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=utf-8
五、注册驱动常用方式
1.new Driver 方式
// 上边使用的注册驱动方式
Driver driver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(driver);
2.Class.forName 方式
- 还有一种方式,且这种方式更为常用。【Class.forName("com.mysql.cj.jdbc.Driver");】;
- 其一,减少了代码量;其二,可以方便地将实现类的类名配置到属性配置文件。
// com.mysql.cj.jdbc.Driver 实现类源码
public class Driver extends NonRegisteringDriver implements java.sql.Driver {// Register ourselves with the DriverManager.static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}}/*** Construct a new driver and register it with DriverManager** @throws SQLException* if a database error occurs.*/public Driver() throws SQLException {// Required for Class.forName().newInstance().}}
通过源码可知,该实现类中有一个静态代码块,静态代码块内调用了 DriverManager 的 registerDriver 方法。
使用【Class.forName("com.mysql.cj.jdbc.Driver");】会完成类加载,执行静态代码块。
静态代码块在类加载时执行,且只执行一次。可以回顾【Java基础关键_006_面向对象(一)】。
3.无需手动注册
JDBC 4(jdk 6)开始,不再需要手动注册驱动,可以由系统自动完成。但在实际开发中,有些数据库驱动程序不支持自动发现功能,仍然需要手动注册。所以不建议省略。
# cjjdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
user=root
password=root
public class JDBCDriverTest {public static void main(String[] args) {ResourceBundle bundle = ResourceBundle.getBundle("jdbc.cjjdbc");String driver = bundle.getString("driver");String url = bundle.getString("url");String user = bundle.getString("user");String password = bundle.getString("password");try {// 可以省略加载驱动// Class.forName(driver);// 创建连接Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection); // com.mysql.cj.jdbc.ConnectionImpl@73d4cc9e} catch (SQLException e) {e.printStackTrace();}
// catch (ClassNotFoundException e) {
// e.printStackTrace();
// }}
}
六、getConnection 方法
public class GetConnectionTest {public static void main(String[] args) {/** getConnection(String url)* */try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc?user=root&password=root";Connection c1 = DriverManager.getConnection(url);System.out.println("c1 = " + c1);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}/** getConnection(String url, Properties info)* */try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc";Properties info = new Properties();info.setProperty("user", "root");info.setProperty("password", "root");Connection c2 = DriverManager.getConnection(url, info);System.out.println("c2 = " + c2);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}/** getConnection(String url, String user, String password)* */try {Class.forName("com.mysql.cj.jdbc.Driver");String url = "jdbc:mysql://localhost:3306/jdbc";String user = "root";String password = "root";Connection c3 = DriverManager.getConnection(url, user, password);System.out.println("c3 = " + c3);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}
}