JavaDataBase连接数据库操作的步骤解析

2023-09-13
来源:网络整理

1. 概念

1、为了让程序能够操作数据库,操作数据库中的表,每个数据库都会提供一套驱动程序来连接和操作数据库,并且每个数据库的驱动程序都不同。 比如数据库使用了驱动程序,数据库使用了驱动程序,如果我们写的程序有一天想要改变数据库,那会很不方便,因为所有连接数据库的代码都要重写。 SUN公司进行简化。 统一数据库的操作,定义一套Java操作数据库的标准或规范。 这个规范就是 JDBC。

2、JDBC的全称是:Java Data Base(java数据库连接),主要由接口组成。 在我们的开发过程中,只要实现其相应的接口就可以轻松连接。

3、我们在开发JDBC应用程序时,还需要导入相应的数据库驱动jar包。 这些驱动jar包是数据库公司自己编写的。

2、编写JDBC应用程序(需要连接数据库的程序)的前提准备

1. 首先,确定您要连接到哪个数据库实例。 例如,我们可以先创建一个库,然后在库中创建一个新表,并向表中插入一些数据。 我将在这里提供一个段落来在数据库中创建一个库。 ,还有表和数据的sql语句,也是下面连接数据库后操作的库和表。

create database test ; /*创建一个名为Test的数据库*/ use test;        /*使用该数据库或者说切换到该数据库*/ create table book ( id int primary key auto_increment, /*列:id ,类型:int,从0开始,自动增加, 备注:主键*/ name varchar(40) NOT NULL,    /*列:name ,类型:varchar, 备注:非空*/ author varchar(40)NOT NULL, /*列:author ,类型:varchar, 备注:非空*/ prices double NOT NULL /*列:prices ,类型:double, 备注:非空*/ ); /*新建一张名为book的表*/ /*插入四大名著的数据*/ insert into book(id,name,author,prices) values (null,'西游记','吴承恩',25.00); insert into book(id,name,author,prices) values (null,'水浒传','施耐庵',30.00); insert into book(id,name,author,prices) values (null,'红楼梦','曹雪芹',35.00); insert into book(id,name,author,prices) values (null,'三国演义','罗贯中',40.00);

2、新建一个java项目,然后导入驱动jar包,即添加到程序运行的库中。 我们可以在数据库的安装目录中找到具体的驱动jar包,或者网上下载对应的数据库。 驱动jar包

3、连接数据库的步骤分析

(1)注册数据库驱动

虽然我们在新建java项目时只是导入了数据库驱动jar包,但是JBDC并不知道这里有驱动包。 这时候我们就需要把这个驱动包交给JBDC来管理。 我们可以使用 java.sql 包下的工具类提供的 () 方法来在 JDBC 中注册这个数据驱动程序。 这个()方法需要一个对象,这个类本身就是JDBC提供的接口。 我们的驱动已经实现了这个接口,所以我们只需要编写如下代码即可实现注册数据库驱动的功能

import java.sql.DriverManager; //需要导入的是接口类包 DriverManager.registerDriver(new Driver());

(2) 获取(创建)数据库连接

我们注册数据库驱动后,并没有连接数据库。 以前我们通过CMD窗口下的可视化数据库管理工具操作数据库时,需要先连接数据库服务器。 连接数据库的java程序也不例外。 这里的java程序就相当于客户端。 只有连接到数据库服务才能对数据库进行操作。

客户端和数据库之间的所有交互都是通过对象完成的。 该对象的常用方法:

():创建一个向数据库发送SQL的对象。

(sql):创建一个将预编译的sql发送到数据库的方法

这里我们可以通过工具类中的(url, user,)方法创建数据库连接对象。 该方法需要传入三个参数:

用户:数据库用户名

:用户密码

URL:数据库服务器地址。 不同的数据库有不同的URL写法。 这里我提供了主流数据库URL地址的三种写法:

写入方法:jdbc::thin:@:1521:sid

写入方法:jdbc::://:1433; =sid

写入方法:jdbc:://:3306/sid

