[Java Web]JDBC->Java操作MySQL数据库(二)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: [Java Web]JDBC->Java操作MySQL数据库(二)

4、API详解

4.1、DriverManager

JDBC步骤二:注册驱动->DriverManager

4.1.1、注册方式

注册驱动的两种方式:

①静态注册:Class.forName("com.mysql.jdbc.Driver");

②动态注册:DriverManager.registerDriver(new Driver());

实际注册方式为方式二,但实际代码编写为方式一。

理由:

两种注册方式都可以,但是静态注册方式更稳定,因为它在程序启动前就注册了驱动,没有因为网络问题等导致无法加载驱动的风险,所以推荐使用静态注册方法。

4.1.2、源码分析

DriverManager.registerDriver(new Driver());

--->

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

--->

可以看出,静态注册方式采用的是反射机制,获取了MySQL驱动包中的Driver对象

重温反射知识:

查看com.mysql.jdbc.Driver源码,可以看到在Driver中静态加载了DriverManager.registerDriver(new Driver());,所以两种注册方式在源码上本质并无区别。只是静态注册更安全更稳固,且只会随着类加载一次,不会出现重复注册或者因网络问题进而出现注册问题的情况出现。

4.1.3、🔺🔺MySQL5

MySQL 5之后的驱动包,可以省略注册驱动的步骤,

自动加载jar包中META-INF/services/java.sql.Driver文件中的驱动类

4.2、Connection

Connection(数据库连接对象)作用:

获取执行 SQL 的对象

管理事务

4.2.1、DriverManager.getConnection

JDBC步骤三:获取连接->Connection connection = DriverManager.getConnection(url, username, password);

参数说明:

①url : 连接路径

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称[?参数键值对1&参数键值对2… ]

示例:jdbc:mysql://127.0.0.1:3306/student

②user :用户名

③poassword :密码

4.2.2.1、⭐注意事项:useSSL

如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,

则url可以简写为:jdbc:mysql:///数据库名称?参数键值对

配置 useSSL=false 参数,禁用安全连接方式,解决警告提示

Ex: jdbc:mysql://127.0.0.1:3306/student?useSSL=false

false前:

false后:

警告内容为:

Tue Jan 31 20:57:02 CST 2023 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

简单来说就是:

不建议在没有服务器身份验证的情况下建立 SSL 连接。

需要设置 useSSL=false 来显式禁用 SSL,或设置 useSSL=true 并为服务器证书验证提供信任库。

4.2.2、connection.createStaterment()

JDBC步骤五:获取执行SQL对象->Statement statement = connection.createStatement();

三种获取方式:

①普通执行SQL对象:Statement createStatement()

②预编译SQL的执行SQL对象:PreparedStatement prepareStatement(sql)->防止SQL注入

③执行存储过程的对象:CallableStatement prepareCall(sql)

通过方式③获取的 CallableStatement 执行对象是用来执行存储过程的,而存储过程在MySQL中不常用

4.2.2.1、 🔺🔺PreparedStatement

PreparedStatement作用: 预编译SQL语句并执行:预防SQL注入问题

sql语句中参数使用"?"进行占位,在执行SQL之前要设置这些"?"的值。

PreparedStatement对象方法:setXxx(参数1,参数2)->给SQL中的"?"赋值

Xxx:数据类型 ; 如 setInt (参数1,参数2)

参数:

参数1: ?的位置编号,从1 开始

参数2: ?的值

注意:

调用执行SQL语句的方法时不需要传递SQL语句,

因为获取SQL语句执行对象时已经对SQL语句进行预编译了。

代码改进如下:

改前:

1. package com.xzl;
2. 
3. import java.sql.Connection;
4. import java.sql.DriverManager;
5. import java.sql.Statement;
6. 
7. public class jdbc {
8. public static void main(String[] args) throws Exception {
9. //1、注册驱动
10.         Class.forName("com.mysql.jdbc.Driver");
11. //2、获取连接
12. String url = "jdbc:mysql://127.0.0.1:3306/student?useSSL=false";
13. String username = "root";
14. String password_P = "xzlXZGK680";
15. Connection connection = DriverManager.getConnection(url,username,password);
16. 
17. String sql = "update stu set gender='女' where name='李四' and gender='男'";
18. //4. 获取执行sql的对象Statement
19. Statement statement = connection.createStatement();
20. //此时需要开启事务之后再执行
21. try {
22. //禁用自动提交模式:false
23.             connection.setAutoCommit(false);
24. //5、执行SQL->此处需要开启事务之后再执行
25. int count = statement.executeUpdate(sql);
26.             System.out.println(count);
27. 
28. //6、处理结果
29. // ============提交事务==========
30. //程序运行到此处,说明没有出现任何问题,则需提交事务
31.             connection.commit();
32.         }catch (Exception e){
33. //事务程序出错,回滚事务
34.             connection.rollback();
35.             e.printStackTrace();
36.         }finally {
37. //7、释放资源
38.             statement.close();
39.             connection.close();
40.         }
41.     }
42. }

改后:

1. package com.xzl;
2. 
3. import java.sql.*;
4. 
5. public class jdbc {
6. public static void main(String[] args) throws Exception {
7. //1、注册驱动
8.         Class.forName("com.mysql.jdbc.Driver");
9. //2、获取连接
10. String url = "jdbc:mysql://127.0.0.1:3306/student?useSSL=false";
11. String username = "root";
12. String password_P = "xzlXZGK680";
13. Connection connection = DriverManager.getConnection(url,username,password);
14. //3、定义sql
15. String sql = "update stu set gender='女' where name=? and gender=?";
16. //4、获取预编译SQL的执行SQL对象:PreparedStatement
17. PreparedStatement preparedStatement = connection.prepareStatement(sql);
18. //设置参数值
19.         preparedStatement.setString(1,"李四");
20.         preparedStatement.setString(2,"男");
21. //此时需要开启事务之后再执行
22. try {
23. //禁用自动提交模式:false
24.             connection.setAutoCommit(false);
25. //5、执行SQL->此处需要开启事务之后再执行
26. int count = preparedStatement.executeUpdate();
27.             System.out.println(count);
28. 
29. //6、处理结果
30. // ============提交事务==========
31. //程序运行到此处,说明没有出现任何问题,则需提交事务
32.             connection.commit();
33.         }catch (Exception e){
34. //事务程序出错,回滚事务
35.             connection.rollback();
36.             e.printStackTrace();
37.         }finally {
38. //7、释放资源
39.             preparedStatement.close();
40.             connection.close();
41.         }
42.     }
43. }

4.2.3、事务管理

4.2.3.1、MySQL事务管理

回顾MySQL事务管理的操作:

①开启事务 : BEGIN; 或者 START TRANSACTION;

②提交事务 : COMMIT;

③回滚事务 : ROLLBACK;

MySQL默认是自动提交事务

4.2.3.2、⭐JDBC事务管理信息

JDBC事务管理的方法:Connection接口中定义了3个对应的方法:

方法

说明

开启事务

void setAutoCommit (boolean autoCommit)

将次连接的自动提交模式设置为给定状态

提交事务

void commit()

使自上次提交/回滚以来所做的所有更改成为永久更改,并释放此Connection对象当前特有的所有数据库锁

回滚事务

void rollback()

撤销当前事务中所做的所有更改,并释放此Connection对象当前特有的所有数据库锁

代码如下:

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
5月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
572 1
|
5月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
640 0
|
6月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
752 64
|
5月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
244 13
|
6月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
474 1
|
7月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
806 0
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
444 158
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1041 152
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
816 156

推荐镜像

更多