JDBC

                           	**Java数据库编程**
       
          **1、概述**
JDBC(Java Database Connectivity)是Java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类库(位于java.sql和javax.sql包中)。利用JDBC,我们可以用Java编写程序,实现与特定的数据库连接,向数据库发送SQL语句,实现对数据库的特定操作,并对数据库返回的结果进行处理。
与其它数据库编程环境相比,JDBC为数据库开发提供了标准的API,所以用JDBC开发的数据库应用既可以跨操作系统平台,又可以跨数据库系统平台。也就是说,用JDBC开发的数据库应用,既可以在Windows平台下运行,又可以在Unix、Linux平台下运行;既可以使用MySQL、SQL Server,也可以使用Oracle 等其它数据库,而程序无须进行任何修改。
那么JDBC是如何实现这一切的呢?我们先来看图所示的JDBC工作过程。

在这里插入图片描述

Java在设计JDBC API时,实际上是通过接口定义了一套在Java下访问数据库的规范,这些接口留给数据库厂商来实现。不同的数据库厂商要让Java程序能够访问其数据库,必须实现这些接口,并将接口实现封装成一个.jar包文件形式的JDBC驱动程序。Java程序员需要在Java程序中访问这些数据库时,就从相应数据库厂商的网站上下载对应的JDBC驱动程序,并将它作为类库包含到classpath中。同时,JDBC API中又提供了一个JDBC驱动程序管理器类,用于加载JDBC驱动程序中的各个类,生成数据库连接。于是,Java程序员只需要调用JDBC API,就可以用统一的方式编写程序访问各个数据库。
我们前面讲到,JDBC其实是一系列API的集合,即JDBC是支持在Java程序中执行SQL语句的应用程序接口API,其中包括一系列的与访问数据库有关的接口和类,这些接口和类都是与连接、SQL语句和结果集有关。

在这里插入图片描述

在JDBC的基本操作中,最常用的类和接口包括DriverManager、Connection、Statement、PreparedStatement、CallableStatement和ResultSet。使用这几个类,就可以完成大部分的数据库操作工作。
DriverManager类用于管理JDBC驱动的服务类,程序中主要使用该类获得Connection对象。
Connection接口代表数据库连接,每个Connection对象代表一个与数据库的物理连接会话。要想访问数据库,就必须先获得数据库连接。
Statement接口代表SQL语句,Statement对象用于执行SQL语句,它可以用于执行DML、DDL和DCL语句。当执行SQL查询时,返回查询到的结果集。
PreparedStatement接口是Statement的子接口,代表预编译的SQL语句。使用PreparedStatement对象可以执行预编译的SQL语句,性能更好。
CallableStatement接口也是Statement的子接口,代表数据库中的存储过程。使用CallableStatement对象可以执行数据库中的存储过程。
ResultSet接口代表返回的结果集。ResultSet包含访问查询结果的方法,它可以通过列索引或者列名获得列数据。使用Result对象可以操作查询返回的结果集。
图阐述了这几个类和接口之间的关系。特别需要注意的是,驱动程序管理器DriverManager提供了连接Connection,但是它并不知道Statement或者ResultSet。Connection知道Statement,但是不知道ResultSet以及DriverManager。最后,ResultSet只知道它自己本身。这是一个非常干净的对象模型,相互关联很少,并且可以很好地在对象之间分配责任。

在这里插入图片描述

              **JDBC编程步骤**
JDBC编程一般包括如下六个步骤:
    步骤一:根据应用程序所用的数据库,选择JDBC驱动程序类型。
    步骤二:连接到数据库,得到Connection对象。
    步骤三:通过Connection创建Statement对象
    步骤四:使用Statement对象提交SQL语句
    步骤五:操作结果集
    步骤六:回收数据库资源
下面我们分别详细讲述每一个步骤。

          **选定JDBC驱动程序类型**
