数据库访问

本文详细介绍了如何在Java中连接MySQL数据库,包括加载驱动、创建连接、创建Statement对象、执行SQL语句及访问结果集的过程,同时强调了数据库操作完成后需正确关闭相关对象的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

● 加载数据库驱动;
● 建立数据连接;
● 创建Statement对象;
● 执行SQL语句;
● 访问结果集;

加载数据库驱动

通常使用Class类的forName()静态方法来加载数据库的驱动,其语法格式如下所示:
//加载驱动
Class.forName(数据库驱动类名);
例如:
Class.forName("com.mysql.jdbc.Driver");          //加载MySQL驱动
需要注意的是:不同的数据库其数据库驱动类是不同的,例如:Oracle数据库的驱动类是oracle.jdbc.driver.OracleDriver,而MySQL的数据库驱动类是com.mysql.jdbc.Driver。数据库厂商在提供数据库驱动(通常是一个或几个jar文件)时,会有相应的文档说明。

建立数据库连接
在使用JDBC操作数据库之前,需要先创建一个数据库连接,使用DriverManager类的getConnection()静态方法来获取数据库连接对象,其语法格式如下所示:
DriverManager.getConnection(String url,String user,String pass);
其中,getConnection()方法有三个参数,具体如下:
● url:数据库连接字符串,遵循的格式是“jdbc:驱动:其他”,不同的数据库连接的URL也有所不同。
● user:连接数据库的用户名;
● pass:密码。

例如,访问MySQL数据库的URL连接字符串
“jdbc:mysql://127.0.0.1:3306/student”
在上面的URL连接字符串中:
● jdbc:mysql是协议名称
● “127.0.0.1”是本机服务器IP地址,也可以使用“localhost”;
● “3306”是MySQL数据库的端口号;
● “student”是数据库实例名。
例如:获取MySQL数据库连接对象

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(
	"jdbc:mysql://127.0.0.1:3306/student",//URL连接字符串
	"root",                               //用户名
	"root");                              //密码

创建Statement对象
对数据库进行操作或访问时,需要使用SQL语句。在Java语言中,SQL语句是通过Statement对象进行封装后,发送给数据库。Statement对象不是通过Statement类直接创建的,而是通过Connection对象所提供的方法来创建各种Statement对象。
通过Connection对象来获得Statement的方法有以下三种:
● createStatement()方法:创建一个基本的Statement对象;
● prepareStatement(String sql)方法:根据参数化的SQL语句创建一个预编译的PreparedStatement对象;
● prepareCall(String sql)方法:根据SQL语句来创建一个CallableStatement对象,用于调用数据库的存储过程。
例如:
// 创建Statment对象
Statement stmt = conn.createStatement();

执行SQL语句
获取Statement对象之后,就可以调用该对象的不同方法来执行SQL语句。所有的Statement都有三种执行SQL语句的方法,具体使用哪一种方法由SQL语句产生的结果来决定:
● executeQuery()方法:只能执行查询语句,例如SELECT语句,用于产生单个结果集;
● executeUpdate()和executeLargeUpdate()方法:用于执行DML和DDL语句,执行DML(INSERT、UPDATE或DELETE语句)时返回受SQL语句所影响的行数(整数值),而执行DDL语句(CREATE TABLE、DROP TABLE等)返回值总为0;
● execute()方法:可以执行任何SQL语句,此方法比较特殊,也比较麻烦,返回结果为多个结果集、多个更新计数或二者的组合。通常不建议使用该方法,只有在不知道执行SQL语句会产生什么结果或可能有多种类型结果的情况下才会使用。
如果SQL语句运行后能产生结果集,Statement对象则将结果集封装成ResultSet对象并返回。下述代码调用Statement对象的executeQuery()方法来执行SQL查询语句,并返回一个ResultSet结果集对象。
例如:执行SQL查询语句并返回结果集
ResultSet rs = smt.executeQuery(“SELECT * FROM t_user”);

访问结果集
SQL的查询结果使用ResultSet封装,ResultSet结果集包含了满足SQL查询条件的所有的行,使用getXXX()方法对结果集中的数据进行访问。
当使用getXXX()方法访问结果集中的数据时,可通过列索引或列名来获取游标所指行中的列数据,其语法格式如下;
getXXX(列索引)

getXXX(“列名”)
例如:循环输出结果集中第三列数据。

while (rs.next()) {
System.out.println(rs.getString(3));
}
或
while (rs.next()) {
System.out.println(rs.getString("name"));
}

需要注意的是:在使用getXXX()方法来获得数据库表中的对应字段的数据时,尽可能使用序列号参数,这样可以提高效率。除Blob类型外,其他任意类型的字段都可以通过getString()方法来获取,因为所有数据类型都可以自动转换成字符串。
当数据库操作执行完毕或退出应用前,需将数据库访问过程中建立的对象按顺序关闭,防止系统资源浪费。关闭的次序是:
① 关闭结果集:rs.close();
② 关闭Statement对象:stmt.close();
③ 关闭连接:conn.close();
下述案例用于示例访问数据库的一般步骤,代码如下所示。

【代码14.2】

ConnectionExample.java
package com;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectionExample {
	public static void main(String[] args) {
		try {
			// 加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 建立数据库连接
			Connection conn = DriverManager.getConnection(
					"jdbc:mysql://127.0.0.1:3306/student", "root", "root");
			System.out.println("连接成功!");
			// 创建Statment对象
			Statement stmt = conn.createStatement();
			// 获取查询结果集
			ResultSet rs = stmt.executeQuery("SELECT * FROM t_user");			
			System.out.println("查询成功!");
			// 访问结果集中的数据
			while (rs.next()) {
				System.out.println(rs.getString(1) + "  "
			+ rs.getString("name"));
			}
			// 关闭结果集
			rs.close();
			// 关闭载体
			stmt.close();
			// 关闭连接
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
上述代码按照访问数据库的一般步骤编写。
① 通过Class.forName()方法加载MySQL数据库驱动;
② 调用DriverManager.getConnection()方法来建立MySQL数据库连接,在获取连接时需要指明数据库连接的URL、用户名和密码;
③ 通过连接对象的createStatement()方法来获取Statement对象,调用Statement对象的executeQuery()方法执行SQL语句;
④ 调用ResultSet结果集对象的next()方法将游标移动到下一条记录,再通过getXXX()方法来获取指定列中的数据;
⑤ 最后调用close()方法关闭所有创建的对象。
程序运行结果如下所示:
连接成功!
查询成功!
19  向守超
20  张恒

我是田先生,一名热爱技术、热爱生活的Java程序员。专注分享java基础、dubbo源码、zookeeper, rabbitmq、mybatis源码、微服务springboot、集群、分布式、多线程等相关知识与实战经验。欢迎大家积极交流,共同探讨。欢迎关注我的公众号:t-j20120622(Java后端技术栈)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TJ统计

关注公众号:Java后端技术栈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值