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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: [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 
相关文章
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
331 1
|
2月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
282 0
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
453 64
|
3月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
275 1
|
4月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
490 0
|
4月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
276 0
|
1月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
176 4
|
5月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
5月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。