要连接到数据库并访问其内容,我们需要该数据库特定的JDBC驱动程序。JDBC驱动程序分为四种类型,这四种类型分别是:
    类型一(JDBC-ODBC桥加ODBC驱动程序):类型一是一种JDBC-ODBC桥加上ODBC驱动程序混合方式,通过ODBC驱动程序提供JDBC访问。在Java刚出现的时候,大多数数据库只支持ODBC访问,所以这也是当时唯一可用的驱动程序。由于ODBC驱动程序必须安装在每台客户端机器上,同时通过JDBC-ODBC桥调用ODBC访问数据库性能比较低下,所以现在这种类型的驱动除了用于测试外,不推荐使用。
    类型二(本地API和部分基于Java的驱动程序):这种类型的驱动程序将JDBC调用转换为客户端API上的Oracle、Sybase、Informix或其他DBMS的调用。与类型一一样,这种类型的驱动程序需要每个客户端上都装载一些二进制代码。使用这个驱动程序,可以让本地代码与数据库的沟通快过Java,但是加载困难,不便于移植,所以也不提倡使用。
    类型三(为数据库中间件实现的纯Java驱动程序):这种驱动程序将JDBC调用转换为与中间件厂商的网络协议,然后又通过中间件服务器转换为DBMS协议。中间件提供对不同的数据库的连接。这种驱动一般用在分布式系统的开发中。
    类型四(本地协议纯Java驱动程序):这类驱动程序将JDBC调用直接转换为DBMS所使用的网络协议,来自客户端机器上的请求可直接调用DBMS服务器。驱动程序是由纯Java所写成,不需要转换或者通过其他中介软件就可以与数据与数据库沟通,因此性能是最好的。

在这里插入图片描述

既然Java中提供了四种JDBC驱动程序类型,那么,在实际开发中到底选用哪种类型的驱动程序呢?
如果我们编写的程序只访问一种类型的数据库,那么最好选择类型4。如果程序需要同时访问多个类型的数据库,那么最好选择类型3。如果类型3和4都不适用于所用的数据库,才选择类型2。类型1通常不会考虑为部署级的驱动程序,一般只在开发或者测试中才会使用。
选定了JDBC驱动程序类型后,我们就可以下载使用数据库厂商提供的JDBC驱动程序,并将其包含到classpath中。然后调用JDBC API,来访问数据库了。

           **连接到数据库**
要访问数据库,首先必须连接到数据库,也就是连接到数据库所代表的数据源。在JDBC中,有两种方法可以设置一个到数据库的连接,分别是:
使用java.sql.DriverManager类的静态方法getConnection(),该方法带一个URL代表数据源的名称。
使用JNDI(Java Naming and Directory Interface,Java命名服务)查找数据源的名称,JNDI返回一个javax.sql.DataSource对象,然后使用DataSource类的getConnection()方法。
DataSource类和DriverManager类都可以获得数据库连接,那么二者之间有什么区别呢?在实际应用开发中,建立与数据库的连接是一件很耗资源的工作,频繁的数据库连接建立操作会产生较大的系统开销。为了解决这个问题,就出现了数据库连接池技术。数据库连接池技术将已经创建的数据库连接放在一个连接缓冲池中,当我们创建数据库连接时候,如果连接池中已经存在对该数据库的连接,就直接从池中取出,不用再重新建立,从而提升了效率。DataSource类是从数据库连接池中获取连接,而DriverManager类是直接建立与数据库的连接。所以,在大型多层应用开发中,一般都是首选使用DataSource类来连接数据库。但是,DataSource类通常需要使用第三方应用程序,例如应用服务器和命名服务器。如果我们只是编写一个独立的应用,特别是本书所写的所有示例程序,那么最好使用DriverManager。此外,不管我们使用哪种技术,在取得数据库连接后,访问数据的代码都是相同的。所以,这里我们只讲解DriverManager类取得数据库连接的方法。至于DataSource类获取数据库连接的方法,我们将在JavaEE课程中学习。
DriverManager 类是 JDBC 的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。DriverManager 类包含一列 Driver 类,它们通过调用 DriverManager类的registerDriver() 对自己进行了注册。它创建驱动类的实例,然后在加载该实例时对DriverManager 类进行注册。因此,程序在使用常用的数据库时,不需要直接去调用 DriverManager的registerDriver方法,只需要通过调用Class类的静态方法forName()显式地加载驱动程序类就行了。例如:
Class.forName(驱动程序类);
我们知道,Class.forName()是一个静态方法,用于指示Java虚拟机动态地查找、加载和链接指定类(如果尚未加载)。如果加载驱动程序时,无法找到这个驱动程序类,则抛出ClassNotFoundException异常。通常的解决办法是要使用的数据库的驱动程序包加入到classpath下。
在驱动程序加载后,我们就可以用DriverManager的如下静态方法之一来建立数据库的连接:
public static Connection getConnection(String url):设立一个到指定数据库的连接。如果装载了多个JDBC驱动程序,DriverManager会选择恰当的驱动程序。
public static Connection getConnection(String url, String user, String password):与上个方法类似。如果数据库需要身份验证,就要传递用户名和密码。
public static Connection getConnection(String url, Properties info):Properties对象包含了要连接的信息,包括URL、用户名和密码等。
这些方法的返回值都是一个java.sql.Connection对象,Connection代表数据库连接对象,每个Connection代表一个与数据库的物理连接会话。要想访问数据库,就必须先获得数据库连接。
JDBC连接由数据库URL标识,它告诉驱动程序管理器使用哪个驱动程序和数据源。数据库URL的语法如下:
<主协议>:<子协议>:<数据源名>
其中, 主协议是指主通讯协议,一般都是jdbc。子协议是指次要通讯协议,即驱动程序的名称。数据源名通常是指映射到物理数据库的逻辑名称或别名。
列出了常用的几种数据库的URL格式。

