JDBC简介

JDBC全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java的API,应用程序可以通过这套API关系到数据库,并使用SQL语句来完成对数据库的增删改查等操作。

这也可以说是一个Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。

使用JDBC的好处

  1. 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
  2. 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库

JDBC的原理

JDBC由两层构成,上层是JDBC的API,负责在Java应用中,负责在Java应用程序和JDBC驱动程序管理器之间通信,负责发送程序的SQL语句;
下层是JDBC的驱动程序API,负责JDBC驱动程序API,负责JDBC驱动程序管理器与实际连接的数据库的厂商驱动程序和第三方驱动程序之间通信,返回查询信息或执行规定的操作。

1.Java应用程序:
Java应用程序除了程序本身以外,还包括Applet和Servlet,这些类型的程序都可以利用JDBC来实现对数据库的访问,JDBC可以在其中请求执行与数据库建立连接,像数据库发送SQL请求,处理查询,错误处理等操作。

2.JDBC驱动程序管理器:
JDBC驱动程序管理器动态地维护数据库查询所需要的驱动程序对象,实现Java程序与特定驱动程序的连接,它可以为特定的数据库选取驱动程序,处理JDBC初始化调用,为每个驱动程序提供JDBC功能的入口,为JDBC调用传递参数等等。

3.厂商或第三次提供驱动程序
数据库厂商或者第三方提供了驱动程序,由JDBC方法调用,向特定数据库发送SQL请求,并为程序获取结果,驱动程序完成与数据库建立连接,发送请求,进行处理等操作。

4.数据库
数据库指数据库管理系统和用户程序所需要的数据库,在实际操作中,要使用JDBC-ODBC桥驱动程序连接数据库。

JDBC常用的API

Driver接口

Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用,需要注意的是,在编写JDBC程序的时候,必须要将使用的数据库驱动程序或类库加载到项目的classpath中,比如说MySQL的驱动JAR包。

DriverManager类

该用于加载JDBC驱动程序并且创建与数据库的连接,在DriverManager类中定义了几个比较重要的静态方法,如下:

public static void deregisterDriver(Driver driver) throws SQLException 
//该方法是从DriverManager的管理列表中删除一个驱动程序。其中driver参数是要删除的驱动对象。

public static Connection getConnection(String url) throws SQLException  
//该方法是根据指定数据库连接URL,建立与数据库连接Connection。其中参数url是数据库连接的URL

public static Connection getConnection(String url,Properties info)  
//该方法是根据指定数据库连接URL,以及数据库连接属性信息建立数据库连接Connection。其中参数url为数据库连接URL,参数info是数据库连接属性。

public static Connection getConnection(String url,String user,String password) throws SQLException  
//该方法是根据数据库连接URL、用户名以及密码建立数据库连接Connection。参数url是数据库连接URL,参数user是连接数据库的用户名,参数password是连接数据库的密码。

public static Enumeration<Driver>getDrivers()  
//该方法是获取当前DriverManager中已加载的所有驱动程序,它的返回值为Enumeration。

public static void registerDriver(Driver driver) throws SQLException  
 //该方法是向DriverManager注册一个驱动对象,参数driver是要注册的驱动。

Connection接口

Connection接口是java集合的root接口,没有实现类,只有子接口和实现子接口的各种容器。主要用来表示java集合这一大的抽象概念。

Connection接口位于java.sql包当中,是与数据库连接会的对象,只有获得特定的数据库连接对象,才可以访问数据库进行数据库操作。

但是在进行数据库连接的时候还要用到DriverManager类中的getConnection(url,username,password)方法。例如:


String url = "jdbc:mysql://localhost:3306/mysqltest";    //数据库用户名
            String userName = "root";     //数据库密码
            String passWord = "123456";     //创建Connection连接
            Connection conn = (Connection)DriverManager.getConnection(url,userName,passWord);  //利用了getConnection方法实现了Connection接口
            

Statement接口

