JDBC 学习笔记(基础)

示意图

目录

创建 JDBC 应用

例子:通过本地协议纯 Java 驱动程序实现JDBC

代码具体步骤:

1.注册驱动

2.建立与数据库的连接

3.获取执行SQL语句的对象 Statement

4.定义执行 SQL 语句

5.操作结果集对象 ResultSet

6.关闭操作对象及连接对象

JDBC的主要类及常用方法

1.Class 类

2.DriverManager 类

3.Connection 类

4.Statement 类

5.ResultSet 类

SQL 注入问题

PreparedStatement 接口

JDBC连接不同的数据库


JDBC 核心类和库(java.sql)的主要类:

  • DriverMananer.:负责管理 JDBC 驱动程序,在使用JDBC驱动程序之前,必须先将驱动程序加载并注册后才可以使用,同时提供方法来建立与数据库的连接。
  • SQLException:有关数据库操作的异常。

而其主要接口如下:

  1. Connection:特定数据库的连接(会话)。在连接上下文中执行SQL语句并返回结果。
  2. PreparedStatement:表示预编译的SQL语句的对象。
  3. Statement:用于执行静态SQL语句并返回它所生成结果的对象。
  4. ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
  5. CallableStatement:用于执行SQL存储过程的接口。
     

创建 JDBC 应用程序

1.载入JDBC 驱动程序
首先要在应用程序中加载驱动程序 driver,使用 Class.forName() 方法加载特定的驱动程序,每种数据库管理系统的驱动程序不同,它们由数据库厂商提供。


2.定义连接URL


3.建立数据库连接
通过 DriverManager 类的 getConnection() 方法获得表示数据库连接的 Connection 类对象。

4.创建 Statement对象
获取 Connection对象以后,可以用Connection对象的方法创建一个 Statement对象的实例。

5.执行查询或更新
Statement对象可以执行 SELECT 语句的 executeQuery() 方法,可以执行 INSERT、UPDATE、DELETE 语句的 executeUpdate() 方法。


6.结果处理
利用语句对象对数据库操作返回的结果进行处理,ResultSet 包含一些用来从结果集中获取数据并保存到 Java 变量中的方法,主要包括 next() 方法:用于移动结果集游标;逐行处理结果集 getString()、getInt()、getDate()、getDouble() 等方法,用于将数据库中的数据类型转换为Java语言的数据类型。


7.关闭使用完的对象
使用与数据库相关的对象非常耗内存,因此,在数据库访问后要关闭与数据库的连接,同时还应该关闭ResultSet、 Statement和 Connection 等对象。可以使用每个对象自己的close()方法完成。

例子:通过本地协议纯 Java 驱动程序实现JDBC

以MySQL为例,我们先下载一个MySQL数据库驱动jar包。

前提:创建一个Java项目,在项目中创建一个名为libs的目录(为了方便管理,就把jar包文件放入此目录下),然后在src下建一个包,包下再建一个类,比如:

(注意!之后选择libs右键——>Add as Library,以导入识别jar包)

代码具体步骤:

  1. 导入jar包(package)
  2. 注册驱动
  3. 获取数据库的连接对象
  4. 获取执行SQL语句的对象
  5. 定义、执行SQL语句并接收返回结果
  6. 处理结果
  7. 释放资源

以 MySQL 为例来说明 JDBC 的步骤:

1.注册驱动

Class类提供的加载驱动程序的方法:

public static Class forName(String className) throws ClassNotFoundException

(加载驱动程序时会抛出 ClassNotFoundException 的 SQLException 异常)

例如加载 MySQL 驱动程序的语句描述:

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

2.建立与数据库的连接

DriverManager 类提供了 getConnection() 方法用于获取指定数据库的连接对象:

public static Connection getConnection (String url, String userName, String password) throws SQLException

MySQL 数据库的 url 格式为:

jdbc:mysql://[host1:port1],[host2:port2].../[database][?参数名1][=参数值1][&参数名2][=参数值2]...

例子:定义本地默认连接 url

1.
String url = " jdbc:mysql://localhost:3306/eshop?useUnicode=true&characterEncoding=UTF-8";
2.
String url2 = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8";

拿到数据库的连接:

Connection conn = DriverManager.getConnection(url,"root","password")

3.获取执行SQL语句的对象 Statement

Connection 接口中提供了获取 Statement 对象的方法:

Statement createStatement() throws SQLException