在这里插入图片描述

          **通过Connection创建Statement对象**
在使用DriverManager或者DataSource类连接到数据库后,我们就得到一个Connection对象。Connection类包含了创建SQL语句的方法。java.sql.Statement接口代表一条SQL语句。在JDBC中有三种类型的Statement对象:
java.sql.Statement:代表一个没有参数的简单SQL语句。
java.sql.PreparedStatement:PreparedStatement是Statement接口的子接口,一个PreparedStatement对象代表一个预编译的SQL语句。该SQL语句带有参数,参数需要在SQL语句执行前进行设置。
java.sql.CallableStatement:CallableStatement是PreparedStatement接口的子接口。CallableStatement对象用于调用数据库中的存储过程。
Connection有三个方法分别用于创建这三类Statement:
Statement createStatement():创建基本的Statement对象。
PreparedStatement prepareStatement(String sql):根据传入的SQL语句创建PreparedStatement对象。
CallableStatement prepareCall(String sql):根据传入的SQL语句创建CallableStatement对象。
Statement常用于执行一个肯定只发生一次,并且没有参数的SQL语句。如果我们有SQL语句要执行很多次,不管这个语句是否带有参数,都应该使用PreparedStatement。预编译的SQL语句执行起来效率更高,因为语句被数据库预编译了。此外,预编译语句中的参数允许我们多次用不同的参数值重用一条通用的SQL语句。如果我们需要调用数据库中存储过程,就需要用CallableStatement。存储过程代表多条SQL语句,调用存储过程与调用方法类似。并不是所有的数据库都支持存储过程,但是企业级的数据库一般都会支持存储过程,并且大规模数据库应用程序中存储过程的使用比较广泛。

         **使用JDBC执行SQL语句**
   使用Statement执行SQL语句
java.sql.Statement接口代表一条简单的SQL语句。Statement对象常用于执行一个肯定只发生一次,并且没有参数的SQL语句。Connection接口包含了三个方法用于创建Statement对象:
Statement createStatement():创建一个默认的Statement 对象,该Statement对象的结果集将是只读的并且只能向前滚动的。
Statement createStatement(int resultSetType, int concurrency):创建一个给定结果集类型和并发类型的Statement对象。
Statement createStatement(int resultSetType, int concurrency, int holdability):创建一个给定结果集类型、并发类型和可保存性类型的Statement对象。
这里,参数resultSetType代表结果集的类型,该参数可以是如下三个取值之一:
ResultSet.TYPE_FORWARD_ONLY:该常量控制记录指针只能向前移动。
ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针可以自由移动,但是底层数据库中数据的改变不会影响结果集中的内容。
ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针可以自由移动,但是底层数据库中数据的改变要影响结果集中的内容。
concurrency控制结果集的并发类型,该参数可以是如下两个取值之一:
ResultSet.CONCUR_READ_ONLY:该常量指示结果集是只读的(默认)。
ResultSet.CONCUR_UPDATABLE:该常量指示结果集是可更新的。
holdability用于控制提交事务时结果集的关闭策略,该参数可以是如下两个取值之一:
ResultSet.HOLD_CURSORS_OVER_COMMIT:该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将保持开放。
ResultSet.CLOSE_CURSORS_AT_COMMIT:该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将被关闭。
这里我们只讲解第一个方法,而后面两种方法我们将在讲解结果集时详细讨论。
例如,如下的代码使用默认的结果集属性,创建了一个Statement对象:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConnection(url,"root","");
Statement smt = conn.createStatement();
Statement对象代表任何SQL语句,同时Statement接口提供了定义和执行SQL语句的一些方法,包括:
	ResultSet executeQuery(String sql):执行一个返回单个结果集的SQL语句,只能该方法执行SELECT语句。
	int executeUpdate(String sql):使用该方法执行不返回结果集的DDL和DML(Update、Insert、Delete)语句。如果执行的是DML,则返回值为执行SQL语句影响的行数。如果是执行DDL语句,则返回值为0。
	boolean execute(String sql):该方法可以执行任何SQL语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或者没有任何结果,则返回false。只有在不清楚SQL语句的类型时,才推荐使用execute()方法。如果该语句产生了结果集,则通过getResultSet()方法获得该结果集。