该接口是用来执行静态的SQL语句并返回执行结果,也就是不带参数的SQL语句

该类是Java程序执行数据库操作的重要接口,用于已经建立数据库连接的基础之上,向数据库发送要执行的SQL语句。它用于执行不带参数的简单SQL语句。该接口中包含九个常用的重要方法。

void addBatch(String sql) throws SQLException
该方法是将SQL语句添加到此Statement对象的当前命令列表中,此方法用于SQL命令的批处理。

void clearBatch() throws SQLException
该方法是清空Statement对象中的命令列表。

void close() throws SQLException 
该方法是立即释放此Statement对象的数据库和JDBC资源,而不是等待该对象自动关闭时发生此操作。

boolean excute(String sql) throws SQLException
该方法是执行指定的SQL语句。如果sql语句返回结果,此方法返回true,否则返回false。

int[] excuteBatch() throws SQLException 
该方法是将一批SQL命令提交给数据库执行,返回更新计数组成的数组。

ResultSet excuteQuery(String sql) throws SQLException 
该方法是执行查询类型(select)的SQL语句,此方法返回查询所获取的结果集ResultSet对象。

excuteUpdate int excuteUpdate(String sql) throws SQLException 
该方法执行SQL语句中DML类型(insert、update、delete)的SQL语句,返回更新所影响的行数。

Connection getConnection() throws SQLException 
该方法获取生成此Statement对象的Connection对象

boolean isClosed() throws SQLException 
该方法用来判断Statement对象是否已被关闭,如果Statement对象被关闭,则不能再调用此Statement对象执行SQL语句,此方法返回布尔值。

PreparedStatement接口

该接口继承并扩展了Statement接口,用来执行动态的SQL语句,也就是包含参数的SQL语句。
通过PrepareStatement实例执行的动态SQL语句会被动态编译到PrepareStatement实例中,从而可以反复地高效地执行该SQL语句。

void setBinaryStream(int parameterIndex,InputStream x) throws SQLException  
将输入流x作为SQL语句中的参数值,parameterIndex是参数位置索引。

void setBoolean(int parameterIndex,boolean x) throws SQLException 
将布尔值x作为SQL语句中的参数值,parameterIndex为参数位置索引。

void setByte(int parameterIndex,byte x) throws SQLException 
将byte值x作为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setDate(int parameterIndex,Date x) throws SQLException 
将java.sql.Date值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setDouble(int parameterIndex,double x) 
将double值x做为SQL语句中的参数值,parameterIndex为参数索引。

void setFloat(int parameterIndex,floatx) throws SQLException 
将float值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setInt(int parameterIndex,int x) throws SQLException 
将int值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setInt(int parameterIndex,long x) throws SQLException 
将long值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setObject(int parameterIndex,Object x) throws SQLException 
将object对象x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setShort(int parameterIndex,short x) throws SQLException 
将short值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

void setString(int parameterIndex,String x) throws SQLException 
将String值x做为SQL语句的参数值,parameterIndex为参数位置的索引。

void setTimestamp(int parameterIndex,Timestamp x) throws SQLException 
将java.sql.Timestamp值x做为SQL语句中的参数值,parameterIndex为参数位置的索引。

CallableStatement接口

该接口继承并扩展了PrepareStatement接口,用来执行SQL的存储过程

调用存储过程的时候使用的,和执行普通SQL语句差不多,只是语法不一样。

ResultSet接口

该接口类似于一个数据表,通过该接口的实例可以获得检索结果集以及对应数据表的相关信息,例如列名和类名等,

Result实例通过执行查询数据库的语句生成。

boolean absolute(int row) throws SQLException 
将光标移动到此ResultSet对象的给定行编号,参数row为行编号。

void afterLast() throws SQLException 
将光标移动到此ResultSet对象的最后一行之后,如果结果集中不包含任何行,则此方法无效。

void beforeFirst() throws SQLException 
立即释放此ResultSet对象的数据库和JDBC资源

