关于mysq的JDBC的学习内容

来源:互联网 发布:淘宝店铺虚拟转实物 编辑:程序博客网 时间:2024/05/22 13:31

应用架构  

       单点(Single),适合小规模应用

  复制(Replication),适合中小规模应用

      集群(Cluster),适合大规模应用

 

索引类别

  1.普通索引

  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

  2.唯一索引

  普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。

  如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

  3.主索引

  在前面已经反复多次强调过:必须为主键字段创建一个索引,这个索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE。

  4.外键索引

  如果为某个外键字段定义了一个外键约束条件,MySQL就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件。

  5.复合索引

  索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。如果查询操作只需要用到columnA数据列上的一个索引,就可以使用复合索引INDEX(columnA,columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX(A,B,C)可以当做A或(A,B)的索引来使用,但不能当做B、C或(B,C)的索引来使用。

索引长度

  在为CHAR和VARCHAR类型的数据列定义索引时,可以把索引的长度限制为一个给定的字符个数(这个数字必须小于这个字段所允许的最大字符个数)。这么做的好处是可以生成一个尺寸比较小、检索速度却比较快的索引文件。在绝大多数应用里,数据库中的字符串数据大都以各种各样的名字为主,把索引的长度设置为10~15个字符已经足以把搜索范围缩小到很少的几条数据记录了。在为BLOB和TEXT类型的数据列创建索引时,必须对索引的长度做出限制;MySQL所允许的最大索引全文索引文本字段上的普通索引只能加快对出现在字段内容最前面的字符串(也就是字段内容开头的字符)进行检索操作。如果字段里存放的是由几个、甚至是多个单词构成的较大段文字,普通索引就没什么作用了。这种检索往往以的形式出现,这对MySQL来说很复杂,如果需要处理的数据量很大,响应时间就会很长。

  这类场合正是全文索引(full-textindex)可以大显身手的地方。在生成这种类型的索引时,MySQL将把在文本中出现的所有单词创建为一份清单,查询操作将根据这份清单去检索有关的数据记录。全文索引即可以随数据表一同创建,也可以等日后有必要时再使用下面这条命令添加:

  ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。下面是这类查询命令的基本语法:

  SELECT*FROMtablename

  WHEREMATCH(column1,column2)AGAINST(‘word1','word2','word3’)

  上面这条命令将把column1和column2字段里有word1、word2和word3的数据记录全部查询出来。

 

基本命令  [ ]中的内容为可选项

  --创建数据库

  mysql> create database 数据库名称

  --创建表

  mysql> create table 表名 (

  列的名字(id)类型(int(4))primary key(定义主键) auto_increment(描述 自增),

  ……,

  );

  --查看所有数据库

  mysql> show databases ;

  --使用某个数据库

  mysql> use 数据库名称;

  --查看所使用数据库下所有的表

  mysql> show tables;

  --显示表的属性结构

  mysql> desc 表名;

  --选择表中数据的显示

  --* 代表选择所有列 ,

  mysql> select * from 表名 where id=?[and name=?] [or name=?];

  mysql> select id,name from 表名order by 某一列的名称 desc(降序,asc为升序)

  --删除表中的数据

  mysql> delete from table where id=?[or name=? (and name=?)];

  --删除表

  mysql> drop table;

  --删除数据库

  mysql> drop database;

 

一个自己写的完整的数据库初级连接程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import java.sql.*;

 

public class testmysqlconnection {

 

        /**

         * @param args

         */

        public static void main(String[] args) {

               Connection conn = null;

               Statement stmt = null;

               ResultSet rs = null;

               try {

 

                       Class.forName("com.mysql.jdbc.Driver");// 添加驱动

 

                       conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?"

                                      + "user=root&password=****");// 添加数据连接字符串

                       stmt = conn.createStatement();

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

                       while (rs.next()) {

                               System.out.println(rs.getString("id"));

                               System.out.println(rs.getString("name"));

                               System.out.println(rs.getString("xingbie"));

 

                       }

               }

//异常处理

               catch (ClassNotFoundException e) {

                       e.printStackTrace();

               } catch (SQLException ex) {

                       // handle any errors

                       System.out.println("SQLException: " + ex.getMessage());

                       System.out.println("SQLState: " + ex.getSQLState());

                       System.out.println("VendorError: " + ex.getErrorCode());

                       ex.printStackTrace();

               } finally {

                       try {

                               if (rs != null) {

                                      rs.close();

                                      rs = null;

                               }

                               if (stmt != null) {

                                      stmt.close();

                                      stmt = null;

                               }

                               if (conn != null) {

                                      conn.close();

                                      conn = null;

                               }

                       } catch (SQLException e) {

                               e.printStackTrace();

 

                       }

               }

 

        }

}


 

 

良好的书写习惯是程序员必备的素质。

 

 

 

 

程序中几个关键性词汇的解释:

Connection 

Connection  对象代表打开的、与数据源的连接

 