例如,如下的代码执行了一条Insert语句
smt.executeUpdate("insert into Employee values(1,"xiaojichao",40);

smt.executeUpdate("insert into Employee values(1,"xiaojichao",40);
此外,我们还可以使用Statement对象提供的如下方法,创建一批SQL语句,然后一次执行所有语句:
	public void addBatch(String sql):用于将指定SQL语句添加到当前批中。
	public int[] executeBatch():执行批中所有SQL语句。返回值数组与批中的语句相关,通常代表每个批语句执行成功后影响的行数。
如果不使用批,对于多条SQL语句,就要一次发送一条SQL语句到数据库,等待数据库执行完毕,返回结果后,再执行下一条SQL语句。而使用批,一次就把所有SQL语句发送到数据库系统执行。很显然,使用批的执行效率要高。

    使用PreparedStatement执行SQL语句
Statement常用于执行一个肯定只发生一次,并且没有参数的SQL语句。如果我们有SQL语句要执行很多次,不管这个语句是否带有参数,都应该使用PreparedStatement。预编译的SQL语句执行起来效率更高,因为语句被数据库预编译了。PreparedStatement接口用于代表一条预编译的语句。
那么,什么是预编译语句呢?所谓预编译语句,就是一个包含参数的SQL语句。假如我们经常需要反复执行一条结构相同的SQL语句,例如:

Insert into Employee values(1,“xiaojichao”,40);
Insert into Employee values(2,“yinzhaohui”,37);
Insert into Employee values(3,“huyike”,30);

对于以上三条语句而言,它们的结构基本相似,只是执行时插入的值不同而已。在这种情况下,我们可以使用下面带占位符(?)参数的SQL语句来代替它:

Insert into Employee values(?, ?, ?);

这条语句就是一条预编译的SQL语句,它带有三个参数。预编译语句中每一个问号代表一个参数。参数出现的顺序决定了它们的索引,第一个参数是索引1,第二个参数是索引2,如此类推。
Connection接口中包含了如下六个方法用于创建PreparedStatement对象:
	prepareStatement(String sql):使用给定SQL语句,创建一个默认的PreparedStatement对象。
	prepareStatement(String sql, int resultSetType, int concurrency, int holdability):使用给定SQL语句、结果集类型、并发类型和可保存性类型,创建一个PreparedStatement对象。
	prepareStatement(String sql, int resultSetType, int concurrency) :使用给定SQL语句、结果集类型和并发类型,创建一个PreparedStatement对象。
	prepareStatement(String sql, int pk):创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。参数pk指示是否应该返回自动生成的键的标志,它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一 。
	prepareStatement(String sql, String [ ] keys):创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。keys字符串数组代表组成主键的列名。
	prepareStatement(String sql, int [ ] keys):与上一个方法类似,除了列数组是用列索引代替列名来描述。
注意,最后三个prepareStatement()方法包含了自动产生主键的信息,它只适用于Insert方法。
然而,Statement执行SQL语句时,不允许使用问号占位符参数,而且这个问号占位符参数必须获得值后才可以执行。PreparedStatement带有两个方法用于设置参数值:
	void setXxx(int parameterindex, Xxx value):如果知道参数的类型,则通过该方法设置参数的值。
	void setObject(int parameterindex, Object o):如果不知道参数的类型,则通过该方法设置参数值,由PreparedStatement来负责类型转换
在所有的参数值设置完成后,我们就可以使用PreparedStatement接口提供的方法执行预定义的SQL语句了。PreparedStatement同样有execute()、executeQuery()、executeUpdate()方法,但是这三个方法都没有带SQL字符串为参数。这是因为在创建PreparedStatement的时候就已经传入了SQL字符串。
参数值设定完成后,就可以使用PreparedStatement执行SQL语句。PreparedStatement也有execute()、executeUpdate()和executeQuery()方法,但是这三个方法都是没有参数的,因为PreparedStatement已经存储了预编译过的SQL语句。到底选用哪一个方法,需要根据预编译的SQL语句的类型来决定,这与Statement是一样的。

         使用CallableStatement调用存储过程
常用的关系型数据库管理系统,包括Oracle、MySQL、SQL Server等,都可以编写、执行存储过程,从而为关系型数据库提供了模块化编程的功能。编写存储过程类似于编写C语言的函数或者Java类方法,在存储过程中可以以过程化方式执行多条SQL语句,完成某项对数据进行操作的具体功能。
CallableStatement接口是PreparedStatement接口的子接口,代表存储过程。我们可以使用Connection的如下几个方法创建的CallableStatement对象来调用存储过程:
	CallableStatement prepareCall(String sql):使用给定SQL语句,创建CallableStatement。
	CallableStatement prepareCall(String sql, int resultSetType, int concurrency):使用给定的SQL语句、结果集类型和并发类型创建CallableStatement。
	CallableStatement prepareCall(String sql, int resultSetType, int concurrency, int holdability):使用给定的SQL语句、结果集类型、并发类型和保存类型创建CallableStatement。
创建CallableStatement对象时,需要传入调用存储过程的SQL语句。调用存储过程的SQL语句总是"{call 存储过程名(?,?,?...)}"这种格式,其中的问号作为存储过程参数的占位符。

          **管理结果集**
如果使用JDBC执行的SQL语句是一个SELECT查询,那么执行结果将返回一个ResultSet结果集对象。JDBC使用ResultSet来封装执行查询得到的查询结果,然后通过移动ResultSet的记录指针来取出结果集中的内容。此外,JDBC还允许使用ResultSet来更新记录,并提供了ResultMetaData来获取ResultSet对象的相关信息。
ResultSet接口中的方法可以分为三类:
	用于移动记录指针的导航方法,包括next()、first()、last()、previous()、beforeFirst()、afterLast()等。
	用于查看记录指针所在行的某一些列的值的getXxx()方法。这些get方法检索数据,并将数据转换为Java原始数据类型。每种数据类型都具有独立的getXXX方法,例如,getInt()用于检索整型值,getString()用于检索字符串值。getXXX方法既可以用列索引做参数,也可以用列名做参数。
	用于更新当前行列数据的update方法。

      在结果集中导航
在上一节我们知道,在使用Connection的createStatement()方法、prepareStatement ()和prepareCall()方法分别创建Statement、PreparedStatement和CallableStatement时,可以在方法中设置结果集类型。如果结果集类型是只能向前滚动的,那么我们只能遍历该结果集一次,并且记录指针只能向前移动。如果结果集是可滚动的,那么记录指针既可以向前移动,又可以向后移动。如果结果集被标注为是不敏感的,那么结果集就是在它被创建时数据库中相关数据的快照,数据库后来发生的修改不会影响到该结果集。如果结果集被标注为敏感的,那么数据库中发生的改变也会出现在结果集中。
ResultSet接口提供了如下方法用于移动记录指针:
	boolean absolute(int row):将记录指针移动到此 ResultSet 对象的给定行编号。
	boolean relative(int row):将记录指针从从当前指向的位置向前或者向后移动指定行数。
	void beforeFirst():将记录指针移动到此 ResultSet 对象的开头,正好位于第一行之前,这是ResultSet结果集记录指针的初始位置。
	void afterLast():将记录指针移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
	boolean first():将记录指针移动到此 ResultSet 对象的第一行。如果移动后的记录指针指向一条有效的记录,则返回true,否则返回false。
	boolean last():将记录指针移动到此 ResultSet 对象的最后一行。如果移动后的记录指针指向一条有效的记录,则返回true,否则返回false。
	boolean previous():将记录指针移动到此 ResultSet 对象的上一行。如果移动后的记录指针指向一条有效的记录,则返回true,否则返回false。
	boolean next():将记录指针从当前位置向前移一行。如果移动后的记录指针指向一条有效的记录,则返回true,否则返回false。
	int getRow():返回记录指针当前指向第几行。
	void moveToInsertRow():将记录指针移到结果集中一个特殊的行,该行可以用于向数据库中插入新行。记录指针的当前位置会被记住。
	void moveToCurrentRow():如果记录指针在一个插入行上,就移动记录指针回到被记住的当前行。

          查看结果集中数据
ResultSet接口提供了很多方法用于获取当前行的数据。它为结果集行中的每种数据类型都提供了getXxx()方法,并且每个getXxx()方法都有两个版本:一个用列名作参数,一个用列索引作参数。例如,如果需要查看的列是int数据类型,我们就可以使用ResultSet的如下getInt()方法之一获取列包含的数据:
	int getInt(String columnName):返回当前行中指定列名的值。
	int getInt(int columnIndex):返回当前行中指定列索引的值。
ResultSet接口为Java的八种基本数据类型中的每一个都提供了get方法,同时也为常用类型java.lang.String、java.lang.Object和java.net.URL提供了get方法。此外,ResultSet接口还为获取SQL数据类型java.sql.Date、java.sql.Time、java.SQL.TimeStamp、java.sql.Clob(字符大对象)、java.sql.Blob(二进制大对象)等提供了方法。
Java语言的数据类型与数据库表的列类型并不完全相同,而且不同的关系型数据库管理系统也可能支持不同的列类型。为了在Java程序中正确访问数据库表的内容,程序员必须在Java语言的数据类型与数据库表的列类型之间进行映射。这需要分两个步骤完成,首先Java程序在Java语言的数据类型与JDBC支持的SQL数据类型之间进行映射,然后JDBC的数据库驱动程序进一步负责SQL数据类型与实际的数据库表的列类型之间进行映射。
在使用 Statement类型的对象发送和执行SQL语句时,必须先使用该接口提供的方法setXxx()设置参数的值,这时程序员需要根据数据表的字段类型选择合适的setXxx()方法。在使用类型为ResultSet的查询结果集时,程序员需要使用该接口提供的getXxx()方法获取数据记录的某个字段的值,这时程序员也需要根据数据字段类型选择合适的getXxx()方法,并使用合适的Java语言的数据类型变量存放得到的字段值。

在这里插入图片描述

      更新结果集
ResultSet接口中了提供了更新结果集中的数据的一些updateXxx()方法。与get方法一样,对于每个数据类型,也有两种updateXxx()方法:一个用列名做参数,一个用索引名做参数。例如,要更新一个结果集中当前行的某个String类型列,我们可以使用如下两个updateString()方法之一:
	void updateString(String columnName, String s):将指定列的值修改为s,通过列名来指定列。
	void updateString(int columnIndex, String s):将指定列的值修改为s,通过列索引来指定列。
ResultSet接口为Java的八种基本数据类型中的每一个都提供了update方法,同时也为常用类型java.lang.String、java.lang.Object和java.net.URL以及java.sql包中的SQL数据类型提供了update方法。
修改结果集中的某一行将会改变ResultSet对象中当前行的列,但是不会修改到下层数据库。要将我们所做的修改更新到数据库中的行,我们需要调用如下的方法:
public void updateRow():通过修改数据库中对应的行来修改当前行
updateRow()方法将对结果集中当前行所在的任何修改更新到数据库中。在ResultSet接口中还有其它方法处理当前结果集行和相关数据库行:
	public void deleteRow():从数据库中删除当前行。
	void updateRow():通过修改数据库中对应的行来修改当前行。
	public void refreshRow():刷新结果集中的数据,以反映数据库中最近的改变。
	public void cancelRowUpdates():取消在当前行上所在的任何修改。
	public void insertRow():向数据库中插入一行。该方法只有在记录指针指向插入行时才可以被调用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值