通过调用重载的 createStatement() 方法指定参数,设置数据库操作结果的相关属性。比如获取 Statement 对象(用来执行 SQL 语句,并接收返回结果)

Statement stmt = conn.createStatement();

4.定义执行 SQL 语句

需通过可以发送 SQL 命令的 Statement 对象 st。比如调用对象 st 的 executeQuery() 方法发送 SQL 查询命令。查询的主要方法如下:

1.
boolean execute(String sql) throws SQLException
2.
ResultSet executeQuery(String sql) throws SQLException
3.
int executeUpdate(String sql) throws SQLException

5.操作结果集对象 ResultSet

ResultSet 接口提供可对结果集进行操作的主要方法如下:

1.
boolean next() throws SQLException
//移动结果集操作指针
2.
XXX getXXX(String columnName) throws SQLException
//指定数据类型,根据传入列的名字获取指定列的值
3.
XXX getXXX(1) throws SQLException
//指定数据类型,根据传入列的编号获取指定列的值

SQL 类型和 Java 数据类型的对应关系
SQL 类型Java 类型
CHARString
VARCHARString
LONGVARCHARString
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITboolean
TINYINTbyte
SMALLINTshort
INTEGERint
BIGINTlong
REALflout
FLOATdouble
DOUBLEdouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp

6.关闭操作对象及连接对象

数据库操作完成后,就可调用接口 ResultSet、Statement、Connection 中的关闭方法了,立即释放数据库和JDBC相关资源。如下所示:

void close() throws SQLException

关闭顺序如下:

  1. 关闭 ResultSet 对象
  2. 关闭 Statement 对象
  3. 关闭 Connection 对象

JDBC的主要类及常用方法

JDBC 的一系列步骤都由 JDBC API 中一组类的方法实现,如下:

1.Class 类

java.lang.Class,Java程序运行时会自动创建程序中的每个类的Class对象,通过Class类的方法可以得到程序中每个类的信息。

格式效能补充/例子
public static Class forName(String className)根据“限定全类名”来获取相应的Class对象

Class.forName(sun.jdbc.odbc.JdbcOdbcDriver)加载指定名称(JDBC-ODBC桥)的驱动程序

public String getName()根据对象,返回类名不怎么常用

2.DriverManager 类

DriverManager(驱动程序管理器)类维护着用户程序与数据库驱动程序之间的连接。它实现了驱动程序的装载、创建连接数据库系统的 Connection 类对象。

格式效能补充
public static Connection getConnection(String url, String user, String password)根据url(数据库JDBC-ODBC桥名称)、数据库用户名、密码获取一个数据库的连接对象静态成员方法

3.Connection 类

Connection 连接类用于管理指定数据库的连接。

格式效能
createStatement()创建 Statement 类的实例
prepareSatement()创建 PreparedStatement 类的实例
close()关闭 Connection 对象

4.Statement 类

Statement 数据库操作类提供执行数据库操作的方法,如更新、查询数据库记录等。例子如下:

Statement stmt = conn.createStatement();

重要的成员方法如下:

格式效能
ResultSet executeQuery(String sql)用来执行查询语句,并返回一个ResultSet对象
int executeUpdate(String sql)用来执行“增删改”语句,返回值代表影响的行数
boolean execute(String sql)用来执行任意语句,返回代表是否返回了ResultSet
close()关闭 Statement 对象

5.ResultSet 类

ResultSet 结果集类提供对查询结果集进行处理的方法,如:

ResultSet rs = stmt.executeQuery("select * from users");

ResultSet 对象维持着一个指向表格的行的指针,开始运行时指向表格的起始位置(第一行之前:0行)

格式效能
next()光标(指针)移到下一条记录,返回一个boolean值
privious()光标(指针)移到上一条记录

getXXX("字段名")或

getXXX(int i)等

获取指定类型的字段值。
close()关闭 ResultSet 对象

ResultSet 接口提供的 getXXX 方法
方法Java返回类型
getASCIIStreamjava.io.InputStream
getBigDecimaljava.math.BigDecimal
getBinaryStreamjava.io.InputStream
getBooleanboolean
getBytebyte
getBytesbyte[]
getDatejava.sql.Date
getDoubledouble
getFloatfloat
getIntint
getLonglong
getObjectObject
getShortshort
getStringjava.lang.String
getTimejava.sql.Time
getTimestampjava.sql.Timestamp
getUnicodeStreamjava.io.InputStream of Unicode characters

SQL 注入问题