Connection 对象代表与数据源进行的唯一会话。如果是客户端/服务器数据库系统,该对象可以等价于到服务器的实际网络连接。取决于提供者所支持的功能,Connection 对象的某些集合、方法或属性有可能无效。

  使用 Connection 对象的集合、方法、和属性可执行下列操作:

  在打开连接前使用 ConnectionString、ConnectionTimeout 和 Mode 属性对连接进行配置。

  设置 CursorLocation 属性以便调用支持批更新的“客户端游标提供者”。

  使用 DefaultDatabase 属性设置连接的默认数据库。

  使用 IsolationLevel 属性为在连接上打开的事务设置隔离级别。

  使用 Provider 属性指定 OLE DB 提供者。

  使用 Open 方法建立到数据源的物理连接。使用 Close 方法将其断开。

  使用 Execute 方法执行对连接的命令,并使用 CommandTimeout 属性对执行进行配置。

  可使用 BeginTrans、CommitTrans 和 RollbackTrans 方法以及 Attributes 属性管理打开的连接上的事务(如果提供者支持则包括嵌套的事务)。

  使用 Errors 集合检查数据源返回的错误。

  通过 Version 属性读取使用中的 ADO 执行版本。

  使用 OpenSchema 方法获取数据库模式信息。

  注意 如果不使用 Command 对象执行查询,请向 Connection 对象的 Execute 方法传送查询字符串。但是,当需要使命令文本具有持久性并重新执行,或使用查询参数的时候,则必须使用 Command 对象。

  可以创建独立于先前定义的其他任何对象的 Connection 对象。

  注意 可以象执行 Connection 对象的本地方法一样执行命令或存储过程。

  如果要执行命令,可以使用 Command 对象的 Name 属性给命令指定一个名称。将 Command 对象的 ActiveConnection 属性设置为该连接。然后,象发出 Connection 对象的方法一样发出使用命令名称的语句,后面可带任何参数(如果有返回行,则后面带 Recordset 对象)。设置 Recordset 属性以便自定义所产生的记录集。例如:

  Dim cnn As New ADODB.Connection

  Dim cmd As New ADODB.Command

  Dim rst As New ADODB.Recordset

  ...

  cnn.Open "..."

  cmd.Name= "yourCommandName"

  cmd.ActiveConnection = cnn

  ...

  '命令名称、任意参数、以及可选记录集。

  cnn.yourCommandName "parameter", rst

  要执行存储过程,可以如同发出 Connection 对象的方法一样发出使用存储过程名称的语句,后面可带任何参数。ADO 将对参数类型进行“最佳判断”。例如:

  Dim cnn As New ADODB.Connection

  ...

  '存储过程名称及任意参数。

  cnn.sp_yourStoredProcedureName "parameter"

 




说明

Connection 对象代表与数据源进行的唯一会话。如果是客户端/服务器数据库系统,该对象可以等价于到服务器的实际网络连接。取决于提供者所支持的功能,Connection 对象的某些集合、方法或属性有可能无效。

使用 Connection 对象的集合、方法、和属性可执行下列操作:

  • 在打开连接前使用 ConnectionStringConnectionTimeoutMode 属性对连接进行配置。
  • 设置 CursorLocation 属性以便调用支持批更新的“客户端游标提供者”。
  • 使用 DefaultDatabase 属性设置连接的默认数据库。
  • 使用 IsolationLevel 属性为在连接上打开的事务设置隔离级别。
  • 使用 Provider 属性指定 OLE DB 提供者。
  • 使用 Open 方法建立到数据源的物理连接。使用 Close 方法将其断开。
  • 使用 Execute 方法执行对连接的命令,并使用 CommandTimeout 属性对执行进行配置。
  • 可使用 BeginTransCommitTransRollbackTrans 方法以及Attributes 属性管理打开的连接上的事务(如果提供者支持则包括嵌套的事务)。
  • 使用 Errors 集合检查数据源返回的错误。
  • 通过 Version 属性读取使用中的 ADO 执行版本。
  • 使用 OpenSchema 方法获取数据库模式信息。

注意   如果不使用 Command 对象执行查询,请向Connection 对象的Execute 方法传送查询字符串。但是,当需要使命令文本具有持久性并重新执行,或使用查询参数的时候,则必须使用Command 对象。

可以创建独立于先前定义的其他任何对象的 Connection 对象。

注意   可以象执行 Connection 对象的本地方法一样执行命令或存储过程。

如果要执行命令,可以使用 Command 对象的 Name 属性给命令指定一个名称。将Command 对象的ActiveConnection 属性设置为该连接。然后,象发出Connection 对象的方法一样发出使用命令名称的语句,后面可带任何参数(如果有返回行,则后面带Recordset 对象)。设置Recordset 属性以便自定义所产生的记录集。例如:

Dim cnn As New ADODB.Connection

Dim cmd As New ADODB.Command

Dim rst As New ADODB.Recordset

...

cnn.Open "..."

cmd.Name = "yourCommandName"

cmd.ActiveConnection = cnn

...

'命令名称、任意参数、以及可选记录集。

cnn.yourCommandName "parameter", rst

要执行存储过程,可以如同发出 Connection 对象的方法一样发出使用存储过程名称的语句,后面可带任何参数。ADO 将对参数类型进行“最佳判断”。例如:

Dim cnn As New ADODB.Connection

...

'存储过程名称及任意参数。

cnn.sp_yourStoredProcedureName "parameter"

Connection 对象的常用属性 <表>

  

属 性

描 述

CommandTimeout

这义了使用 Execute 方法运行一条 SQL 命令的最长时限,能够中断并产生错误。默认值为30秒,设定为0表示没有限制。

ConnectionString

设定连接数据源的信息,包括 FlieName、Password、Userld、DataSource、Provider 等参数。

ConnectionTimeout