void deleteRow() throws SQLException 
从此ResultSet对象和底层数据库中删除当前行。

boolean first() throws SQLException 
将光标移动到此ResultSet对象的第一行

InputStream getBinaryStream(String columnLabel) throws SQLException 
以byte流的方式获取ResultSet对象当前行中指定列的值,参数columnLabel为列名称。

Date getDate(String columnLabel) throws SQLException 
以java.sql.Date的方式获取ResultSet对象当前行中指定列的值,参数columnLabel为列名称。

double getDouble(String columnLabel) throws SQLException 
以double的方式获取ResultSet对象当前行中指定列的值,参数columnLabel为列名称。

float getFloat(String columnLabel) throws SQLException 
以float的方式获取ResultSet对象当前行中指定列的值,参数columnLabel为列名称

int getInt(String columnLabel) throws SQLException 
以int的方式获取ResultSet对象当前行中指定的列的值,参数columnLabel为列名称。

String getString(String columnLabel) throws SQLException 
以String的方式获取ResultSet对象当前行中指定列的值,参数columnLabel为列名称。

boolean isClosed() throws SQLException 
判断当前ResultSet对象是否已关闭。

boolean last() throws SQLException 
将光标移动到此ResultSet对象的最后一行。

boolean next() throws SQLException 
将光标位置向后移动一行,如移动的新行有效返回true,否则返回false。

boolean previous() throws SQLException 
将光标位置向前移动一行,如移动的新行有效返回true,否则返回false。

使用JDBC连接数据库

主要步骤:

1.加载并注册数据库驱动

DriverManager.registerDriver(Driver driver);

2.创建数据库连接

String url = “jdbc:odbc:student”;
Connection con = DriverManger.getConnection(url);

如果设置了数据库的登录名和密码,就需要这样:
String url = “jdbc:odbc:student”;
Connection con = DriverManger.getConnection(String url,String loginname,String password);

3.获取Statement对象

有三种方式:
1、创建基本的statement对象: createStatement()
2、创建PrepareStatement对象: prepareStatement()
3、创建CallStatement对象: preparecall()

例如:Statement stmt = conn.createStatement();

4.执行SQL语句

与数据库建立连接后,就可以向数据库发送SQL语句来执行,具体如下:

String query = ”select * form tablestu";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);

5.获得执行结果

比如,如果执行的是一个查询语句,执行结果就将返回一个ResultSet对象,该对象保存了Sql语句查询的结果,可以通过操作该对象来获取结果。

6.关闭连接

调用所有对象的close方法,关闭所有对象,释放资源

关于数据库的基本操作

数据库的增删改查以及其他操作

事务处理

事务是一组相互依赖的操作单元的集合,用来保证对事务的正确修改,保持数据的完整性,如果一个事务的某个单元操作失败,将取消本次事务的全部操作,例如,银行教育,股票交易和网上购物等都需要利用事务来控制数据的完整性。

数据库是共享资源,可供多个用户使用,多个用户并发地存储数据就可能产生多个事务,同时存取统一数据的情况,由此可能会产生三种错误:
1、脏读:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。

2、不可重复读:不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。

3、错误读:A事务读取B事务提交的新增数据,会引发幻读问题。

数据库事务必须具有(ACID)特性:
原子性:指整个数据库事务是不可分割的工作单位。只有使据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。

一致性:指数据库事务不能破坏关系数据的完成性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。

隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

在具体的事务中,可以用Connection中的3个方法完成基本的事务管理

1、setAutoCommit(boolean true/false):设置自动提交属性
2、rollback():回滚事务
3、commit():事务提交

可以使用保存点(Savepoint)来控制回滚的数量,所谓保存点,就是对事务的某些子任务设置符号标识,用来为回滚操作提供位置指示。

关于保存点的方法主要有3个:

1、setSavepoint("保存点名称“)  在某子任务前设置保存点
2、releaseSavepoint("保存点名称")     释放保存点
3、rollback("保存点名称")    指示事务回滚到指定的保存点
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