在使用 Statement 对象查询数据库时,由于定义的 SQL 语句是拼接的,就有可能出现 SQL 注入问题。所谓SQL注入就是把SQL命令插入查询字符串中,最终达到欺骗服务器执行恶意的SQL命令的目的。

PreparedStatement 接口

此接口表示预编译的 SQL 语句的对象,是为了解决 Statement 静态拼接所产生的 SQL 注入问题。PreparedStatement 接口是 Statement 接口的子接口,其允许使用不同的参数多次执行相同的SQL语句。

Connection 接口提供创建 PreparedStatement 接口对象的方法,可指定SQL语句

PreparedStatement preparedStatement(String sql) throws SQLException

虽然 PreparedStatement 接口继承了 Statement 接口,但 PreparedStatement 语句中包含了警告预编译的 SQL 语句,因此其效率更高。

PreparedStatementStatement
能写啥?带参数的SQL语句简单的SQL语句
比较可动态设置参数、增加了预编译功能、提高了执行速度-

而且 PreparedStatement 的语句可以包含多个用“?”代替的字段,设置时按要素出现顺序传参即可。如:

Connection conn = DBUtil.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT * FROM users WHERE NAME=? AND PWD=?";
ps = conn.preparedStatement(sql);
ps.setString(1, name);
ps.setString(2, pwd);
rs = ps.executeQuery();

格式效能
ResultSet executeQuery()执行SQL查询并获取ResultSet对象
int executeUpdate()执行“增删改”操作,返回值是执行该操作所影响的行数
boolean execute()执行任意语句,返回代表是否返回了ResultSet

PreparedStatement 接口 setXXX 方法
方法SQL类型
setASClIStream产生一个 LONGVARCHAR 型的 ASCII 流
setBigDecimalNUMERIC
setBinaryStreamLONGVARBINARY
setBooleanBIT
setByteTINYINT
setBytes

VARBINARY 或 LONGVARBINARY

(大小取决于对 VARBINARY 的限制)

setDateDATE
setDoubleDOUBLE
setFloatFLOAT
setIntINTEGER
setLongBIGINT
setNullNULL
setObject在发送之前,转换为目标 SQL 类型的给定对象
setShortSMALLINT
setString

VARCHAR 或LONGVARCHAR

(大小取决于驱动程序对 VARCHAR 的限制)

setTimeTIME
setTimestampTIMESTAMP

JDBC连接不同的数据库

JDBC 是一套数据库连接的标准,许多数据库连接的区别如下:

  1. 数据库驱动路径名不同
  2. 连接数据库的 url 不同

数据库连接池(连接对象的集合)

数据库连接池的特点:

  • 是个容器,负责分配、管理数据库连接
  • 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接
  • 释放空闲时间超过最大空闲时间的数据库连接,来避免因为没有释放数据库连接而引起的数据库连接遗漏

总结:(我觉得有点像 DHCP 服务器)

  1. 资源重用
  2. 提升系统响应速度
  3. 避免数据库连接遗漏

数据库连接池实现

标准接口:DateSource(而不是以往的 JavaManager)

  • 官方(Sun)提供的数据库连接池标准接口,由第三方组织实现此接口
  • 其功能就是获取连接

常见的数据库连接池:DBCP、C3P0、Druid

我们以Druid(德鲁伊)为例,其是阿里巴巴开源的数据库连接池项目(功能强大、性能优秀)。

注意SQL命令、参数设置、处理结果

略,有点事以后补充!

DBUtils我觉得还算是一个挺好用组件,在学习Hibernate,Mybatis这些ORM框架之前,可以学着用用。可以极大简化我们的JDBC的代码,用起来也很方便。

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

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

相关文章

【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

《关于如何防止edge浏览器偷取chrome浏览器的账号》 前段时间edge自动更新了,我并没有太在意界面的问题。但是由于我使用同一个网站平台时,例如b站,甚至是邮箱,edge的账号和chrome的账号会自动同步,这就导致我很难短时…

CSS 实现祥云纹理背景