设置在终止尝试和产生错误前建立数据库连接期间所等待的时间,该属性设置或返回指示等待连接打开的时间的长整型值(单位为秒),默认值为15。如果将该属性设置为0,ADO 将无限等待直到连接打开。

DefaultDatabase

定义连接默认数据库。

Mode

建立连接之前,设定连接的读写方式,决定是否可更改目前数据。0 一 不设定(默认)、1 一 只读、2 一 只写、3 一 读写。

Provider

设置连接的数据提供者(数据库管理程序),默认值是 MSDASQL (Microsot-ODBC For OLEDB)

State

读取当前链接对象的状态,取0表示关闭,1表示打开。

 

 

 

 

 

statement

Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。   Statement对象,用于执行不带参数的简单SQL语句。

 

接口定义
  ---Wrapper接口是一系列方法的声明,是一些方法的特征的集合
所有已知子接口


  CallableStatement, PreparedStatement
  用于执行静态 SQL 语句并返回它所生成结果的对象。   

在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因  创建SQL statement在执行sql中的流程
此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。   

Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存在的存储过程的调用。   Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法;而 CallableStatement 添加了处理 OUT 参数的方法。   有些 DBMS 将已存储过程中的每条语句视为独立的语句;而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,因为它影响什么时候调用 commit 方法。在前一种情况中,每条语句单独提交;在后一种情况中,所有语句同时提交。
  static int CLOSE_ALL_RESULTS   该常量指示调用 getMoreResults 时应该关闭以前一直打开的所有 ResultSet 对象。   static int CLOSE_CURRENT_RESULT   该常量指示调用 getMoreResults 时应该关闭当前 ResultSet 对象。   static int EXECUTE_FAILED   该常量指示在执行批量语句时发生错误。   static int KEEP_CURRENT_RESULT   该常量指示调用 getMoreResults 时不会关闭当前 ResultSet 对象。   static int NO_GENERATED_KEYS   该常量指示生成的键应该不可用于获取。   static int RETURN_GENERATED_KEYS   该常量指示生成的键应该可用于获取。   static int SUCCESS_NO_INFO   该常量指示批量语句执行成功但不存在受影响的可用行数计数。
编辑本段方法摘要
  void addBatch(String sql)   将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。   void cancel()   如果 DBMS 和驱动程序都支持中止 SQL 语句,则取消此 Statement 对象。   void clearBatch()   清空此 Statement 对象的当前 SQL 命令列表。   void clearWarnings()   清除在此 Statement 对象上报告的所有警告。   void close()   立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。   boolean execute(String sql)   执行给定的 SQL 语句,该语句可能返回多个结果。   boolean execute(String sql, int autoGeneratedKeys)   执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取。   boolean execute(String sql, int[] columnIndexes)   执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。   boolean execute(String sql, String[] columnNames)   执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。   int[] executeBatch()   将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。   ResultSet executeQuery(String sql)   执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。   int executeUpdate(String sql)   执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。   int executeUpdate(String sql, int autoGeneratedKeys)   执行给定的 SQL 语句,并用给定标志通知驱动程序由此 Statement 生成的自动生成键是否可用于获取。   int executeUpdate(String sql, int[] columnIndexes)   执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。   int executeUpdate(String sql, String[] columnNames)   执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。   Connection getConnection()   获取生成此 Statement 对象的 Connection 对象。   int getFetchDirection()   获取从数据库表获取行的方向,该方向是根据此 Statement 对象生成的结果集合的默认值。      int getFetchSize()   获取结果集合的行数,该数是根据此 Statement 对象生成的 ResultSet 对象的默认获取大小。   ResultSet getGeneratedKeys()   获取由于执行此 Statement 对象而创建的所有自动生成的键。   int getMaxFieldSize()   获取可以为此 Statement 对象所生成 ResultSet 对象中的字符和二进制列值返回的最大字节数。   int getMaxRows()   获取由此 Statement 对象生成的 ResultSet 对象可以包含的最大行数。   boolean getMoreResults()   移动到此 Statement 对象的下一个结果,如果其为 ResultSet 对象,则返回 true,并隐式关闭利用方法 getResultSet 获取的所有当前 ResultSet 对象。   boolean getMoreResults(int current)   将此 Statement 对象移动到下一个结果,根据给定标志指定的指令处理所有当前 ResultSet 对象;如果下一个结果为 ResultSet 对象,则返回 true。   int getQueryTimeout()   获取驱动程序等待 Statement 对象执行的秒数。   ResultSet getResultSet()   以 ResultSet 对象的形式获取当前结果。   int getResultSetConcurrency()   获取此 Statement 对象生成的 ResultSet 对象的结果集合并发性。   int getResultSetHoldability()   获取此 Statement 对象生成的 ResultSet 对象的结果集合可保存性。   int getResultSetType()   获取此 Statement 对象生成的 ResultSet 对象的结果集合类型。      int getUpdateCount()   以更新计数的形式获取当前结果;如果结果为 ResultSet 对象或没有更多结果,则返回 -1。   SQLWarning getWarnings()   获取此 Statement 对象上的调用报告的第一个警告。   boolean isClosed()   获取是否已关闭了此 Statement 对象。   boolean isPoolable()   返回指示 Statement 是否是可池化的值。   void setCursorName(String name)   将 SQL 指针名称设置为给定的 String,后续 Statement 对象的 execute 方法将使用此字符串。   void setEscapeProcessing(boolean enable)   将转义处理设置为开或关。      void setFetchDirection(int direction)   向驱动程序提供关于方向的提示,在使用此 Statement 对象创建的 ResultSet 对象中将按该方向处理行。   void setFetchSize(int rows)   为 JDBC 驱动程序提供一个提示,它提示此 Statement 生成的 ResultSet 对象需要更多行时应该从数据库获取的行数。   void setMaxFieldSize(int max)   设置此 Statement 对象生成的 ResultSet 对象中字符和二进制列值可以返回的最大字节数限制。   void setMaxRows(int max)   将此 Statement 对象生成的所有 ResultSet 对象可以包含的最大行数限制设置为给定数。   void setPoolable(boolean poolable)   请求将 Statement 池化或非池化。   void setQueryTimeout(int seconds)   将驱动程序等待 Statement 对象执行的秒数设置为给定秒数。