url地址缩写:jdbc::///sid

注:后面的sid是数据库的实例名(使用的数据库名)

import java.sql.Connection; //导入的是接口类包 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); //这里使用的是一个名为test的mysql数据库,用户名和密码都是root 

(3) 创建发送器对象

上面我们创建了数据库连接并连接到了数据库,但是如果我们想要操作数据库,就需要使用sql语句,而我们在java程序中如何使用sql语句来操作数据库呢? 这里我们需要一个发送器对象来将sql语句传输到数据库执行。上面提到了,类中有一个()方法来创建发送器对象。

import java.sql.Statement; //导入的是接口类包 Statement stat = conn.createStatement();

(4)使用发送器对象向数据库传输sql语句执行操作,并将结果作为结果集返回

java.sql中传输sql语句的方式有很多种。 最常用的是

(sql):用于向数据发送查询语句。

(sql):用于向数据库发送or语句

(sql):用于向数据库发送任意sql语句

import java.sql.ResultSet; //需要导入的接口类包 ResultSet rs = stat.executeQuery("select * from book"); //传输一条查询语句,查询book表中所有的元组数据

(5) 遍历结果集,获取查询对象

在Jdbc程序中使用,表示Sql语句的执行结果。 在封装执行结果时,采用类似表格的方式。 该对象维护一个指向表数据行的游标。 最初,光标位于第一行之前。 调用.next()方法可以使光标指向特定的数据行,并调用该方法获取该行的数据。

由于是用来封装执行结果的,所以该对象提供了get方法来获取数据:

获取指定类型的数据,例如:

(整数)

( )

还提供了滚动结果集的方法:

next():移动到下一行

():移至上一行

(int row):移动到指定行

():机芯的前端。

():移至最后。

while(rs.next()) { String name = rs.getString("name"); System.out.println(name); }

(6)关闭连接(先创建后关闭)

Jdbc程序运行后,记得释放程序在运行过程中创建的用于与数据库交互的对象。 这些对象通常是 , 和 对象。

尤其是对象,是非常稀有的资源,使用后必须立即释放。 如果不能及时、正确地关闭它们,很容易导致系统停机。 使用原则是尽可能晚创建、尽早释放。

rs.close(); stat.close(); conn.close();

初始完整源代码

package jdbcDemo; /**************************** * 初版连接数据库程序 **************************/ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; //不能导入 java.sql 中的 Driver 接口,要导入驱动jar包中实现该接口的类,只有这要才能注册相对应的数据库驱动 import com.mysql.jdbc.Driver; public class JDBCTest { public static void main(String[] args) throws SQLException { //1.注册数据库驱动 DriverManager.registerDriver(new Driver()); //2.获取数据库的连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root"); //3.创建传输器对象 Statement stat = conn.createStatement(); //4.利用传输器对象传输sql语句到数据库中执行操作,将结果用结果集返回 ResultSet rs = stat.executeQuery("select * from book"); //5.遍历结果集,并获取查询结果 while(rs.next()) { String name = rs.getString("name"); System.out.println(name); } //6.关闭连接(后开先关) rs.close(); stat.close(); conn.close(); } }

数据表查看及运行结果:

4、初始数据库连接程序出现的问题

1--数据库驱动注册方式不当导致两次注册小程序连接云开发数据库代码,程序通用性低。

当我们查看该类的源代码时,可以看到如下代码。 从第7行代码可以看到,我们在类的实现中注册了一次,在程序中又注册了一次,导致注册了两次。

我们在注册驱动的时候,需要导入驱动jar包中已经实现的类,这样程序就和具体的数据库绑定了,程序的通用性就降低了。 如果我们想切换数据库,就必须更改源代码。

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!"); } }

使固定:

使用 .() 方法将实现的类加载到程序中。 由于类在实现接口时使用了静态代码块,因此静态代码块只会在类加载时执行一次,这保证了数据库驱动程序只会注册一次,不需要导入该类封装在驱动程序中,提高了程序的通用性。