🪴 背景 最近掘金出来一个中秋创意活动,我准备参加一下。作品方向选择用纯css做一个中秋贺卡,其中有一些中秋的元素和一些简单的动画,而贺卡背景的实现就是本文要讲的内容。 中秋贺卡成果图(生成gif有点失真&#x1f6…

亚马逊鲲鹏系统日程控制功能可自动管理你的买家号

亚马逊鲲鹏系统是一款针对亚马逊买家号功能比较齐全的软件,可以批量注册、智能养号、自动下单、自动留评、QA等,这一系列功能都可以用日程控制进行管理操作。日程控制管理可以让你在吃饭睡觉、逛街玩耍时自动管理你的买家账号。 日程管理功能可以设置每月…

数据结构——二叉搜索树

二叉搜索树是二叉树的一种特殊形式。 二叉搜索树具有以下性质: 1.每个节点中的值必须大于(或等于)其左侧子树中的任何值 2.每个节点中的值必须小于(或等于)其右侧子树中的任何值。 像普通的二叉树一样,我们…

分享美好瞬间,内网穿透工具助您实现公网访问本地私人图床

文章目录 1. 树洞外链网站搭建1.1 下载安装树洞外链1.2 树洞外链网页测试1.3 cpolar的安装和注册 2.本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置) 3.公网访问测试 社交平台具有庞…

《Playing repeated games with Large Language Models》全文翻译

《Playing repeated games with Large Language Models》- 使用大型语言模型玩重复游戏 论文信息摘要1. 介绍2. 相关工作3. 一般方法4. 分析不同游戏系列的行为5. 囚徒困境5.1 性别之战 6. 讨论 论文信息 题目:《Playing repeated games with Large Language Model…

js中运算规则

法: 有对象,对象是根据object.valueof().toString()返回的值 //toString的对象 var obj2 {toString:function(){return a} } console.log(2obj2) //输出结果2a//常规对象 var obj1 {a:1,b:2 } console.log(2obj1); //输出结果 2[object…

uniapp h5 echarts 打包后图表点击失效/及其他失效

文章目录 期望效果实际效果环境引入echarts方式解决方法:注意 原因多说一句在h5打包的时候将 history 改为 hash 不然在浏览器打开后刷新会404 期望效果 实际效果 环境 pc端 window11 hbuilderx版本 3.8.12 echarts版本 5.4.3 引入echarts方式 npm install echar…

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

阿里云无影云桌面APP客户端下载(无影云电脑)

阿里云无影云电脑APP下载链接入口,支持iOS、Android、Windows、macOS和Web客户端,阿里云百科分享阿里云无影云电脑APP下载链接: 目录 阿里云无影云电脑APP下载链接入口 Windows客户端 macOS客户端 Web网页客户端 iOS客户端 Android客户…

自动驾驶之高精地图介绍

高精地图 文章目录 高精地图前言什么是高精地图高精数据分发引擎1.3 名词解释1. ADAS(Advanced DriverAssistance System)2. 为什么需要高精数据的分发引擎 高精数据分发引擎的建设高精数据分发引擎与ADAS应用的关系高精数据分发引擎架构高精数据分发引擎的模型表达路网模型的抽…

详解API接口如何安全的传输数据

概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践: 使用HTTPS:使用HTTPS协议而不是HTTP,以确保数据在传输过程中的安全性。HTTPS使…

软件系统的预算评估方法

软件系统的预算评估是确保项目能够在预定时间和成本范围内完成的重要步骤之一。以下是一些常见的软件系统预算评估方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.比较估算法: 这是…

JMeter压测工具介绍、安装及汉化教程,详解安装目录结构

🧑‍💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

新一代最强开源UI自动化测试神器Playwright(Java版)(对话框处理)

🎭Playwright让网页对话框🌐💬处理变得更加快捷!网页对话框是在网页上出现的常见弹窗,包括Alert、Confirm和Prompt等。这些对话框通常需要用户输入信息或进行某些选择,但是在自动化测试中处理它们可能会很棘…

KVM嵌套虚拟化实现

KVM嵌套虚拟化实现 理论 Libvirt主要支持三种 CPU mode host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的…

片上网络(1)概述

前言 NoC:On-Chip Networks,片上网络。 由于多核乃至众核时代的到来,用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时,总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1的整数,通俗来讲就是提供了一种可以表示任意大整数的方法,当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候,会出错。所以此时我们需要使用Big…

LeetCode(力扣)55. 跳跃游戏Python

LeetCode20. 有效的括号 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game/ 代码 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) < 1:return Truecover 0for i in range(len(nums)):if i < cover:cover max(cover, i …

免备案海外服务器有什么好处?

介绍一&#xff1a;了解海外服务器免备案的优点 免备案海外服务器是指在国外搭建网站服务器而不是在国内备案&#xff0c;这种模式可以带来一定的便利 。首先&#xff0c;海外服务器免备案可以使网站更加稳定&#xff0c;因为国外网络环境更加稳定&#xff0c;大多数国外服务 器…