编辑本段Statement 使用案例
  1、创建 Statement 对象   建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段中所示:   Connection con = DriverManager.getConnection(url, "sunny", "");   Statement stmt = con.createStatement();   为了执行 Statement 对象,被发送到数据库的 SQL 语句将被作为参数提供给 Statement 的方法:   ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");   2、使用 Statement 对象执行语句   Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、exe  通过工具来创建SQL statement
cuteUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。   方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。   方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。   方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能,所以本概述后面将在单独一节中对其进行介绍。   执行语句的所有方法都将关闭所调用的 Statement 对象的当前打开结果集(如果存在)。这意味着在重新执行 Statement 对象之前,需要完成对当前 ResultSet 对象的处理。   应注意,继承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 对象本身不包含 SQL 语句,因而必须给 Statement.execute 方法提供 SQL 语句作为参数。PreparedStatement 对象并不将 SQL 语句作为参数提供给这些方法,因为它们已经包含预编译 SQL 语句。CallableStatement 对象继承这些方法的 PreparedStatement 形式。对于这些方法的 PreparedStatement 或 CallableStatement 版本,使用查询参数将抛出 SQLException。   3、语句完成   当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的 executeQuery 方法,在检索完 ResultSet 对象的所有行时该语句完成。对于方法 executeUpdate,当它执行时语句即完成。但在少数调用方法 execute 的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。
编辑本段关闭 Statement 对象
  Statement 对象将由 Java 垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要 Statement 对象时显式地关闭它们。这将立即释放 DBMS 资源,有助于避免潜在的内存问题。
}

 

 

ResultSet简单介绍

这篇文章并没有给出如何使用ResultSet的具体例子,只是从ResultSet的功能性上进行了详细的讲述。希望这篇文章对大家理解ResultSet能够有所帮助。下面就是这篇文章的具体内容。
         结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。

 

        结果集读取数据的方法主要是getXXX(),他的参数可以使整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false。使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有:基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型(BigDecimal和BigInteger等)等。还可以使用getArray(int colindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用getAsciiStream(
int colindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。

 

    结果集从其使用的特点上可以分为四类,这四类的结果集的所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以说,结果集具备何种特点,完全决定于Statement,当然我是说下面要将的四个特点,在Statement创建时包括三种类型。首先是无参数类型的,他对应的就是下面要介绍的基本的ResultSet对应的Statement。下面的代码中用到的Connection并没有对其初始化,变量conn代表的就是Connection对应的对象。SqlStr代表的是响应的SQL语句。

 

1    最基本的ResultSet。
之所以说是最基本的ResultSet是因为,这个ResultSet他起到的作用就是完成了查询结果的存储功能,而且只能读去一次,不能够来回的滚动读取。这种结果集的创建方式如下:

 

Statement st = conn.CreateStatement()
ResultSet rs = Statement.excuteQuery(sqlStr);

 

由于这种结果集不支持,滚动的读去功能所以,如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据。

 

2    可滚动的ResultSet类型。
这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n),要实现这样的ResultSet在创建Statement时用如下的方法。

 

Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)

 

其中两个参数的意义是:
resultSetType
是设置ResultSet对象的类型可滚动,或者是不可滚动。取值如下:
       ResultSet.TYPE_FORWARD_ONLY只能向前滚动
       ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。
resultSetConcurency是设置ResultSet对象能够修改的,取值如下:
       ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
       ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。
所以如果只是想要可以滚动的类型的Result只要把Statement如下赋值就行了。

 

Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,
                          ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sqlStr)

 

用这个Statement执行的查询语句得到的就是可滚动的ResultSet。

 

3    可更新的ResultSet
这样的ResultSet对象可以完成对数据库中表的修改,但是我知道ResultSet只是相当于数据库中表的视图,所以并不时所有的ResultSet只要设置了可更新就能够完成更新的,能够完成更新的ResultSet的SQL语句必须要具备如下的属性:
    a、只引用了单个表。
    b、不含有join或者group by子句。
    c、那些列中要包含主关键字。
    具有上述条件的,可更新的ResultSet可以完成对数据的修改,可更新的结果集的创建方法是:

 


Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)

 