.("com..jdbc.");

2--忽略程序中可能抛出的异常(最大的问题)

当我们执行一个程序时,它的许多方法调用都会抛出异常。 如果它抛出异常并且没有进行相应的处理(这个异常),那么程序就会中断执行,而对象和对象也不会被关闭,而且我们知道对象是非常稀有的资源,使用后必须立即释放。 如果不能及时、正确地关闭它们,很容易导致系统停机。 因此,我们需要保证无论程序的哪一步出现异常,程序都会被中断,连接也会被关闭。 该代码将被执行。 这时候我们就会想到异常处理中的代码块。 我们可以向上抛出异常,但是先尝试,然后异常,最后执行代码块。

修改后发现每个()都提示有异常需要处理。 这时候我们也直接try/each异常

修改后的源码:

package jdbcDemo; /**************************** * 修改版连接数据库程序 **************************/ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { public static void main(String[] args) { Connection conn = null; Statement stat = null; ResultSet rs = null; try { //1.注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库的连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root"); //3.创建传输器对象 stat = conn.createStatement(); //4.利用传输器对象传输sql语句到数据库中执行操作,将结果用结果集返回 rs = stat.executeQuery("select * from book"); //5.遍历结果集,并获取查询结果 while(rs.next()) { String name = rs.getString("name"); System.out.println(name); } }catch(Exception e) { e.printStackTrace(); }finally { //6.关闭连接(后开先关) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

5.修改后的程序中忽略的异常

异常问题

1、由于我们在程序开头首先声明了三个对象的引用,并赋值为null,如果程序在执行注册数据库这一步时抛出异常,那么会在异常之后执行代码块,结果发现对象的引用、对象的引用、对象的引用都是空值。 调用该对象的方法将抛出空指针异常。

2.()这个方法也有例外。 如果我们不处理相应的异常,那些对象仍然无法正常关闭。

解决方案

1---为了防止空指针异常,我们可以先判断哪些对象的引用是否为空。 如果没有,则执行异常处理代码

2---在每个()异常处理后添加静态代码块,并将每个对应对象的引用值设置为null。 原理是:如果程序执行到()方法并抛出异常,则执行代码块,并将对象的值设置为null。 由于该对象没有任何引用指向它,因此它成为垃圾对象。 JVM垃圾收集器将回收对象资源,并且对象将被关闭。

异常处理后最终源码:

package jdbcDemo; /**************************** * 无异常版连接数据库程序 **************************/ import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { public static void main(String[] args) { Connection conn = null; Statement stat = null; ResultSet rs = null; try { //1.注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库的连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root"); //3.创建传输器对象 stat = conn.createStatement(); //4.利用传输器对象传输sql语句到数据库中执行操作,将结果用结果集返回 rs = stat.executeQuery("select * from book"); //5.遍历结果集,并获取查询结果 while(rs.next()) { String name = rs.getString("name"); System.out.println(name); } }catch(Exception e) { e.printStackTrace(); }finally { //6.关闭连接(后开先关) if(rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { rs = null; } } if(stat != null) { try { stat.close(); } catch (SQLException e) { e.printStackTrace(); }finally { stat = null; } } if(conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }finally { conn = null; } } } //--finally } //--main }//--class

总结:

这里我只是处理了所有的异常,但是程序的通用性并不是特别高,因为用于连接数据库的类名、URL、用户等都写在程序中了。 我们其实可以将它们写在一个文本文件中,通过读取文件来获取每个数据库特有的连接参数。

而且,在实际开发过程中,连接数据库的程序代码一般都是写在工具类中。 当我们要操作数据库中的数据时,只需要调用这个工具类就可以了,不需要每次都去写。 这么多代码

接下来我还会更新一篇文章,介绍如何将数据库连接信息保存在文本文件中,然后读取这个文件来连接数据库。 同时我也会把这个程序修改成一个连接数据库的工具类。

以上就是本文的全部内容。 希望本文的内容能够给大家的学习或者工作带来一些帮助,也希望大家的支持!

分享