这样的Statement的执行结果得到的就是可更新的结果集。更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX(),这个方法XXX的含义和getXXX()是相同的。updateXXX()方法,有两个参数,第一个是要更新的列,可以是列名或者序号。第二个是要更新的数据,这个数据类型要和XXX相同。每完成对一行的update要调用updateRow()完成对数据库的写入,而且是在ResultSet的游标没有离开该修改行之前,否则修改将不会被提交。
    使用updateXXX方法还可以完成插入操作。但是首先要介绍两个方法:
    moveToInsertRow()是把ResultSet移动到插入行,这个插入行是表中特殊的一行,不需要指定具体那一行,只要调用这个方法系统会自动移动到那一行的。
    moveToCurrentRow()这是把ResultSet移动到记忆中的某个行,通常当前行。如果没有使用insert操作,这个方法没有什么效果,如果使用了insert操作,这个方法用于返回到insert操作之前的那一行,离开插入行,当然也可以通过next(),previous()等方法离开插入行。
    要完成对数据库的插入,首先调用moveToInsertRow()移动到插入行,然后调用updateXXX的方法完成对,各列数据的更新,完成更新后和更新操作一样,要写到数据库,不过这里使用的是insertRow(),也要保证在该方法执行之前ResultSet没有离开插入列,否则插入不被执行,并且对插入行的更新将丢失。

 

4    可保持的ResultSet
正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中,我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这个Statement的创建方式也就是,我所说的Statement的第三种创建方式。如下:

 

Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
ResultSet rs = st.excuteQuery(sqlStr);

 

前两个参数和两个参数的createStatement方法中的参数是完全相同的,这里只介绍第三个参数:
       resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个:
       ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。
     ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。

 

不过这种功能只是在JDBC3.0的驱动下才能成立。

接口

ResultSet 接口提供对数据表的访问。ResultSet 对象通常是通过执行“语句”来生成的。

ResultSet 始终有一个游标指向其当前数据行。最初,游标定位在第一行的前面。next() 方法将游标移至下一行。

getXXX 方法会检索当前行的列值。可使用列的索引号或列的名称来检索这些值。通常,使用列索引将更为有效。列是从 1 开始编号的。

java.sql 包

公共接口 ResultSet

102 列示 ResultSet 接口中 DB2 Everyplace 支持的字段。

102. ResultSet接口字段

字段类型

字段

static int

CONCUR_READ_ONLY 该常量指示不能更新的 ResultSet 对象的并行性方式。 注意:DB2 Everyplace 不支持 CONCUR_UPDATABLE。如果在创建“语句”对象时对 ResultSet 对象的并行性方式指定 CONCUR_UPDATABLE,则 DB2 Everyplace JDBC 驱动程序将对产生“语句”对象的“连接”对象发出 SQLWarning 并使用 CONCUR_READ_ONLY 代替。

static int

TYPE_FORWARD_ONLY 该常量指示其游标只能向前移动的 ResultSet 对象的类型。

static int

TYPE_SCROLL_INSENSITIVE 该常量指示可滚动但通常对他人所作的更改不敏感的 ResultSet 对象的类型。注意:不要经常使用此类型的 ResultSet 对象,原因是它可能会影响性能。此类型使用 SQL_INSENSITIVE 作为 CLI 语句属性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有关详细信息,参阅 CLI 函数 SQLSetStmtAttr 的文档。

static int

TYPE_SCROLL_SENSITIVE 该常量指示可滚动且通常对他人所作的更改敏感的 ResultSet 对象的类型。注意:此类型使用 SQL_UNSPECIFIED 作为 CLI 语句属性 SQL_ATTR_CURSOR_SENSITIVITY 的值。有关详细信息,参阅 CLI 函数 SQLSetStmtAttr 的文档。

103 列示 ResultSet 接口中 DB2 Everyplace 支持的方法。

103. ResultSet接口方法

方法返回值类型

方法

boolean

absolute(int row) JDBC 2.0。将游标移至结果集中的给定行号。

void

afterLast() JDBC 2.0。将游标移至结果集的末尾,正好在最后一行的后面。

void

beforeFirst() JDBC 2.0。将游标移至结果集的前方,正好在第一行的前面。

void

clearWarnings() 清除此 ResultSet 对象上报告的所有警告。

void

close() 立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待对象自动关闭时才释放它们。

int

findColumn(String columnName) 将给定 ResultSet 列名映射至其 ResultSet 列索引。

boolean

first() JDBC 2.0。将游标移至结果集中的第一行。

BigDecimal

getBigDecimal(int columnIndex) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 对象形式获取当前行中某个列的值。Palm OS 的 DB2 Everyplace JDBC 驱动程序不支持此方法。

BigDecimal

getBigDecimal(int columnIndex, int scale) 以 Java 编程语言中的 java.math.BigDecim

 

BigDecimal

getBigDecimal(int columnIndex, int scale) 以 Java 编程语言中的 java.math.BigDecimal 对象形式获取此 ResultSet 对象当前行中指定列的值。Palm OS 的 DB2 Everyplace JDBC 驱动程序不支持此方法。不受支持。

BigDecimal

getBigDecimal(String columnName) JDBC 2.0。以具有全部精度的 java.math.BigDecimal 对象形式获取当前行中某个列的值。Palm OS 的 DB2 Everyplace JDBC 驱动程序不支持此方法。

BigDecimal

getBigDecimal(String columnName, int scale) 以 Java 编程语言中的 java.math.BigDecimal 对象形式获取此 ResultSet 对象当前行中指定列的值。Palm OS 的 DB2 Everyplace JDBC 驱动程序不支持此方法。不受支持。

Blob

getBlob(int columnIndex) JDBC 2.0。获取此 ResultSet 对象的当前行中的 BLOB 值。

Blob

getBlob(String columnName) JDBC 2.0。获取此 ResultSet 对象的当前行中的 BLOB 值。

boolean

getBoolean(int columnIndex) 以 Java 布尔值形式获取当前行中某列的值。

boolean

getBoolean(String columnName) 以 Java 布尔值形式获取当前行中某列的值。

byte

getByte(int columnIndex) 以 Java 编程语言中的字节形式获取此 ResultSet 对象当前行中指定列的值。

byte

getByte(String columnName) 以 Java 编程语言中的字节形式获取此 ResultSet 对象当前行中指定列的值。

byte[]

getBytes(int columnIndex) 以 Java 编程语言中的字节数组形式获取此 ResultSet 对象当前行中指定列的值。

byte[]

getBytes(String columnName) 以 Java 编程语言中的字节数组形式获取此 ResultSet 对象当前行中指定列的值。

int

getConcurrency() JDBC 2.0。返回结果集的并行性方式。

Date

getDate(int columnIndex) 以 Java 编程语言中的 java.sql.Date 对象形式获取此 ResultSet 对象当前行中指定列的值。

Date

getDate(int columnIndex, Calendar cal) 以 Java 编程语言中的 java.sql.Date 对象形式返回此 ResultSet 对象的当前行中指定列的值。

Date

getDate(String columnName) 以 Java 编程语言中的 java.sql.Date 对象形式获取此 ResultSet 对象的当前行中指定列的值。

double

getDouble(int columnIndex) 以 Java 双精度形式获取当前行中某列的值。

double

getDouble(String columnName) 以 Java 双精度形式获取当前行中某列的值。

float

getFloat(int columnIndex) 以 Java 浮点形式获取当前行中某列的值。

float

getFloat(String columnName) 以 Java 浮点形式获取当前行中某列的值。

int

getInt(int columnIndex) 以 Java 编程语言中的整数形式获取此 ResultSet 对象当前行中指定列的值。

int

getInt(String columnName) 以 Java 编程语言中的整数形式获取此 ResultSet 对象的当前行中指定列的值。

long

getLong(int columnIndex) 以 Java 长整型形式获取当前行中某列的值。

long

getLong(String columnName) 以 Java 长整型形式获取当前行中某列的值。

ResultSetMetaData

getMetaData() 检索此 ResultSet 对象的列的数目、类型和属性。

Object

getObject(int columnIndex) 以 Java 对象形式获取当前行中某列的值。

Object

getObject(String columnName) 以 Java 对象形式获取当前行中某列的值。

int

getRow() JDBC 2.0。检索当前行号。

short

getShort

 

short

getShort(String columnName) 以 Java 编程语言中的 short 形式获取此 ResultSet 对象当前行中指定列的值。

Statement

getStatement() JDBC 2.0。返回产生此 ResultSet 对象的“语句”。

String

getString(int columnIndex) 以 Java 编程语言中的 String 形式获取此 ResultSet 对象当前行中指定列的值。

String

getString(String columnName) 以 Java 编程语言中的 String 形式获取此 ResultSet 对象当前行中指定列的值。

Time

getTime(int columnIndex) 以 Java 编程语言中的 java.sql.Time 对象形式获取此 ResultSet 对象的当前行中指定列的值。

Time

getTime(String columnName) 以 Java 编程语言中的 java.sql.Date 对象形式获取此 ResultSet 对象的当前行中指定列的值。

Timestamp

getTimestamp(String columnName) 以 Java 编程语言中的 java.sql.Timestamp 对象形式获取此 ResultSet 对象的当前行中指定列的值。

Timestamp

getTimestamp(int columnIndex) 以 Java 编程语言中的 java.sql.Timestamp 对象形式获取此 ResultSet 对象的当前行中指定列的值。

int

getType() JDBC 2.0。返回此结果集的类型。

SQLWarning

getWarnings() 返回此 ResultSet 上的调用报告的首次警告。

boolean

isAfterLast() JDBC 2.0。指示游标是否在结果集中的最后一行后面。

boolean

isBeforeFirst() JDBC 2.0。指示游标是否在结果集中的第一行前面。

boolean

isFirst() JDBC 2.0。指示游标是否在结果集中的第一行上。

boolean

isLast() JDBC 2.0。指示游标是否在结果集中的最后一行上。对于具有类型 TYPE_FORWARD_ONLY 的结果集,不支持此方法。

boolean

last() JDBC 2.0。将游标移至结果集中的最后一行。

boolean

next() 将游标从当前位置向下移动一行。

boolean

previous() JDBC 2.0。将游标移至结果集中的前一行。

boolean

relative(int rows) JDBC 2.0。将游标移动相对行数,正数或负数。

boolean

wasNull() 报告读取的最后一列是否具有值 SQL NULL。

 

 

JDBC API 2.0/3.0ResultSet记录集的
JDBC API 2.0/3.0
ResultSet记录集的简便实用的新特性


1
新定义了若干个常数

这些常数用于指定ResultSet的类型游标移动的方向等性质,如下所示:
public static final int FETCH_FORWARD;
该常数的作用是指定处理记录集中行的顺序,是由前到后即从第一行开始处理一直到最后一行;
public static final int FETCH_REVERSE;
该常数的作用是指定处理记录集中行的顺序,是由后到前即从最后一行开始处理一直到第一行;
public static final int FETCH_UNKNOWN;
该常数的作用是不指定处理记录集中行的顺序,由JDBC驱动程序和数据库系统决定;
public static final int TYPE_FORWARD_ONLY;
该常数的作用是指定数据库游标的移动方向是向前,不允许向后移动即只能使用ResultSet接口的next()方法而不能使用previous()方法否则会产生错误;
public static final int TYPE_SCROLL_INSENSITIVE;
该常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感;就是说,当前用户正在浏览记录集中的数据,与此同时,其他用户更新了数据库中的数据,但是当前用户所获取的记录集中的数据不会受到任何影响。
public static final int TYPE_SCROLL_SENSITIVE;
该常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作敏感,就是说,当前用户正在浏览记录集,但是其它用户的操作使数据库中的数据发生了变化,当前用户所获取的记录集中的数据也会同步发生变化,这样有可能会导致非常严重的错误产生建议慎重使用该常数。
public static final int CONCUR_READ_ONLY;
该常数的作用是指定当前记录集的协作方式(concurrencymode),为只读;一旦使用了这个常数,那么用户就不可以更新记录集中的数据。
public static final int CONCUR_UPDATABLE;
该常数的作用是指定当前记录集的协作方式(concurrencymode),为可以更新;一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记。

2 ResultSet
接口提供了一整套的定位方法
这些可以在记录集中定位到任意一行:
public boolean absolute(int row);
该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算不是相对的行号。
public boolean relative(int rows);
该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows表示目标行相对于当前行的行号。
public boolean first();
该方法的作用是将当前行定位到数据库记录集的第一行。
public boolean last();
该方法的作用刚好和first()方法相反。
public boolean isFirst();
public boolean isFirst();
该方法的作用是检查当前行是否记录集的第一行,如果是返回true,否则返回false
public boolean isLast();
该方法的作用是检查当前行是否记录集的最后一行,如果是返回true,否则返回false
public void afterLast();
该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面,如果该记录集不包含任何的行该方法不产生作用。
public void beforeFirst();
该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面,如果记录集不包含任何的行该方法不产生作用。
public boolean isAfterLast();
该方法检查数据库游标是否处于记录集的最后面,如果是返回true,否则返回false
public boolean isBeforeFirst();
该方法检查数据库游标是否处于记录集的最前面,如果是返回true,否则返回false
public boolean next();
该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方法将会使数据库游标定位到记录集的第一行,第二次使用next()方法将会使数据库游标定位到记录集的第二行,以此类推。
public boolean previous();
该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行。

3 ResultSet
接口添加了对行操作的支持(最令人心动之处)

修改了的记录集接口(ResultSet接口)的方法,使它支持可以滚动的记录集,即数据库游标可以在返回的记录集对象中自由地向前或向后滚动,或者定位到某个特殊的行。利用ResultSet接口中定义的新方法,JSP/Servlet程序员可以用Java语言来更新记录集,比如插入记录,更新某行的数据,而不是靠执行SQL语句,这样就大大方便了程序员的开发工作,享受Java编程的乐趣了。
ResultSet
接口中新添加的部分方法如下所示:
public boolean rowDeleted();
如果当前记录集的某行被删除了,那么记录集中将会留出一个空位;调用rowDeleted()方法,如果探测到空位的存在,那么就返回true;如果没有探测到空位的存在,就返回false值。
public boolean rowInserted();
如果当前记录集中插入了一个新行,该方法将返回true,否则返回false
public boolean rowUpdated();
如果当前记录集的当前行的数据被更新,该方法返回true,否则返回false
public void insertRow();
该方法将执行插入一个新行到当前记录集的操作。
public void updateRow();
该方法将更新当前记录集当前行的数据。
public void deleteRow();
该方法将删除当前记录集的当前行。
public void updateString(int columnIndex String x);
该方法更新当前记录集当前行某列的值,该列的数据类型是String(Java数据类型是String,与之对应的JDBC数据类型是VARCHARNVARCHAR等数据类型)。该方法的参数columnIndex指定所要更新的列的列索引,第一列的列索引是1,以此类推,第二个参数x代表新的值,这个方法并不执行数据库操作,需要执行insertRow()方法或者updateRow()方法以后,记录集和数据库中的数据才能够真正更新。
public void updateString(String columnName String x);
该方法和上面介绍的同名方法差不多,不过该方法的第一个参数是columnName,代表需要更新的列的列名,而不是columnIndex

往数据库当前记录集插入新行的操作流程如下:
1
调用moveToInsertRow()方法;
2
调用updateXXX()方法指定插入行各列的值;
3
调用insertRow()方法往数据库中插入新的行。

更新数据库中某个记录的值(某行的值)的方法是:
1
定位到需要修改的行(使用absolute() relative()等方法定位)
2
使用相应updateXXX()方法设定某行某列的新值;XXX所代表的Java数据类型,必须可以映射为某列的JDBC数据类型,如果希望rollback该项操作,请在调用updateRow()方法以前,使用cancelRowUpdates()方法,这个方法可以将某行某列的值复原;
3
使用updateRow()方法完成UPDATE的操作。

删除记录集中某行(亦即删除某个记录)的方法:
1
定位到需要修改的行(使用absolute() relative()等方法定位)
2
使用deleteRow()

删除记录集中某行(亦即删除某个记录)的方法:
1
定位到需要修改的行(使用absolute() relative()等方法定位)
2
使用deleteRow()方法。

JDBC API 3.0
中还在ResultSet接口中添加了updateArray() updateBlob() updateClob() updateRef()等方法

 

1java数据库操作基本流程

  2、几个常用的重要技巧:

  可滚动、更新的记录集

  批量更新

  事务处理

  java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接

  1、取得数据库连接

  1)用DriverManager取数据库连接

  例子:

String className,url,uid,pwd;
className = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
uid = "system";
pwd = "manager";
Class.forName(className);
Connection cn = DriverManager.getConnection(url,uid,pwd);


  2)用jndi(java的命名和目录服务)方式

  例子

String jndi = "jdbc/db";
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup(jndi);
Connection cn = ds.getConnection();


  多用于jsp

  2、执行sql语句

  1)用Statement来执行sql语句

String sql;
Statement sm = cn.createStatement();
sm.executeQuery(sql); //
执行数据查询语句(select
sm.executeUpdate(sql); //
执行数据更新语句(deleteupdateinsertdrop等)statement.close();


  2)用PreparedStatement来执行sql语句

String sql;
sql = "insert into user (id,name) values (?,?)";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setInt(1,xxx);
ps.setString(2,xxx);
...
ResultSet rs = ps.executeQuery(); //
查询
int c = ps.executeUpdate(); //
更新


  3、处理执行结果

  查询语句,返回记录集ResultSet。

  更新语句,返回数字,表示该更新影响的记录数。

  ResultSet的方法:

  1、next(),将游标往后移动一行,如果成功返回true;否则返回false。

  2、getInt("id")或getSting("name"),返回当前游标下某个字段的值。

  3、释放连接。

cn.close();


  一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection

  可滚动、更新的记录集

  1、创建可滚动、更新的Statement

Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);


  该Statement取得的ResultSet就是可滚动的

  2、创建PreparedStatement时指定参数

PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet.absolute(9000);


  批量更新

  1、Statement

Statement sm = cn.createStatement();
sm.addBatch(sql1);
sm.addBatch(sql2);
...
sm.executeBatch()


  一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有

  2、PreparedStatement

PreparedStatement ps = cn.preparedStatement(sql);
{
 ps.setXXX(1,xxx);
 ...
 ps.addBatch();
}
ps.executeBatch();


  一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。

  事务的处理

  1、关闭Connection的自动提交

cn.setAutoCommit(false);


  2、执行一系列sql语句

  要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close

Statement sm ;
sm = cn.createStatement(insert into user...);
sm.executeUpdate();
sm.close();

sm = cn.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();


  3、提交

cn.commit();


  4、如果发生异常,那么回滚

cn.rollback();

 

 

 

 

 

 

 

 

一个关于数据更新的JDBC的小程序

 

import java.sql.*;

 

public class testmysqlconnection {

 

        /**

         * @param args

         */

        public static void main(String[] args) {

               Connection conn = null;

               Statement stmt = null;

               ResultSet rs = null;

               try {

 

                       Class.forName("com.mysql.jdbc.Driver");// 添加驱动

 

                       conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?"

                                      + "user=root&password=root");// 添加数据连接字符串

                       stmt = conn.createStatement();

                       stmt.executeUpdate("INSERT INTO xm (name,xingbie) values (\"33\",\"22\") ");//更新数据

                      

                       }

               }

//异常处理

               catch (ClassNotFoundException e) {

                       e.printStackTrace();

               } catch (SQLException ex) {

                       // handle any errors

                       System.out.println("SQLException: " + ex.getMessage());

                       System.out.println("SQLState: " + ex.getSQLState());

                       System.out.println("VendorError: " + ex.getErrorCode());

                       ex.printStackTrace();

               } finally {

                       try {

                               if (rs != null) {

                                      rs.close();

                                      rs = null;

                               }

                               if (stmt != null) {

                                      stmt.close();

                                      stmt = null;

                               }

                               if (conn != null) {

                                      conn.close();

                                      conn = null;

                               }

                       } catch (SQLException e) {

                               e.printStackTrace();

 

                       }

               }

 

        }

}

 

 

 

程序中一些名词解释

 

execute、executeQuery和executeUpdate之间的区别

在用纯JSP做一个页面报警功能的时候习惯性的用executeQuery来执行SQL语句,结果执行update时就遇到问题,语句能执行,但返回结果出现问题,另外还忽略了executeUpdate的返回值不是结果集ResultSet,而是数值!特收藏如下一篇文章(感谢网友们对各种信息的贡献):

JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别


Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。

方法executeQuery
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。


方法execute:
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能

execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。
对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):

((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))

如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。

当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:

((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))

下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数:


stmt.execute(queryStringWithUnknownResults);
while (true) {
int rowCount = stmt.getUpdateCount();
if (rowCount > 0) { // 它是更新计数
System.out.println("Rows changed = " + count);
stmt.getMoreResults();
continue;
}
if (rowCount == 0) { // DDL 命令或 0 个更新
System.out.println(" No rows changed or statement was DDL
command");
stmt.getMoreResults();
continue;
}

// 执行到这里,证明有一个结果集
// 或没有其它结果

ResultSet rs = stmt.getResultSet;
if (rs != null) {
. . . // 使用元数据获得关于结果集列的信息
while (rs.next()) {
. . . // 处理结果
stmt.getMoreResults();
continue;
}
break; // 没有其它结果

 

 

 

原创粉丝点击