五、数据库编程

DBC成为JAVA类库中最常使用的API之一

5.1 JDBC的设计

  JDBC和ODBC都基于同一个思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器则通过驱动程序与实际的数据库进行通信。

5.1 .1 JDBC驱动程序类型

  • 将JDBC翻译成ODBC,然后使用一个ODBC驱动城区与数据库进行通信
  • 部分Java程序和部分本地代码组成
  • 纯Java客户端类库
  • 纯Java类库

总之,JDBC是为实现以下目标:

  • 通过使用标准的SQL语句,甚至是专门的SQL扩展,程序员就可以利用Java语言开发访问数据库的应用。
  • 数据库供应商和数据库工具开发商可以提供底层的驱动程序。

5.1.2 JDBC 典型用法

5.2 结构化查询语言

基于服务器的数据库只能使用SQL来访问。

可以将JDBC包看成是一个用于将SQL语句传递给数据库的API

5.3 JDBC配置

5.3.1 数据库URL

在链接数据库时,我们必须使用各种与数据库类型相关的参数,例如主机名、端口号和数据库名。

下面是URL示例

jdbc:derby://localhost:8080/COREJAVA;create=true

jdbc:postgresql:COREJAVA

JDBC URL一般语法:

jdbc:subprotocol:other staff  subprotocol用于选择连接到数据库的具体驱动程序。otherstaff根据subprotocol不同有变化

5.3.2 驱动程序Jar文件

 在运行访问数据库的程序时,将驱动程序的jar文件包括到类路径中

当从命令行启动程序时,执行下面的命令:

java -classpath driverpath:ProgramName

在Windows上,使用分号将当前路径与驱动程序JAR文件分隔开

5.3.4 注册驱动器类

ps:有的JAR文件自动注册,可以跳过该步

使用DriverManager,可以使用两种方法注册驱动器,一种方法实在Java程序中加载驱动器

Class.forName("org.postgresql.Driver");

另一种方法是设置jdbc.drivers属性

5.3.5 连接到数据库

例:

package hotel.dao;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;



/**
 * 数据库操作基类
 */
public class BaseDao {
	public static String DRIVER; // 数据库驱动

	public static String URL ; // url

	public static String DBNAME; // 数据库用户名

	public static String DBPASS; // 数据库密码
	
	Connection conn = null;// 数据连接对象
	
	static{//静态代码块,在类加载的时候执行
		init();
	}
	
	/**
	 * 初始化连接参数,从配置文件里获得
	 */
		public static void init(){
			Properties params=new Properties();
			String configFile = "database.properties";//配置文件路径
			//加载配置文件到输入流中
			InputStream is=BaseDao.class.getClassLoader().getResourceAsStream(configFile);
			
			try {
				//从输入流中读取属性列表
				params.load(is);
			} catch (IOException e) {
				e.printStackTrace();
			}
			//根据指定的获取对应的值
			DRIVER=params.getProperty("driver");
			URL=params.getProperty("url");
			DBNAME=params.getProperty("user");
			DBPASS=params.getProperty("password");
		}   

	/**
	 * 得到数据库连接
	 * 
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 * @return 数据库连接
	 */
	public Connection getConn() throws ClassNotFoundException, SQLException {
		Connection conn = null;
		try {
			Class.forName(DRIVER); // 注册驱动
			Connection cnn=DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/haha","","");
			conn = DriverManager.getConnection(URL, DBNAME, DBPASS); // 获得数据库连接
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn; // 返回连接
	}

	/**
	 * 释放资源
	 * 
	 * @param conn
	 *            数据库连接
	 * @param pstmt
	 *            PreparedStatement对象
	 * @param rs
	 *            结果集
	 */
	public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet rs) {

		/* 如果rs不空,关闭rs */
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		/* 如果pstmt不空,关闭pstmt */
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		/* 如果conn不空,关闭conn */
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}


	/**
	 * 执行SQL语句,可以进行增、删、改的操作,不能执行查询
	 * 
	 * @param sql
	 *            预编译的 SQL 语句
	 * @param param
	 *            预编译的 SQL 语句中的‘?’参数的字符串数组
	 * @return 影响的条数
	 */
	public int executeSQL(String preparedSql, Object[] param) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int num = 0;

		/* 处理SQL,执行SQL */
		try {
			conn = getConn(); // 得到数据库连接
			pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
				}
			}
			// System.out.println(preparedSql);
			num = pstmt.executeUpdate(); // 执行SQL语句
		} catch (ClassNotFoundException e) {
			e.printStackTrace(); // 处理ClassNotFoundException异常
		} catch (SQLException e) {
			e.printStackTrace(); // 处理SQLException异常
		} finally {
			this.closeAll(conn, pstmt, null);
		}
		return num;
	}
}

package Section5;

import java.sql.*;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() {
		try {
			Connection conn=getConn();
			Statement stat=conn.createStatement();
			ResultSet rs= stat.executeQuery("select * from user");
			String id=null;
			String password=null;
			while(rs.next()) {
				id=rs.getString("id");
				password=rs.getString("password");
				System.out.println(id+ "  "+ password);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new testDao();
		
		
	}

}


5.4 使用JDBC语句

5.4.1 执行sql语句

Connection conn=getConn();
Statement stat=conn.createStatement();
ResultSet rs= stat.executeQuery("select * from user");

 对于ResultSet接口,迭代器初始化时被设定在第一行之前的位置,必须调用next方法将它移动到第一行。每个访问器都有两种形式,一种接收数字型参数,一种接受字符型参数。

与数组的索引不同,数据库的列号是从一开始的。

当get方法的类型和列型不一致时,每个get方法都会进行合理的类型转换。例如,调用rs.getString("Price")时,该方法将会将Price列的服殿直转换成字符串。

 

java.sql.Connection:

    • Modifier and TypeMethod and Description
      voidabort(Executor executor)

      终止打开的连接。

      voidclearWarnings()

      清除为此 Connection对象报告的所有警告。

      voidclose()

      Connection发布此 Connection对象的数据库和JDBC资源,而不是等待它们自动释放。

      voidcommit()

      使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。

      ArraycreateArrayOf(String typeName, Object[] elements)

      用于创建Array对象的Factory方法。

      BlobcreateBlob()

      构造实现的对象 Blob接口。

      ClobcreateClob()

      构造实现的对象 Clob接口。

      NClobcreateNClob()

      构造实现的对象 NClob接口。

      SQLXMLcreateSQLXML()

      构造实现的对象 SQLXML接口。

      StatementcreateStatement()

      创建一个 Statement对象,用于将SQL语句发送到数据库。

      StatementcreateStatement(int resultSetType, int resultSetConcurrency)

      创建一个 Statement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。

      StatementcreateStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)

      创建一个 Statement对象,将产生 ResultSet对象具有给定类型,并发性和可保存性。

    • StructcreateStruct(String typeName, Object[] attributes)

      用于创建Struct对象的工厂方法。

      booleangetAutoCommit()

      检索此 Connection对象的当前自动提交模式。

      StringgetCatalog()

      检索此 Connection对象的当前目录名称。

      PropertiesgetClientInfo()

      返回包含驱动程序支持的每个客户端信息属性的名称和当前值的列表。

      StringgetClientInfo(String name)

      返回由name指定的客户端信息属性的值。

      intgetHoldability()

      检索使用此 Connection对象创建的 ResultSet对象的当前保持性。

      DatabaseMetaDatagetMetaData()

      检索 DatabaseMetaData对象包含有关哪个这个数据库的元数据 Connection对象表示的连接。

      intgetNetworkTimeout()

      检索驱动程序等待数据库请求完成的毫秒数。

      StringgetSchema()

      检索此 Connection对象的当前模式名称。

      intgetTransactionIsolation()

      获取此 Connection对象的当前事务隔离级别。

      Map<String,<?>>getTypeMap()

      检索 Map与此相关联的对象 Connection对象。

      SQLWarninggetWarnings()

      检索通过此 Connection对象的呼叫报告的第一个警告。

      booleanisClosed()

      检索此 Connection对象是否已关闭。

      booleanisReadOnly()

      检索此 Connection对象是否处于只读模式。

      booleanisValid(int timeout)

      如果连接尚未关闭并且仍然有效,则返回true。

      StringnativeSQL(String sql)

      将给定的SQL语句转换为系统的本机SQL语法。

      CallableStatementprepareCall(String sql)

      创建一个调用数据库存储过程的 CallableStatement对象。

      CallableStatementprepareCall(String sql, int resultSetType, int resultSetConcurrency)

      创建一个 CallableStatement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。

      CallableStatementprepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

      创建一个 CallableStatement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。

      PreparedStatementprepareStatement(String sql)

      创建一个 PreparedStatement对象,用于将参数化的SQL语句发送到数据库。

      PreparedStatementprepareStatement(String sql, int autoGeneratedKeys)

      创建一个默认的 PreparedStatement对象,该对象具有检索自动生成的密钥的能力。

      PreparedStatementprepareStatement(String sql, int[] columnIndexes)

      创建一个默认的 PreparedStatement对象,能够返回给定数组指定的自动生成的键。

      PreparedStatementprepareStatement(String sql, int resultSetType, int resultSetConcurrency)

      创建一个 PreparedStatement对象,该对象将生成具有给定类型和并发性的 ResultSet对象。

      PreparedStatementprepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)

      创建一个 PreparedStatement对象,将产生 ResultSet对象具有给定类型,并发性和可保存性。

      PreparedStatementprepareStatement(String sql, String[] columnNames)

      创建一个默认的 PreparedStatement对象,能够返回给定数组指定的自动生成的键。

      voidreleaseSavepoint(Savepoint savepoint)

      删除指定的 Savepoint和随后 Savepoint从目前的交易对象。

      voidrollback()

      撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。

      voidrollback(Savepoint savepoint)

      撤消在给定的 Savepoint对象设置后进行的所有更改。

      voidsetAutoCommit(boolean autoCommit)

      将此连接的自动提交模式设置为给定状态。

      voidsetCatalog(String catalog)

      设置给定的目录名称,以便选择要在其中工作的 Connection对象的数据库的子空间。

      voidsetClientInfo(Properties properties)

      设置连接的客户端信息属性的值。

      voidsetClientInfo(String name, String value)

      将由name指定的客户端信息属性的值设置为由值指定的值。

      voidsetHoldability(int holdability)

      将使用此 Connection对象创建的 ResultSet对象的默认保持性更改为给定的可保存性。

      voidsetNetworkTimeout(Executor executor, int milliseconds)

      设置最大周期a Connection或从 Connection创建的 Connection将等待数据库回复任何一个请求。

      voidsetReadOnly(boolean readOnly)

      将此连接设置为只读模式,作为驱动程序的提示以启用数据库优化。

      SavepointsetSavepoint()

      在当前事务中创建一个未命名的保存点,并返回代表它的新的 Savepoint对象。

      SavepointsetSavepoint(String name)

      在当前事务中创建具有给定名称的保存点,并返回代表它的新的 Savepoint对象。

      voidsetSchema(String schema)

      设置要访问的给定模式名称。

      voidsetTransactionIsolation(int level)

      尝试将此 Connection对象的事务隔离级别更改为给定的对象。

      voidsetTypeMap(Map<String,<?>> map)

      将给定的 TypeMap对象作为此 Connection对象的类型映射。

java.sql.Statement:

    • Modifier and TypeMethod and Description
      voidaddBatch(String sql)

      将给定的SQL命令添加到此 Statement对象的当前命令列表中。

      voidcancel()

      如果DBMS和驱动程序都支持中止SQL语句,则取消此 Statement对象。

      voidclearBatch()

      清空此 Statement对象的当前SQL命令列表。

      voidclearWarnings()

      清除此 Statement对象上报告的所有警告。

      voidclose()

      Statement对象的数据库和JDBC资源,而不是等待它自动关闭时发生。

      voidcloseOnCompletion()

      指定当其所有相关结果集都关闭时,此 Statement将关闭。

      booleanexecute(String sql)

      执行给定的SQL语句,这可能会返回多个结果。

      booleanexecute(String sql, int autoGeneratedKeys)

      执行给定的SQL语句,这可能返回多个结果,并向驱动程序发出信号,指出任何自动生成的密钥应该可用于检索。

      booleanexecute(String sql, int[] columnIndexes)

      执行给定的SQL语句,这可能会返回多个结果,并向驱动程序发出信号,指出给定数组中指定的自动生成的键应该可用于检索。

      booleanexecute(String sql, String[] columnNames)

      执行给定的SQL语句,这可能会返回多个结果,并向驱动程序发出信号,指出给定数组中指定的自动生成的键应该可用于检索。

      int[]executeBatch()

      将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。

      default long[]executeLargeBatch()

      将一批命令提交到数据库以执行,并且所有命令都执行成功,返回一个更新计数的数组。

      default longexecuteLargeUpdate(String sql)

      执行给定的SQL语句,这可能是 INSERTUPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。

      default longexecuteLargeUpdate(String sql, int autoGeneratedKeys)

      执行给定的SQL语句并用给定的标志来向驱动程序发出信号,指出这个 Statement对象产生的自动生成的密钥是否应该可用于检索。

      default longexecuteLargeUpdate(String sql, int[] columnIndexes)

      执行给定的SQL语句,并向驱动程序发出信号,指出给定数组中指示的自动生成的键应该可用于检索。

      default longexecuteLargeUpdate(String sql, String[] columnNames)

      执行给定的SQL语句,并向驱动程序发出信号,指出给定数组中指示的自动生成的键应该可用于检索。

      ResultSetexecuteQuery(String sql)

      执行给定的SQL语句,该语句返回单个 ResultSet对象。

      intexecuteUpdate(String sql)

      执行给定的SQL语句,这可能是 INSERTUPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。

      intexecuteUpdate(String sql, int autoGeneratedKeys)

      执行给定的SQL语句并用给定的标志来向驱动程序发出信号,以了解该 Statement对象产生的自动生成的密钥是否应该可用于检索。

      intexecuteUpdate(String sql, int[] columnIndexes)

      执行给定的SQL语句,并向驱动程序发出信号,指出给定数组中指示的自动生成的键应该可用于检索。

      intexecuteUpdate(String sql, String[] columnNames)

      执行给定的SQL语句,并向驱动程序发出信号,指出给定数组中指示的自动生成的键应该可用于检索。

      ConnectiongetConnection()

      检索 Connection生成此对象 Statement对象。

      intgetFetchDirection()

      检索从数据库表中获取行的方向,这是 Statement对象生成的结果集的默认值。

      intgetFetchSize()

      检索结果集合的行数是默认为获取大小 ResultSet从该生成的对象 Statement对象。

      ResultSetgetGeneratedKeys()

      检索由执行此 Statement对象而创建的任何自动生成的密钥。

      default longgetLargeMaxRows()

      检索由此 ResultSet对象生成的 Statement对象可以包含的最大行数。

      default longgetLargeUpdateCount()

      将当前结果作为更新计数检索; 如果结果是一个ResultSet对象或没有更多结果,则返回-1。

      intgetMaxFieldSize()

      检索由此 ResultSet对象生成的 Statement对象中的 ResultSet和二进制列值可以返回的最大字节数。

      intgetMaxRows()

      检索一个的最大行数 ResultSet由此产生对象 Statement对象可以包含。

      booleangetMoreResults()

      移动到这个 Statement对象的下一个结果,如果它是一个 ResultSet对象返回 true ,并隐式关闭使用方法 getResultSet获取的任何当前的 ResultSet对象。

      booleangetMoreResults(int current)

      移动到此 Statement对象的下一个结果,根据给定标志指定的指令处理任何当前的 ResultSet对象,如果下一个结果是一个 ResultSet对象,则返回 true

      intgetQueryTimeout()

      检索驱动程序等待 Statement对象执行的 Statement

      ResultSetgetResultSet()

      ResultSet对象的形式获取当前结果。

      intgetResultSetConcurrency()

      检索由此 ResultSet对象生成的 Statement对象的结果集并发。

      intgetResultSetHoldability()

      检索由此 ResultSet对象生成的 Statement对象的结果集可保持 ResultSet

      intgetResultSetType()

      检索由此 ResultSet对象生成的 Statement对象的结果集类型。

      intgetUpdateCount()

      将当前结果作为更新计数检索; 如果结果是一个ResultSet对象或没有更多的结果,则返回-1。

      SQLWarninggetWarnings()

      检索此 Statement对象上的呼叫报告的第一个警告。

      booleanisClosed()

      检索此 Statement对象是否已关闭。

      booleanisCloseOnCompletion()

      返回指示是否该值 Statement时,其所有相关结果集的关闭将被关闭。

      booleanisPoolable()

      返回指示是否值 Statement是池化与否。

      voidsetCursorName(String name)

      将SQL游标名称设置为给定的 String ,后者将由 Statement对象使用 execute方法。

      voidsetEscapeProcessing(boolean enable)

      设置逃脱处理打开或关闭。

      voidsetFetchDirection(int direction)

      给驱动程序一个提示,在 ResultSet对象中使用这个 Statement对象创建的对象将处理行的 Statement

      voidsetFetchSize(int rows)

      为JDBC驱动程序提供提示以应该从数据库时,需要更多的行中获取的行数 ResultSet由此生成的对象 Statement

      default voidsetLargeMaxRows(long max)

      设置的任何行的最大数目的极限 ResultSet由此生成的对象 Statement对象可以包含给定数目。

      voidsetMaxFieldSize(int max)

      设置由此 ResultSet对象生成的 Statement对象中字符和二进制列值可以返回的最大字节数限制。

      voidsetMaxRows(int max)

      设置由此 ResultSet对象生成的任何 Statement对象可以包含给给定数量的最大行数的限制。

      voidsetPoolable(boolean poolable)

      要求汇集或不汇集 Statement

      voidsetQueryTimeout(int seconds)

      设置驱动程序等待 Statement对象执行到给定秒数的秒数。

java.sql.ResultSet:

    • Modifier and TypeMethod and Description
      booleanabsolute(int row)

      将光标移动到此 ResultSet对象中的给定行号。

      voidafterLast()

      将光标移动到这个 ResultSet对象的末尾,就在最后一行之后。

      voidbeforeFirst()

      将光标移动到这个 ResultSet对象的正面,就在第一行之前。

      voidcancelRowUpdates()

      取消对此 ResultSet对象中当前行的更新。

      voidclearWarnings()

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

      voidclose()

      ResultSet释放此 ResultSet对象的数据库和JDBC资源,而不是等待其自动关闭时发生。

      voiddeleteRow()

      从此 ResultSet对象和底层数据库中删除当前行。

      intfindColumn(String columnLabel)

      将给定的 ResultSet列标签映射到其 ResultSet列索引。

      booleanfirst()

      将光标移动到此 ResultSet对象中的第一行。

      ArraygetArray(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Array对象检索。

      ArraygetArray(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Array对象检索。

      InputStreamgetAsciiStream(int columnIndex)

      将此 ResultSet对象的当前行中指定列的值作为ASCII字符流检索。

      InputStreamgetAsciiStream(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为ASCII字符流检索。

      BigDecimalgetBigDecimal(int columnIndex)

      将此 ResultSet对象的当前行中指定列的值作为 java.math.BigDecimal以完全精确的方式获取。

      BigDecimalgetBigDecimal(int columnIndex, int scale)已弃用

      使用getBigDecimal(int columnIndex)getBigDecimal(String columnLabel)

      BigDecimalgetBigDecimal(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值作为 java.math.BigDecimal完全精确检索。

      BigDecimalgetBigDecimal(String columnLabel, int scale)已弃用

      使用getBigDecimal(int columnIndex)getBigDecimal(String columnLabel)

      InputStreamgetBinaryStream(int columnIndex)

      将此 ResultSet对象的当前行中的指定列的值作为未解释的字节流检索。

      InputStreamgetBinaryStream(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值 ResultSet为未解释的流 byte s。

      BlobgetBlob(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Blob对象检索。

      BlobgetBlob(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Blob对象检索。

      booleangetBoolean(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 boolean的Java编程语言。

      booleangetBoolean(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 boolean的Java编程语言。

      bytegetByte(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 byte的Java编程语言。

      bytegetByte(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 byte的Java编程语言。

      byte[]getBytes(int columnIndex)

      将该 ResultSet对象的当前行中的指定列的值作为Java编程语言中的 byte数组检索。

      byte[]getBytes(String columnLabel)

      将该 ResultSet对象的当前行中的指定列的值作为Java编程语言中的 byte数组检索。

      ReadergetCharacterStream(int columnIndex)

      将此 ResultSet对象的当前行中的指定列的值 ResultSetjava.io.Reader对象。

      ReadergetCharacterStream(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值 ResultSetjava.io.Reader对象。

      ClobgetClob(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Clob对象检索。

      ClobgetClob(String columnLabel)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Clob对象检索。

      intgetConcurrency()

      检索此 ResultSet对象的并发模式。

      StringgetCursorName()

      检索此 ResultSet对象使用的SQL游标的名称。

      DategetDate(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Date对象检索。

      DategetDate(int columnIndex, Calendar cal)

      将此 ResultSet对象的当前行中指定列的值 ResultSet为Java编程语言中的 java.sql.Date对象。

      DategetDate(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值作为Java编程语言中的 java.sql.Date对象检索。

      DategetDate(String columnLabel, Calendar cal)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Date对象检索。

      doublegetDouble(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 double的Java编程语言。

      doublegetDouble(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 double的Java编程语言。

      intgetFetchDirection()

      检索此 ResultSet对象的抓取方向。

      intgetFetchSize()

      检索此 ResultSet对象的提取大小。

      floatgetFloat(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 float的Java编程语言。

      floatgetFloat(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 float的Java编程语言。

      intgetHoldability()

      检索此 ResultSet对象的 ResultSet

      intgetInt(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet作为对象 int在Java编程语言。

      intgetInt(String columnLabel)

      以Java编程语言中的 intResultSet对象的当前行中指定列的值。

      longgetLong(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 long的Java编程语言。

      longgetLong(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 long的Java编程语言。

      ResultSetMetaDatagetMetaData()

      检索此 ResultSet对象的列的数量,类型和属性。

      ReadergetNCharacterStream(int columnIndex)

      将此 ResultSet对象的当前行中的指定列的值 ResultSetjava.io.Reader对象。

      ReadergetNCharacterStream(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值 ResultSetjava.io.Reader对象。

      NClobgetNClob(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 NClob对象检索。

      NClobgetNClob(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 NClob对象检索。

      StringgetNString(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 String的Java编程语言。

      StringgetNString(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 String的Java编程语言。

      ObjectgetObject(int columnIndex)

      获取此的当前行中指定列的值 ResultSet作为对象 Object在Java编程语言。

      <T> TgetObject(int columnIndex, <T> type)

      检索此 ResultSet对象的当前行中指定列的值,并将转换为SQL类型的列到所请求的Java数据类型,如果转换支持。

      ObjectgetObject(int columnIndex, Map<String,<?>> map)

      这个检索的当前行中指定列的值 ResultSet作为对象 Object在Java编程语言。

      ObjectgetObject(String columnLabel)

      获取此的当前行中指定列的值 ResultSet作为对象 Object在Java编程语言。

      <T> TgetObject(String columnLabel, <T> type)

      检索此 ResultSet对象的当前行中指定列的值,并将转换为SQL类型的列到所请求的Java数据类型,如果转换支持。

      ObjectgetObject(String columnLabel, Map<String,<?>> map)

      这个检索的当前行中指定列的值 ResultSet作为对象 Object在Java编程语言。

      RefgetRef(int columnIndex)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Ref对象检索。

      RefgetRef(String columnLabel)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 Ref对象检索。

      intgetRow()

      检索当前行号。

      RowIdgetRowId(int columnIndex)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.RowId对象检索。

      RowIdgetRowId(String columnLabel)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.RowId对象检索。

      shortgetShort(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 short的Java编程语言。

      shortgetShort(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 short的Java编程语言。

      SQLXMLgetSQLXML(int columnIndex)

      这个检索的当前行中指定列的值 ResultSetjava.sql.SQLXML的Java编程语言对象。

      SQLXMLgetSQLXML(String columnLabel)

      这个检索的当前行中指定列的值 ResultSetjava.sql.SQLXML的Java编程语言对象。

      StatementgetStatement()

      检索 Statement生成此对象 ResultSet对象。

      StringgetString(int columnIndex)

      这个检索的当前行中指定列的值 ResultSet对象为 String的Java编程语言。

      StringgetString(String columnLabel)

      这个检索的当前行中指定列的值 ResultSet对象为 String的Java编程语言。

      TimegetTime(int columnIndex)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Time对象检索。

      TimegetTime(int columnIndex, Calendar cal)

      将此 ResultSet对象的当前行中的指定列的值作为Java编程语言中的 java.sql.Time对象检索。

      TimegetTime(String columnLabel)

      将此 ResultSet对象的当前行中的指定列的值作为Java编程语言中的 java.sql.Time对象检索。

      TimegetTime(String columnLabel, Calendar cal)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Time对象检索。

      TimestampgetTimestamp(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Timestamp对象检索。

      TimestampgetTimestamp(int columnIndex, Calendar cal)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Timestamp对象检索。

      TimestampgetTimestamp(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Timestamp对象检索。

      TimestampgetTimestamp(String columnLabel, Calendar cal)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.sql.Timestamp对象检索。

      intgetType()

      检索此 ResultSet对象的类型。

      InputStreamgetUnicodeStream(int columnIndex)已弃用

      使用getCharacterStream代替getUnicodeStream

      InputStreamgetUnicodeStream(String columnLabel)已弃用

      使用getCharacterStream代替

      URLgetURL(int columnIndex)

      将该 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.net.URL对象检索。

      URLgetURL(String columnLabel)

      将此 ResultSet对象的当前行中指定列的值作为Java编程语言中的 java.net.URL对象检索。

      SQLWarninggetWarnings()

      检索通过此 ResultSet对象的呼叫报告的第一个警告。

      voidinsertRow()

      将插入行的内容插入到此 ResultSet对象中并进入数据库。

      booleanisAfterLast()

      检索光标是否在此 ResultSet对象中的最后一行之后。

      booleanisBeforeFirst()

      检索光标是否在此 ResultSet对象中的第一行之前。

      booleanisClosed()

      检索此 ResultSet对象是否已关闭。

      booleanisFirst()

      检索光标是否在此 ResultSet对象的第一行。

      booleanisLast()

      检索光标是否位于此 ResultSet对象的最后一行。

      booleanlast()

      将光标移动到此 ResultSet对象中的最后一行。

      voidmoveToCurrentRow()

      将光标移动到记住的光标位置,通常是当前行。

      voidmoveToInsertRow()

      将光标移动到插入行。

      booleannext()

      将光标从当前位置向前移动一行。

      booleanprevious()

      将光标移动到此 ResultSet对象中的上一行。

      voidrefreshRow()

      用数据库中最新的值刷新当前行。

      booleanrelative(int rows)

      将光标移动到正或负的相对行数。

      booleanrowDeleted()

      检索行是否被删除。

      booleanrowInserted()

      检索当前行是否有插入。

      booleanrowUpdated()

      检索当前行是否已更新。

      voidsetFetchDirection(int direction)

      给出这个 ResultSet对象中的行将被处理的方向的提示。

      voidsetFetchSize(int rows)

      给JDBC驱动程序一个提示,当这个 ResultSet对象需要更多的行时,应该从数据库中获取的行数。

      voidupdateArray(int columnIndex, Array x)

      使用 java.sql.Array值更新指定的列。

      voidupdateArray(String columnLabel, Array x)

      使用 java.sql.Array值更新指定的列。

      voidupdateAsciiStream(int columnIndex, InputStream x)

      使用ascii流值更新指定的列。

      voidupdateAsciiStream(int columnIndex, InputStream x, int length)

      使用ascii流值更新指定的列,该值将具有指定的字节数。

      voidupdateAsciiStream(int columnIndex, InputStream x, long length)

      使用ascii流值更新指定的列,该值将具有指定的字节数。

      voidupdateAsciiStream(String columnLabel, InputStream x)

      使用ascii流值更新指定的列。

      voidupdateAsciiStream(String columnLabel, InputStream x, int length)

      使用ascii流值更新指定的列,该值将具有指定的字节数。

      voidupdateAsciiStream(String columnLabel, InputStream x, long length)

      使用ascii流值更新指定的列,该值将具有指定的字节数。

      voidupdateBigDecimal(int columnIndex, BigDecimal x)

      使用 java.math.BigDecimal值更新指定的列。

      voidupdateBigDecimal(String columnLabel, BigDecimal x)

      使用 java.sql.BigDecimal值更新指定的列。

      voidupdateBinaryStream(int columnIndex, InputStream x)

      使用二进制流值更新指定的列。

      voidupdateBinaryStream(int columnIndex, InputStream x, int length)

      使用二进制流值更新指定的列,该值将具有指定的字节数。

      voidupdateBinaryStream(int columnIndex, InputStream x, long length)

      使用二进制流值更新指定的列,该值将具有指定的字节数。

      voidupdateBinaryStream(String columnLabel, InputStream x)

      使用二进制流值更新指定的列。

      voidupdateBinaryStream(String columnLabel, InputStream x, int length)

      使用二进制流值更新指定的列,该值将具有指定的字节数。

      voidupdateBinaryStream(String columnLabel, InputStream x, long length)

      使用二进制流值更新指定的列,该值将具有指定的字节数。

      voidupdateBlob(int columnIndex, Blob x)

      使用 java.sql.Blob值更新指定的列。

      voidupdateBlob(int columnIndex, InputStream inputStream)

      使用给定的输入流更新指定的列。

      voidupdateBlob(int columnIndex, InputStream inputStream, long length)

      使用给定的输入流更新指定列,该输入流将具有指定的字节数。

      voidupdateBlob(String columnLabel, Blob x)

      使用 java.sql.Blob值更新指定的列。

      voidupdateBlob(String columnLabel, InputStream inputStream)

      使用给定的输入流更新指定的列。

      voidupdateBlob(String columnLabel, InputStream inputStream, long length)

      使用给定的输入流更新指定列,该输入流将具有指定的字节数。

      voidupdateBoolean(int columnIndex, boolean x)

      使用 boolean值更新指定的列。

      voidupdateBoolean(String columnLabel, boolean x)

      使用 boolean值更新指定的列。

      voidupdateByte(int columnIndex, byte x)

      使用 byte值更新指定的列。

      voidupdateByte(String columnLabel, byte x)

      使用 byte值更新指定的列。

      voidupdateBytes(int columnIndex, byte[] x)

      使用 byte数组值更新指定的列。

      voidupdateBytes(String columnLabel, byte[] x)

      使用字节数组值更新指定的列。

      voidupdateCharacterStream(int columnIndex, Reader x)

      使用字符流值更新指定的列。

      voidupdateCharacterStream(int columnIndex, Reader x, int length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateCharacterStream(int columnIndex, Reader x, long length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateCharacterStream(String columnLabel, Reader reader)

      使用字符流值更新指定的列。

      voidupdateCharacterStream(String columnLabel, Reader reader, int length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateCharacterStream(String columnLabel, Reader reader, long length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateClob(int columnIndex, Clob x)

      使用 java.sql.Clob值更新指定的列。

      voidupdateClob(int columnIndex, Reader reader)

      使用给定的 Reader对象更新指定的列。

      voidupdateClob(int columnIndex, Reader reader, long length)

      使用给定的 Reader对象来更新指定的列,这是给定的长度的字符数。

      voidupdateClob(String columnLabel, Clob x)

      使用 java.sql.Clob值更新指定的列。

      voidupdateClob(String columnLabel, Reader reader)

      使用给定的 Reader对象更新指定的列。

      voidupdateClob(String columnLabel, Reader reader, long length)

      使用给定的 Reader对象更新指定的列,这是给定的长度的字符数。

      voidupdateDate(int columnIndex, Date x)

      使用 java.sql.Date值更新指定的列。

      voidupdateDate(String columnLabel, Date x)

      使用 java.sql.Date值更新指定的列。

      voidupdateDouble(int columnIndex, double x)

      使用 double值更新指定的列。

      voidupdateDouble(String columnLabel, double x)

      使用 double值更新指定的列。

      voidupdateFloat(int columnIndex, float x)

      使用 float值更新指定的列。

      voidupdateFloat(String columnLabel, float x)

      使用 float值更新指定的列。

      voidupdateInt(int columnIndex, int x)

      使用 int值更新指定的列。

      voidupdateInt(String columnLabel, int x)

      使用 int值更新指定的列。

      voidupdateLong(int columnIndex, long x)

      使用 long值更新指定的列。

      voidupdateLong(String columnLabel, long x)

      使用 long值更新指定的列。

      voidupdateNCharacterStream(int columnIndex, Reader x)

      使用字符流值更新指定的列。

      voidupdateNCharacterStream(int columnIndex, Reader x, long length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateNCharacterStream(String columnLabel, Reader reader)

      使用字符流值更新指定的列。

      voidupdateNCharacterStream(String columnLabel, Reader reader, long length)

      使用字符流值更新指定的列,该值将具有指定的字节数。

      voidupdateNClob(int columnIndex, NClob nClob)

      使用 java.sql.NClob值更新指定的列。

      voidupdateNClob(int columnIndex, Reader reader)

      使用给定的 Reader更新指定的列数据将从流中读取数据,直到达到流出端。

      voidupdateNClob(int columnIndex, Reader reader, long length)

      使用给定的 Reader对象更新指定的列,这是给定的字符数。

      voidupdateNClob(String columnLabel, NClob nClob)

      使用 java.sql.NClob值更新指定的列。

      voidupdateNClob(String columnLabel, Reader reader)

      使用给定的 Reader对象更新指定的列。

      voidupdateNClob(String columnLabel, Reader reader, long length)

      使用给定的 Reader对象更新指定的列,这是给定的长度的字符数。

      voidupdateNString(int columnIndex, String nString)

      使用 String值更新指定的列。

      voidupdateNString(String columnLabel, String nString)

      使用 String值更新指定的列。

      voidupdateNull(int columnIndex)

      使用 null值更新指定的列。

      voidupdateNull(String columnLabel)

      使用 null值更新指定的列。

      voidupdateObject(int columnIndex, Object x)

      使用 Object值更新指定的列。

      voidupdateObject(int columnIndex, Object x, int scaleOrLength)

      使用 Object值更新指定的列。

      default voidupdateObject(int columnIndex, Object x, SQLType targetSqlType)

      使用 Object值更新指定的列。

      default voidupdateObject(int columnIndex, Object x, SQLType targetSqlType, int scaleOrLength)

      使用 Object值更新指定的列。

      voidupdateObject(String columnLabel, Object x)

      使用 Object值更新指定的列。

      voidupdateObject(String columnLabel, Object x, int scaleOrLength)

      使用 Object值更新指定的列。

      default voidupdateObject(String columnLabel, Object x, SQLType targetSqlType)

      使用 Object值更新指定的列。

      default voidupdateObject(String columnLabel, Object x, SQLType targetSqlType, int scaleOrLength)

      使用 Object值更新指定的列。

      voidupdateRef(int columnIndex, Ref x)

      使用 java.sql.Ref值更新指定的列。

      voidupdateRef(String columnLabel, Ref x)

      使用 java.sql.Ref值更新指定的列。

      voidupdateRow()

      使用此 ResultSet对象的当前行的新内容更新底层数据库。

      voidupdateRowId(int columnIndex, RowId x)

      使用 RowId值更新指定的列。

      voidupdateRowId(String columnLabel, RowId x)

      使用 RowId值更新指定的列。

      voidupdateShort(int columnIndex, short x)

      使用 short值更新指定的列。

      voidupdateShort(String columnLabel, short x)

      使用 short值更新指定的列。

      voidupdateSQLXML(int columnIndex, SQLXML xmlObject)

      使用 java.sql.SQLXML值更新指定的列。

      voidupdateSQLXML(String columnLabel, SQLXML xmlObject)

      使用 java.sql.SQLXML值更新指定的列。

      voidupdateString(int columnIndex, String x)

      使用 String值更新指定的列。

      voidupdateString(String columnLabel, String x)

      使用 String值更新指定的列。

      voidupdateTime(int columnIndex, Time x)

      使用 java.sql.Time值更新指定的列。

      voidupdateTime(String columnLabel, Time x)

      使用 java.sql.Time值更新指定的列。

      voidupdateTimestamp(int columnIndex, Timestamp x)

      使用 java.sql.Timestamp值更新指定的列。

      voidupdateTimestamp(String columnLabel, Timestamp x)

      使用 java.sql.Timestamp值更新指定的列。

      booleanwasNull()

      报告最后一列读取的值是否为SQL NULL

5.4.2 管理连接、语句和结果集

在使用完ResultSet,Statement,Connection对象后,应立即调用close方法。

如果Statement上有一个打开的结果集,那么调用close方法将自动关闭该结果集。同样的,调用Connection的close方法将关闭该连接上的所有语句。

应该使用带资源的try语句块关闭链接,并使用一个单独的try/catch语句块处理异常。分离try程序快可以提高代码的可读性和可维护性。

5.4.3 分析SQL异常

每个SQLException都有一个由多个SQLException对象构成的链,这些对象可以通过getNextException获取。

java.sql.Exception:

java.sql.SQLWarning:

java.sql.DataTruncation:SQLWaring的子类当数据产生意外截断时,DataTruncation被当作异常抛出

    • Modifier and TypeMethod and Description
      intgetDataSize()

      获取应该传输的数据的字节数。

      intgetIndex()

      检索被截断的列或参数的索引。

      booleangetParameter()

      指示truncated的值是参数值还是列值。

      booleangetRead()

      指示值是否在读取时被截断。

      intgetTransferSize()

      获取实际传输的数据的字节数。

5.4.4 组装数据库

package exec;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.sql.*;

/**
 * Executes all SQL statements in a file. Call this program as <br>
 * java -classpath driverPath:. ExecSQL commandFile
 * 
 * @version 1.32 2016-04-27
 * @author Cay Horstmann
 */
class ExecSQL
{
   public static void main(String args[]) throws IOException
   {
      try (Scanner in = args.length == 0 ? new Scanner(System.in)
         : new Scanner(Paths.get(args[0]), "UTF-8"))
      {
         try (Connection conn = getConnection();
            Statement stat = conn.createStatement())
         {
            while (true)
            {
               if (args.length == 0) System.out.println("Enter command or EXIT to exit:");

               if (!in.hasNextLine()) return;
               
               String line = in.nextLine().trim();
               if (line.equalsIgnoreCase("EXIT")) return;
               if (line.endsWith(";")) // remove trailing semicolon
               {
                  line = line.substring(0, line.length() - 1);
               }
               try
               {
                  boolean isResult = stat.execute(line);
                  if (isResult)
                  {
                     try (ResultSet rs = stat.getResultSet())
                     {
                        showResultSet(rs);
                     }
                  }
                  else
                  {
                     int updateCount = stat.getUpdateCount();
                     System.out.println(updateCount + " rows updated");
                  }                   
               }
               catch (SQLException ex)
               {
                  for (Throwable e : ex)
                     e.printStackTrace();
               }
            }  
         }
      }
      catch (SQLException e)
      {
         for (Throwable t : e)
            t.printStackTrace();
      }
   }

   /**
    * Gets a connection from the properties specified in the file database.properties
    * @return the database connection
    */
   public static Connection getConnection() throws SQLException, IOException
   {
      Properties props = new Properties();
      try (InputStream in = Files.newInputStream(Paths.get("database.properties")))
      {
         props.load(in);
      }

      String drivers = props.getProperty("jdbc.drivers");
      if (drivers != null) System.setProperty("jdbc.drivers", drivers);

      String url = props.getProperty("jdbc.url");
      String username = props.getProperty("jdbc.username");
      String password = props.getProperty("jdbc.password");

      return DriverManager.getConnection(url, username, password);
   }

   /**
    * Prints a result set.
    * @param result the result set to be printed
    */
   public static void showResultSet(ResultSet result) throws SQLException
   {
      ResultSetMetaData metaData = result.getMetaData();
      int columnCount = metaData.getColumnCount();

      for (int i = 1; i <= columnCount; i++)
      {
         if (i > 1) System.out.print(", ");
         System.out.print(metaData.getColumnLabel(i));
      }
      System.out.println();

      while (result.next())
      {
         for (int i = 1; i <= columnCount; i++)
         {
            if (i > 1) System.out.print(", ");
            System.out.print(result.getString(i));
         }
         System.out.println();
      }
   }
}

5.5 执行查询操作

5.5.1 预备语句

/**
	 * 执行SQL语句,可以进行增、删、改的操作,不能执行查询
	 * 
	 * @param sql
	 *            预编译的 SQL 语句
	 * @param param
	 *            预编译的 SQL 语句中的‘?’参数的字符串数组
	 * @return 影响的条数
	 */
	public int executeSQL(String preparedSql, Object[] param) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int num = 0;

		/* 处理SQL,执行SQL */
		try {
			conn = getConn(); // 得到数据库连接
			pstmt = conn.prepareStatement(preparedSql); // 得到PreparedStatement对象
			if (param != null) {
				for (int i = 0; i < param.length; i++) {
					pstmt.setObject(i + 1, param[i]); // 为预编译sql设置参数
				}
			}
			// System.out.println(preparedSql);
			num = pstmt.executeUpdate(); // 执行SQL语句
		} catch (ClassNotFoundException e) {
			e.printStackTrace(); // 处理ClassNotFoundException异常
		} catch (SQLException e) {
			e.printStackTrace(); // 处理SQLException异常
		} finally {
			this.closeAll(conn, pstmt, null);
		}
		return num;
	}

通过实现准备好查询并多次重用它,我们就可以确保查询所需的步骤只被执行一次

在从一个查询到另一个查询的过程中,只需使用setXXX方法重新绑定那些需要改变的变量即可。

通常,使用数据库的查询代码要比Java程序好的多——这是数据库的一个重要有点。一般而言,可以使用SQL解决的问题,就不要使用Java程序。

package query;

import java.io.*;
import java.nio.file.*;
import java.sql.*;
import java.util.*;

/**
 * This program demonstrates several complex database queries.
 * @version 1.30 2012-06-05
 * @author Cay Horstmann
 */
public class QueryTest
{
   private static final String allQuery = "SELECT Books.Price, Books.Title FROM Books";

   private static final String authorPublisherQuery = "SELECT Books.Price, Books.Title"
         + " FROM Books, BooksAuthors, Authors, Publishers"
         + " WHERE Authors.Author_Id = BooksAuthors.Author_Id AND BooksAuthors.ISBN = Books.ISBN"
         + " AND Books.Publisher_Id = Publishers.Publisher_Id AND Authors.Name = ?"
         + " AND Publishers.Name = ?";

   private static final String authorQuery
      = "SELECT Books.Price, Books.Title FROM Books, BooksAuthors, Authors"
         + " WHERE Authors.Author_Id = BooksAuthors.Author_Id AND BooksAuthors.ISBN = Books.ISBN"
         + " AND Authors.Name = ?";

   private static final String publisherQuery
      = "SELECT Books.Price, Books.Title FROM Books, Publishers"
         + " WHERE Books.Publisher_Id = Publishers.Publisher_Id AND Publishers.Name = ?";


   private static final String priceUpdate = "UPDATE Books " + "SET Price = Price + ? "
         + " WHERE Books.Publisher_Id = (SELECT Publisher_Id FROM Publishers WHERE Name = ?)";

   private static Scanner in;
   private static ArrayList<String> authors = new ArrayList<>();
   private static ArrayList<String> publishers = new ArrayList<>();
   
   public static void main(String[] args) throws IOException
   {
      try (Connection conn = getConnection())
      {
         in = new Scanner(System.in);
         authors.add("Any");
         publishers.add("Any");
         try (Statement stat = conn.createStatement())
         {
            // Fill the authors array list
            String query = "SELECT Name FROM Authors";
            try (ResultSet rs = stat.executeQuery(query))
            {
               while (rs.next())
                  authors.add(rs.getString(1));
            }
               
            // Fill the publishers array list
            query = "SELECT Name FROM Publishers";
            try (ResultSet rs = stat.executeQuery(query))
            {
               while (rs.next())
                  publishers.add(rs.getString(1));
            }
         }
         boolean done = false;
         while (!done)
         {
            System.out.print("Q)uery C)hange prices E)xit: ");
            String input = in.next().toUpperCase();
            if (input.equals("Q"))
               executeQuery(conn);
            else if (input.equals("C"))
               changePrices(conn);
            else 
               done = true;
         }
      }
      catch (SQLException e)
      {
         for (Throwable t : e)
            System.out.println(t.getMessage());
      }
   }

   /**
    * Executes the selected query.
    * @param conn the database connection
    */
   private static void executeQuery(Connection conn) throws SQLException
   {
      String author = select("Authors:", authors);
      String publisher = select("Publishers:", publishers);
      PreparedStatement stat;
      if (!author.equals("Any") && !publisher.equals("Any"))
      {
         stat = conn.prepareStatement(authorPublisherQuery);
         stat.setString(1, author);
         stat.setString(2, publisher);
      }
      else if (!author.equals("Any") && publisher.equals("Any"))
      {
          stat = conn.prepareStatement(authorQuery);
          stat.setString(1, author);
      }
      else if (author.equals("Any") && !publisher.equals("Any"))
      {
          stat = conn.prepareStatement(publisherQuery);
          stat.setString(1, publisher);
      }
      else
         stat = conn.prepareStatement(allQuery);
      
      try (ResultSet rs = stat.executeQuery())
      {
         while (rs.next())
            System.out.println(rs.getString(1) + ", " + rs.getString(2));
      }
   }

   /**
    * Executes an update statement to change prices.
    * @param conn the database connection
    */
   public static void changePrices(Connection conn) throws SQLException
   {
      String publisher = select("Publishers:", publishers.subList(1, publishers.size()));
      System.out.print("Change prices by: ");
      double priceChange = in.nextDouble();
      PreparedStatement stat = conn.prepareStatement(priceUpdate);
      stat.setDouble(1, priceChange);
      stat.setString(2, publisher);
      int r = stat.executeUpdate();
      System.out.println(r + " records updated.");
   }
   
   /**
    * Asks the user to select a string.
    * @param prompt the prompt to display 
    * @param options the options from which the user can choose
    * @return the option that the user chose
    */
   public static String select(String prompt, List<String> options)
   {
      while (true)
      {
         System.out.println(prompt);     
         for (int i = 0; i < options.size(); i++)
            System.out.printf("%2d) %s%n", i + 1, options.get(i));
         int sel = in.nextInt();
         if (sel > 0 && sel <= options.size())
            return options.get(sel - 1);
      }      
   }

   /**
    * Gets a connection from the properties specified in the file database.properties.
    * @return the database connection
    */
   public static Connection getConnection() throws SQLException, IOException
   {
      Properties props = new Properties();
      try (InputStream in = Files.newInputStream(Paths.get("database.properties")))
      {
         props.load(in);
      }

      String drivers = props.getProperty("jdbc.drivers");
      if (drivers != null) System.setProperty("jdbc.drivers", drivers);
      String url = props.getProperty("jdbc.url");
      String username = props.getProperty("jdbc.username");
      String password = props.getProperty("jdbc.password");

      return DriverManager.getConnection(url, username, password);
   }
}

java.util.PreparedStatement:

    • Modifier and TypeMethod and Description
      voidaddBatch()

      向这个 PreparedStatement对象的一批命令添加一组参数。

      voidclearParameters()

      立即清除当前参数值。

      booleanexecute()

      执行此 PreparedStatement对象中的SQL语句,这可能是任何类型的SQL语句。

      default longexecuteLargeUpdate()

      执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERTUPDATEDELETE ; 或不返回任何内容的SQL语句,例如DDL语句。

      ResultSetexecuteQuery()

      执行此 PreparedStatement对象中的SQL查询,并返回查询 PreparedStatementResultSet对象。

      intexecuteUpdate()

      执行在该SQL语句PreparedStatement对象,它必须是一个SQL数据操纵语言(DML)语句,如INSERTUPDATEDELETE ; 或不返回任何内容的SQL语句,例如DDL语句。

      ResultSetMetaDatagetMetaData()

      检索一个 ResultSetMetaData对象,其中包含有关执行此 PreparedStatement对象时将返回的 ResultSet对象的列的信息。

      ParameterMetaDatagetParameterMetaData()

      检索此 PreparedStatement对象的参数的数量,类型和属性。

      voidsetArray(int parameterIndex, Array x)

      将指定的参数设置为给定的 java.sql.Array对象。

      voidsetAsciiStream(int parameterIndex, InputStream x)

      将指定的参数设置为给定的输入流。

      voidsetAsciiStream(int parameterIndex, InputStream x, int length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetAsciiStream(int parameterIndex, InputStream x, long length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetBigDecimal(int parameterIndex, BigDecimal x)

      将指定的参数设置为给定的 java.math.BigDecimal值。

      voidsetBinaryStream(int parameterIndex, InputStream x)

      将指定的参数设置为给定的输入流。

      voidsetBinaryStream(int parameterIndex, InputStream x, int length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetBinaryStream(int parameterIndex, InputStream x, long length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetBlob(int parameterIndex, Blob x)

      将指定的参数设置为给定的 java.sql.Blob对象。

      voidsetBlob(int parameterIndex, InputStream inputStream)

      将指定的参数设置为 InputStream对象。

      voidsetBlob(int parameterIndex, InputStream inputStream, long length)

      将指定的参数设置为 InputStream对象。

      voidsetBoolean(int parameterIndex, boolean x)

      将指定的参数设置为给定的Java boolean值。

      voidsetByte(int parameterIndex, byte x)

      将指定的参数设置为给定的Java byte值。

      voidsetBytes(int parameterIndex, byte[] x)

      将指定的参数设置为给定的Java字节数组。

      voidsetCharacterStream(int parameterIndex, Reader reader)

      将指定的参数设置为给定的 Reader对象。

      voidsetCharacterStream(int parameterIndex, Reader reader, int length)

      将指定的参数设置为给定的 Reader对象,这是给定的长度的字符数。

      voidsetCharacterStream(int parameterIndex, Reader reader, long length)

      将指定的参数设置为给定的 Reader对象,这是给定的长度的字符数。

      voidsetClob(int parameterIndex, Clob x)

      将指定的参数设置为给定的 java.sql.Clob对象。

      voidsetClob(int parameterIndex, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetClob(int parameterIndex, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetDate(int parameterIndex, Date x)

      使用运行应用程序的虚拟机的默认时区将指定的 java.sql.Date设置为给定的 java.sql.Date值。

      voidsetDate(int parameterIndex, Date x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Date值。

      voidsetDouble(int parameterIndex, double x)

      将指定的参数设置为给定的Java double值。

      voidsetFloat(int parameterIndex, float x)

      将指定的参数设置为给定的Java float值。

      voidsetInt(int parameterIndex, int x)

      将指定的参数设置为给定的Java int值。

      voidsetLong(int parameterIndex, long x)

      将指定的参数设置为给定的Java long值。

      voidsetNCharacterStream(int parameterIndex, Reader value)

      将指定的参数设置为 Reader对象。

      voidsetNCharacterStream(int parameterIndex, Reader value, long length)

      将指定的参数设置为 Reader对象。

      voidsetNClob(int parameterIndex, NClob value)

      将指定的参数设置为 java.sql.NClob对象。

      voidsetNClob(int parameterIndex, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetNClob(int parameterIndex, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetNString(int parameterIndex, String value)

      将指定的参数设置为给定的 String对象。

      voidsetNull(int parameterIndex, int sqlType)

      将指定的参数设置为SQL NULL

      voidsetNull(int parameterIndex, int sqlType, String typeName)

      将指定的参数设置为SQL NULL

      voidsetObject(int parameterIndex, Object x)

      使用给定对象设置指定参数的值。

      voidsetObject(int parameterIndex, Object x, int targetSqlType)

      使用给定对象设置指定参数的值。

      voidsetObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)

      使用给定对象设置指定参数的值。

      default voidsetObject(int parameterIndex, Object x, SQLType targetSqlType)

      使用给定对象设置指定参数的值。

      default voidsetObject(int parameterIndex, Object x, SQLType targetSqlType, int scaleOrLength)

      使用给定对象设置指定参数的值。

      voidsetRef(int parameterIndex, Ref x)

      将指定的参数设置为给定的 REF(<structured-type>)值。

      voidsetRowId(int parameterIndex, RowId x)

      将指定的参数设置为给定的 java.sql.RowId对象。

      voidsetShort(int parameterIndex, short x)

      将指定的参数设置为给定的Java short值。

      voidsetSQLXML(int parameterIndex, SQLXML xmlObject)

      将指定的参数设置为给定的 java.sql.SQLXML对象。

      voidsetString(int parameterIndex, String x)

      将指定的参数设置为给定的Java String值。

      voidsetTime(int parameterIndex, Time x)

      将指定的参数设置为给定的 java.sql.Time值。

      voidsetTime(int parameterIndex, Time x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Time值。

      voidsetTimestamp(int parameterIndex, Timestamp x)

      将指定的参数设置为给定的 java.sql.Timestamp值。

      voidsetTimestamp(int parameterIndex, Timestamp x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Timestamp值。

      voidsetUnicodeStream(int parameterIndex, InputStream x, int length)已弃用

      使用setCharacterStream

      voidsetURL(int parameterIndex, URL x)

      将指定的参数设置为给定的 java.net.URL值。

5.5.2  读写LOB

在SQL中,二进制大对象成为BLOB,字符型大对象称为CLOB

要从Blob中获取二进制数据,可以调用getBytes或getBinaryStream.例如,如果有一张保存图书封面图像的表,那么就可以像线面这样获取一张图像:

向mysql数据库传图片   这个是对的,能用

java.sql.Blob(Clob同理)

    • Modifier and TypeMethod and Description
      voidfree()

      该方法释放了 Blob对象并释放了它所拥有的资源。

      InputStreamgetBinaryStream()

      将此 Blob实例指定的 BLOB值作为流 Blob

      InputStreamgetBinaryStream(long pos, long length)

      返回包含部分 Blob值的 InputStream对象,从pos指定的字节开始,长度为长度字节。

      byte[]getBytes(long pos, int length)

      检索此 Blob对象所 BLOB BLOB的全部或部分值,作为字节数组。

      longlength()

      返回此 Blob对象指定的 BLOB值中的字节数。

      longposition(Blob pattern, long start)

      检索在该字节位置 BLOB通过该指定值 Blob对象在该 pattern开始。

      longposition(byte[] pattern, long start)

      检索指定字节数组 pattern在该 Blob对象表示的 BLOB值内开始的字节位置。

      OutputStreamsetBinaryStream(long pos)

      检索可用于写入此 Blob对象所代表的 BLOB值的流。

      intsetBytes(long pos, byte[] bytes)

      将给定的字节数组写入 Blob对象表示的 BLOB值,从位置 pos开始,并返回写入的字节数。

      intsetBytes(long pos, byte[] bytes, int offset, int len)

      将所有或部分给定的 byte数组写入该 Blob对象表示的 BLOB值,并返回写入的字节数。

      voidtruncate(long len)

      截断此 Blob对象表示的长度为 len个字节的 BLOB值。

5.5.3 SQL转义

 

5.5.4 多结果集

MYSQL存储过程

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

delimiter //
 create procedure X (IN n_id int)
 begin
     select * from test_table1 where id=1;
     select * from test_table2 where id=2;
     select * from test_table3 where id=3;
 end //
package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
		try {
			Connection conn=getConn();
			String sql = "{call x(3)}";  //SQL转义
			CallableStatement stmt=conn.prepareCall(sql);
			boolean isResult = stmt.execute();
			boolean done = false;
			while(!done) {
				if(isResult) {
					ResultSet rs=stmt.getResultSet();
					while(rs.next()) {
						System.out.println(rs.getString("id"));
					}
				}else {
					int updateCount= stmt.getUpdateCount();
					if(updateCount>=0) {
						
					}else {
						done=true;
					}
				}
				if(!done) {
					isResult=stmt.getMoreResults();
				}
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

5.5.5 获取自动生成的键

package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				Statement stmt = conn.createStatement();
				String sql="insert into person(password) values('123456')";
				stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

5.6 可滚动和可更新的结果集

 

5.6.1 可滚动的结果集

package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
				String sql="select * from person";
				ResultSet rs=stmt.executeQuery(sql);
				rs.absolute(3);  //定位到第三行
				int currentRow=rs.getRow();  //得到当前行
				System.out.println(rs.getInt(1)+"  "+currentRow);
				rs.previous();   //向行数小走一行
				System.out.println(rs.getInt(1)+"  "+currentRow);
				rs.relative(2);    //向行数大走两行
				System.out.println(rs.getInt(1)+"  "+currentRow);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

5.6.2  可更新的结果集

可更新的结果集并非必须是可滚动的。

package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
				String sql="select * from person";
				ResultSet rs=stmt.executeQuery(sql);
				rs.next();
				rs.updateString("password", "nihao");
				rs.updateRow();   //更新
				
				rs.absolute(3);
				
				rs.deleteRow();  //删除
				
				rs.moveToInsertRow(); //插入(插到了尾部,事实上是移动到插入行)
				rs.updateString(2, "hellowprld");
				rs.insertRow();
				rs.moveToCurrentRow();
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

5.7 行集

可滚动的结果集虽然功能强大,但是在于用户交互的整个过程中,必须始终与数据库保持连接。

我们可以使用行集。RowSet接口扩展自ResultSet接口,却无需始终保持与数据库的连接。

行集还适用于将查询结果移动到复杂应用的其它层,或者是诸如手机之类的其它设备中。

5.7.1 构建行集

5.7.2 被缓冲的行集

一个被缓冲的行集中包含了一个结果集中所有的数据。

				Connection conn=getConn();
				Statement stmt = conn.createStatement();
				String sql="select * from person";
				ResultSet rs=stmt.executeQuery(sql);
				//获取行集的标准方式
				RowSetFactory factory = RowSetProvider.newFactory();
				CachedRowSet crs = factory.createCachedRowSet();
				//使用一个结果集填充CachedRowSet对象
				crs.populate(rs);
				conn.close();
				//CachedRowSet是ResultSet的子接口,可以像使用ResultSet一样使用
				while(crs.next()) {
					System.out.println(crs.getInt(1));
				}

也可以让CachedRowSet对象自动建立一个数据库连接:

package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;


import javax.imageio.ImageIO;
import javax.sql.rowset.*;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				//获取行集的标准方式
				RowSetFactory factory = RowSetProvider.newFactory();
				CachedRowSet crs = factory.createCachedRowSet();
				/**
				 * CachedRowSet自动建立一个数据库连接
				 */
				//设置数据库参数
				crs.setUrl(BaseDao.URL);
				crs.setUsername(BaseDao.DBNAME);
				crs.setPassword(BaseDao.DBPASS);
				//设置查询语句和所有参数
				crs.setCommand("select * from person where id=?");
				crs.setInt(1, 1);
				//将查询结果田中到行集
				crs.execute();
				/**
				 * CachedRowSet是ResultSet的子接口,可以像使用ResultSet一样使用
				 */
				while(crs.next()) {
					System.out.println(crs.getInt(1));
				}
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}
package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;


import javax.imageio.ImageIO;
import javax.sql.rowset.*;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				//获取行集的标准方式
				RowSetFactory factory = RowSetProvider.newFactory();
				CachedRowSet crs = factory.createCachedRowSet();
				/**
				 * CachedRowSet自动建立一个数据库连接
				 */
				//设置数据库参数
				crs.setUrl(BaseDao.URL);
				crs.setUsername(BaseDao.DBNAME);
				crs.setPassword(BaseDao.DBPASS);
				//设置查询语句和所有参数
				crs.setCommand("select * from person where id=?");
				crs.setPageSize(1);  //有的时候,查询结果非常大,指定每一页的尺寸。
				crs.setInt(1, 1);
				//将查询结果田中到行集
				crs.execute();
				crs.nextPage();  //获得下一批数据
				//如果修改了行集中的内容,必须调用一下方法将修改写回到数据库中
				crs.acceptChanges(conn);
				//或
				crs.acceptChanges();//只有在行集中设置了数据库参数时才有效
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

java.sql.RowSet:

    • Modifier and TypeMethod and Description
      voidaddRowSetListener(RowSetListener listener)

      注册给定的侦听器,以便将通知发生在此 RowSet对象上的事件。

      voidclearParameters()

      清除为此 RowSet对象的命令设置的参数。

      voidexecute()

      用数据填充这个 RowSet对象。

      StringgetCommand()

      检索此 RowSet对象的命令属性。

      StringgetDataSourceName()

      检索标识此 RowSet对象的数据源的逻辑名称。

      booleangetEscapeProcessing()

      检索是否为此 RowSet对象启用了转义处理。

      intgetMaxFieldSize()

      检索某些列值可能返回的最大字节数。

      intgetMaxRows()

      检索此 RowSet对象可以包含的最大行数。

      StringgetPassword()

      检索用于创建数据库连接的密码。

      intgetQueryTimeout()

      检索驱动程序等待语句执行的最大秒数。

      intgetTransactionIsolation()

      检索为此 RowSet对象设置的事务隔离级别。

      Map<String,<?>>getTypeMap()

      检索与此 RowSet对象关联的 Map对象,该对象指定SQL用户定义类型的自定义映射(如果有)。

      StringgetUrl()

      检索此 RowSet对象将用于创建连接的url属性,如果使用 DriverManager而不是 DataSource对象来建立连接。

      StringgetUsername()

      检索用于创建此 RowSet对象的数据库连接的用户名。

      booleanisReadOnly()

      检索此 RowSet对象是否为只读。

      voidremoveRowSetListener(RowSetListener listener)

      从在 RowSet对象发生事件时将被通知的组件列表中删除指定的侦听器。

      voidsetArray(int i, Array x)

      使用给定的 Array值设置此 RowSet对象的命令中的指定 Array

      voidsetAsciiStream(int parameterIndex, InputStream x)

      将此 RowSet对象的命令中的指定参数设置为给定的输入流。

      voidsetAsciiStream(int parameterIndex, InputStream x, int length)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.io.InputStream值。

      voidsetAsciiStream(String parameterName, InputStream x)

      将指定的参数设置为给定的输入流。

      voidsetAsciiStream(String parameterName, InputStream x, int length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetBigDecimal(int parameterIndex, BigDecimal x)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.math.BigDeciaml值。

      voidsetBigDecimal(String parameterName, BigDecimal x)

      将指定的参数设置为给定的 java.math.BigDecimal值。

      voidsetBinaryStream(int parameterIndex, InputStream x)

      将此 RowSet对象的命令中的指定参数设置为给定的输入流。

      voidsetBinaryStream(int parameterIndex, InputStream x, int length)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.io.InputStream值。

      voidsetBinaryStream(String parameterName, InputStream x)

      将指定的参数设置为给定的输入流。

      voidsetBinaryStream(String parameterName, InputStream x, int length)

      将指定的参数设置为给定的输入流,它将具有指定的字节数。

      voidsetBlob(int i, Blob x)

      使用给定的 Blob值在此 RowSet对象的命令中设置指定的 Blob

      voidsetBlob(int parameterIndex, InputStream inputStream)

      将指定的参数设置为 InputStream对象。

      voidsetBlob(int parameterIndex, InputStream inputStream, long length)

      将指定的参数设置为 InputStream对象。

      voidsetBlob(String parameterName, Blob x)

      将指定的参数设置为给定的 java.sql.Blob对象。

      voidsetBlob(String parameterName, InputStream inputStream)

      将指定的参数设置为 InputStream对象。

      voidsetBlob(String parameterName, InputStream inputStream, long length)

      将指定的参数设置为 InputStream对象。

      voidsetBoolean(int parameterIndex, boolean x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java boolean值。

      voidsetBoolean(String parameterName, boolean x)

      将指定的参数设置为给定的Java boolean值。

      voidsetByte(int parameterIndex, byte x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java byte值。

      voidsetByte(String parameterName, byte x)

      将指定的参数设置为给定的Java byte值。

      voidsetBytes(int parameterIndex, byte[] x)

      将此 RowSet对象的命令中的指定参数设置为给定的 byte Java数组。

      voidsetBytes(String parameterName, byte[] x)

      将指定的参数设置为给定的Java字节数组。

      voidsetCharacterStream(int parameterIndex, Reader reader)

      将此 RowSet对象的命令中的指定参数设置为给定的 Reader对象。

      voidsetCharacterStream(int parameterIndex, Reader reader, int length)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.io.Reader值。

      voidsetCharacterStream(String parameterName, Reader reader)

      将指定的参数设置为给定的 Reader对象。

      voidsetCharacterStream(String parameterName, Reader reader, int length)

      将指定的参数设置为给定的 Reader对象,这是给定的长度的字符数。

      voidsetClob(int i, Clob x)

      使用给定的 Clob值设置此 RowSet对象的命令中的指定 Clob

      voidsetClob(int parameterIndex, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetClob(int parameterIndex, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetClob(String parameterName, Clob x)

      将指定的参数设置为给定的 java.sql.Clob对象。

      voidsetClob(String parameterName, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetClob(String parameterName, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetCommand(String cmd)

      将此 RowSet对象的命令属性设置为给定的SQL查询。

      voidsetConcurrency(int concurrency)

      将此 RowSet对象的并发设置为给定的并发级别。

      voidsetDataSourceName(String name)

      将此 RowSet对象的数据源名称属性设置为给定的 String

      voidsetDate(int parameterIndex, Date x)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.sql.Date值。

      voidsetDate(int parameterIndex, Date x, Calendar cal)

      使用给定的 java.sql.Date值设置此 RowSet对象的命令中的指定 java.sql.Date

      voidsetDate(String parameterName, Date x)

      使用运行应用程序的虚拟机的默认时区将指定的 java.sql.Date设置为给定的 java.sql.Date值。

      voidsetDate(String parameterName, Date x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Date值。

      voidsetDouble(int parameterIndex, double x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java double值。

      voidsetDouble(String parameterName, double x)

      将指定的参数设置为给定的Java double值。

      voidsetEscapeProcessing(boolean enable)

      设置此 RowSet对象的转义处理开启或关闭。

      voidsetFloat(int parameterIndex, float x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java float值。

      voidsetFloat(String parameterName, float x)

      将指定的参数设置为给定的Java float值。

      voidsetInt(int parameterIndex, int x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java int值。

      voidsetInt(String parameterName, int x)

      将指定的参数设置为给定的Java int值。

      voidsetLong(int parameterIndex, long x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java long值。

      voidsetLong(String parameterName, long x)

      将指定的参数设置为给定的Java long值。

      voidsetMaxFieldSize(int max)

      将列值返回的最大字节数设置为给定的字节数。

      voidsetMaxRows(int max)

      将此 RowSet对象的最大行数设置为指定的数字。

      voidsetNCharacterStream(int parameterIndex, Reader value)

      将此 RowSet对象的命令中的 Reader参数设置为 Reader对象。

      voidsetNCharacterStream(int parameterIndex, Reader value, long length)

      将指定的参数设置为 Reader对象。

      voidsetNCharacterStream(String parameterName, Reader value)

      将指定的参数设置为 Reader对象。

      voidsetNCharacterStream(String parameterName, Reader value, long length)

      将指定的参数设置为 Reader对象。

      voidsetNClob(int parameterIndex, NClob value)

      将指定的参数设置为 java.sql.NClob对象。

      voidsetNClob(int parameterIndex, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetNClob(int parameterIndex, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetNClob(String parameterName, NClob value)

      将指定的参数设置为 java.sql.NClob对象。

      voidsetNClob(String parameterName, Reader reader)

      将指定的参数设置为 Reader对象。

      voidsetNClob(String parameterName, Reader reader, long length)

      将指定的参数设置为 Reader对象。

      voidsetNString(int parameterIndex, String value)

      将指定的参数设置为给定的 String对象。

      voidsetNString(String parameterName, String value)

      将指定的参数设置为给定的 String对象。

      voidsetNull(int parameterIndex, int sqlType)

      将此 RowSet对象的SQL命令中的指定参数设置为SQL NULL

      voidsetNull(int paramIndex, int sqlType, String typeName)

      将此 RowSet对象的SQL命令中的指定参数设置为SQL NULL

      voidsetNull(String parameterName, int sqlType)

      将指定的参数设置为SQL NULL

      voidsetNull(String parameterName, int sqlType, String typeName)

      将指定的参数设置为SQL NULL

      voidsetObject(int parameterIndex, Object x)

      使用Java Object设置此 RowSet对象的命令中的 Object

      voidsetObject(int parameterIndex, Object x, int targetSqlType)

      使用Java Object设置此 RowSet对象的命令中的 Object

      voidsetObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)

      使用给定的Java Object在此 RowSet对象的命令中设置指定的 Object

      voidsetObject(String parameterName, Object x)

      使用给定对象设置指定参数的值。

      voidsetObject(String parameterName, Object x, int targetSqlType)

      使用给定对象设置指定参数的值。

      voidsetObject(String parameterName, Object x, int targetSqlType, int scale)

      使用给定对象设置指定参数的值。

      voidsetPassword(String password)

      RowSet对象的数据库密码设置为给定的 String

      voidsetQueryTimeout(int seconds)

      设置驱动程序等待语句执行到给定秒数的最长时间。

      voidsetReadOnly(boolean value)

      设置此 RowSet对象是否为只读给定的 boolean

      voidsetRef(int i, Ref x)

      使用给定的 Ref值设置此 RowSet对象的命令中的指定 Ref

      voidsetRowId(int parameterIndex, RowId x)

      将指定的参数设置为给定的 java.sql.RowId对象。

      voidsetRowId(String parameterName, RowId x)

      将指定的参数设置为给定的 java.sql.RowId对象。

      voidsetShort(int parameterIndex, short x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java short值。

      voidsetShort(String parameterName, short x)

      将指定的参数设置为给定的Java short值。

      voidsetSQLXML(int parameterIndex, SQLXML xmlObject)

      将指定的参数设置为给定的 java.sql.SQLXML对象。

      voidsetSQLXML(String parameterName, SQLXML xmlObject)

      将指定的参数设置为给定的 java.sql.SQLXML对象。

      voidsetString(int parameterIndex, String x)

      将此 RowSet对象的命令中的指定参数设置为给定的Java String值。

      voidsetString(String parameterName, String x)

      将指定的参数设置为给定的Java String值。

      voidsetTime(int parameterIndex, Time x)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.sql.Time值。

      voidsetTime(int parameterIndex, Time x, Calendar cal)

      使用给定的 java.sql.Time值在此 RowSet对象的命令中设置指定的 java.sql.Time

      voidsetTime(String parameterName, Time x)

      将指定的参数设置为给定的 java.sql.Time值。

      voidsetTime(String parameterName, Time x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Time值。

      voidsetTimestamp(int parameterIndex, Timestamp x)

      将此 RowSet对象的命令中的指定参数设置为给定的 java.sql.Timestamp值。

      voidsetTimestamp(int parameterIndex, Timestamp x, Calendar cal)

      使用给定的 java.sql.Timestamp值在此 RowSet对象的命令中设置指定的 java.sql.Timestamp

      voidsetTimestamp(String parameterName, Timestamp x)

      将指定的参数设置为给定的 java.sql.Timestamp值。

      voidsetTimestamp(String parameterName, Timestamp x, Calendar cal)

      使用给定的 Calendar对象将指定的 Calendar设置为给定的 java.sql.Timestamp值。

      voidsetTransactionIsolation(int level)

      设置此 RowSet对象的事务隔离级别。

      voidsetType(int type)

      将此 RowSet对象的类型设置为给定类型。

      voidsetTypeMap(Map<String,<?>> map)

      安装给定 java.util.Map对象的默认类型映射此 RowSet对象。

      voidsetURL(int parameterIndex, URL x)

      将指定的参数设置为给定的 java.net.URL值。

      voidsetUrl(String url)

      设置 RowSet对象在使用 DriverManager创建连接时将使用的URL。

      voidsetUsername(String name)

      将此 RowSet对象的用户名属性设置为给定的 String

java.sql.rowset.CachedRowSet:

    • Modifier and TypeMethod and Description
      voidacceptChanges()

      传播行更新,插入和删除对此 CachedRowSet对象的更改对基础数据源。

      voidacceptChanges(Connection con)

      使用指定的 Connection对象传播所有行更新,插入和删除对此 CachedRowSet对象的数据源的更改,以建立与数据源的连接。

      booleancolumnUpdated(int idx)

      指示此 CachedRowSet对象的当前行中的指定列是否已更新。

      booleancolumnUpdated(String columnName)

      指示此 CachedRowSet对象当前行中的指定列是否已更新。

      voidcommit()

      每个 CachedRowSet对象的 SyncProvider包含一个 Connection对象从 ResultSet或JDBC属性传递给它的构造函数。

      CachedRowSetcreateCopy()

      创建一个 RowSet对象,该对象是此 CachedRowSet对象中的数据的深层副本。

      CachedRowSetcreateCopyNoConstraints()

      创建一个 CachedRowSet对象,这是该 CachedRowSet对象的数据的深层副本,但是与之无关。

      CachedRowSetcreateCopySchema()

      创建一个 CachedRowSet对象,该对象是此 CachedRowSet对象的空白副本。

      RowSetcreateShared()

      返回一个新 RowSet通过相同的数据与此的支持对象 CachedRowSet对象。

      voidexecute(Connection conn)

      用数据填充此 CachedRowSet对象,使用给定的连接生成将从中读取数据的结果集。

      int[]getKeyColumns()

      返回一个数组,其中包含一个或多个列号,表示形成唯一标识此 CachedRowSet对象行的键的列。

      ResultSetgetOriginal()

      返回一个 ResultSetCachedRowSet对象的原始值的 CachedRowSet对象。

      ResultSetgetOriginalRow()

      返回一个 ResultSet对象,该对象只包含此 CachedRowSet对象的当前行的原始值。

      intgetPageSize()

      返回 CachedRowSet对象的页面大小

      RowSetWarninggetRowSetWarnings()

      检索此 RowSet对象上的呼叫报告的第一个警告。

      booleangetShowDeleted()

      检索一个 boolean指示标记为删除的行是否显示在当前行的集合中。

      SyncProvidergetSyncProvider()

      检索 SyncProvider执行此 CachedRowSet对象。

      StringgetTableName()

      返回用于创建此 CachedRowSet对象的对象(表)的 CachedRowSet

      booleannextPage()

      递增的当前页 CachedRowSet

      voidpopulate(ResultSet data)

      填充此 CachedRowSet从给定数据对象 ResultSet对象。

      voidpopulate(ResultSet rs, int startRow)

      填充此 CachedRowSet从给定数据对象 ResultSet对象。

      booleanpreviousPage()

      递减的当前页 CachedRowSet

      voidrelease()

      释放此 CachedRowSet对象的当前内容,并向所有注册的监听器发送一个 rowSetChanged事件。

      voidrestoreOriginal()

      将此 CachedRowSet对象恢复为其原始值,即其最后一组更改前的值。

      voidrollback()

      每个 CachedRowSet对象的 SyncProvider包含一个 Connection对象,从原始的 ResultSet或传递给它的JDBC属性。

      voidrollback(Savepoint s)

      每个 CachedRowSet对象的 SyncProvider包含来自原始 ResultSet或传递给它的JDBC属性的 Connection对象。

      voidrowSetPopulated(RowSetEvent event, int numRows)

      通知已注册的侦听器给定的RowSetEvent对象中的RowSet对象已经填充了许多其他行。

      voidsetKeyColumns(int[] keys)

      使用给定的列号数组来设置此 CachedRowSet对象的 keyCols字段,该列表形成唯一标识此 CachedRowSet对象中的行的键。

      voidsetMetaData(RowSetMetaData md)

      使用给定的 RowSetMetaData对象设置此 CachedRowSet对象的元数据。

      voidsetOriginalRow()

      将此 CachedRowSet对象中的当前行设置为原始行。

      voidsetPageSize(int size)

      设置 CachedRowSet对象的页面大小。

      voidsetShowDeleted(boolean b)

      将属性 showDeleted设置为给定的 boolean值,该值确定标记为删除的行是否显示在当前行的集合中。

      voidsetSyncProvider(String provider)

      设置 SyncProvider此对象 CachedRowSet对象到指定的一个。

      voidsetTableName(String tabName)

      设置此 CachedRowSet对象派生到给定表名称的表的标识符。

      intsize()

      返回此 CachedRowSet对象中的行数。

      Collection<?>toCollection()

      这个转换 CachedRowSet对象为 Collection包含所有这些对象 CachedRowSet对象的数据。

      Collection<?>toCollection(int column)

      将此 CachedRowSet对象中的指定列转换为 Collection对象。

      Collection<?>toCollection(String column)

      将此 CachedRowSet对象中的指定列转换为 Collection对象。

      voidundoDelete()

      取消删除当前行并通知侦听器行已更改。

      voidundoInsert()

      如果已插入该行,则 CachedRowSet从当前行删除该对象,并通知侦听器行已更改。

      voidundoUpdate()

      如果该行已被修改,立即反转最后一次更新操作。

java.sql.rowset.RowSetProvider:

5.3 元数据

第二个元数据接口ResultSetMedaData则用于提供结果集的相关信息。

例:

package view;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.nio.file.*;
import java.sql.*;
import java.util.*;

import javax.sql.*;
import javax.sql.rowset.*;
import javax.swing.*;

/**
 * This program uses metadata to display arbitrary tables in a database.
 * @version 1.33 2016-04-27
 * @author Cay Horstmann
 */
public class ViewDB
{
   public static void main(String[] args)
   {
      EventQueue.invokeLater(() ->
         {
            JFrame frame = new ViewDBFrame();
            frame.setTitle("ViewDB");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
         });
   }
}

/**
 * The frame that holds the data panel and the navigation buttons.
 */
class ViewDBFrame extends JFrame
{
   private JButton previousButton;
   private JButton nextButton;
   private JButton deleteButton;
   private JButton saveButton;
   private DataPanel dataPanel;
   private Component scrollPane;
   private JComboBox<String> tableNames;
   private Properties props;
   private CachedRowSet crs;
   private Connection conn;

   public ViewDBFrame()
   {
      tableNames = new JComboBox<String>();

      try
      {
         readDatabaseProperties();
         conn = getConnection();
         DatabaseMetaData meta = conn.getMetaData();
         try (ResultSet mrs = meta.getTables(null, null, null, new String[] { "TABLE" }))
         {
            while (mrs.next())
               tableNames.addItem(mrs.getString(3));
         }
      }
      catch (SQLException ex)
      {
         for (Throwable t : ex)
            t.printStackTrace();
      }
      catch (IOException ex)
      {
         ex.printStackTrace();
      }

      tableNames.addActionListener(
         event -> showTable((String) tableNames.getSelectedItem(), conn));
      add(tableNames, BorderLayout.NORTH);
      addWindowListener(new WindowAdapter()
         {
            public void windowClosing(WindowEvent event)
            {
               try
               {
                  if (conn != null) conn.close();
               }
               catch (SQLException ex)
               {
                  for (Throwable t : ex)
                     t.printStackTrace();
               }               
            }
         });

      JPanel buttonPanel = new JPanel();
      add(buttonPanel, BorderLayout.SOUTH);

      previousButton = new JButton("Previous");
      previousButton.addActionListener(event -> showPreviousRow());
      buttonPanel.add(previousButton);

      nextButton = new JButton("Next");
      nextButton.addActionListener(event -> showNextRow());
      buttonPanel.add(nextButton);

      deleteButton = new JButton("Delete");
      deleteButton.addActionListener(event -> deleteRow());
      buttonPanel.add(deleteButton);

      saveButton = new JButton("Save");
      saveButton.addActionListener(event -> saveChanges());
      buttonPanel.add(saveButton);
      if (tableNames.getItemCount() > 0)
         showTable(tableNames.getItemAt(0), conn);
   }

   /**
    * Prepares the text fields for showing a new table, and shows the first row.
    * @param tableName the name of the table to display
    * @param conn the database connection
    */
   public void showTable(String tableName, Connection conn)
   {
      try (Statement stat = conn.createStatement();
         ResultSet result = stat.executeQuery("SELECT * FROM " + tableName))
      {
         // get result set
         
         // copy into cached row set
         RowSetFactory factory = RowSetProvider.newFactory();            
         crs = factory.createCachedRowSet();
         crs.setTableName(tableName);
         crs.populate(result);            

         if (scrollPane != null) remove(scrollPane);
         dataPanel = new DataPanel(crs);
         scrollPane = new JScrollPane(dataPanel);
         add(scrollPane, BorderLayout.CENTER);
         pack();
         showNextRow();
      }
      catch (SQLException ex)
      {
         for (Throwable t : ex)
            t.printStackTrace();
      }
   }

   /**
    * Moves to the previous table row.
    */
   public void showPreviousRow()
   {
      try
      {
         if (crs == null || crs.isFirst()) return;
         crs.previous();
         dataPanel.showRow(crs);
      }
      catch (SQLException ex)
      {
         for (Throwable t : ex)
            t.printStackTrace();
      }
   }

   /**
    * Moves to the next table row.
    */
   public void showNextRow()
   {
      try
      {
         if (crs == null || crs.isLast()) return;
         crs.next();
         dataPanel.showRow(crs);
      }
      catch (SQLException ex)
      {
         for (Throwable t : ex)
            t.printStackTrace();
      }
   }

   /**
    * Deletes current table row.
    */
   public void deleteRow()
   {
      if (crs == null) return;
      new SwingWorker<Void, Void>()
      {
         public Void doInBackground() throws SQLException
         {
            crs.deleteRow();
            crs.acceptChanges(conn);               
            if (crs.isAfterLast()) 
               if (!crs.last()) crs = null;
            return null;
         }
         public void done()
         {
            dataPanel.showRow(crs);
         }
      }.execute();
   }
   /**
    * Saves all changes.
    */
   public void saveChanges()
   {
      if (crs == null) return;
      new SwingWorker<Void, Void>()
      {
         public Void doInBackground() throws SQLException
         {
            dataPanel.setRow(crs);
            crs.acceptChanges(conn);
            return null;
         }
      }.execute();      
   }

   private void readDatabaseProperties() throws IOException
   {
      props = new Properties();
      try (InputStream in = Files.newInputStream(Paths.get("database.properties")))
      {
         props.load(in);
      }
      String drivers = props.getProperty("jdbc.drivers");
      if (drivers != null) System.setProperty("jdbc.drivers", drivers);
   }
   
   /**
    * Gets a connection from the properties specified in the file database.properties.
    * @return the database connection
    */
   private Connection getConnection() throws SQLException
   {
      String url = props.getProperty("jdbc.url");
      String username = props.getProperty("jdbc.username");
      String password = props.getProperty("jdbc.password");

      return DriverManager.getConnection(url, username, password);
   }
}

/**
 * This panel displays the contents of a result set.
 */
class DataPanel extends JPanel
{
   private java.util.List<JTextField> fields;

   /**
    * Constructs the data panel.
    * @param rs the result set whose contents this panel displays
    */
   public DataPanel(RowSet rs) throws SQLException
   {
      fields = new ArrayList<>();
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridwidth = 1;
      gbc.gridheight = 1;

      ResultSetMetaData rsmd = rs.getMetaData();
      for (int i = 1; i <= rsmd.getColumnCount(); i++)
      {
         gbc.gridy = i - 1;

         String columnName = rsmd.getColumnLabel(i);
         gbc.gridx = 0;
         gbc.anchor = GridBagConstraints.EAST;
         add(new JLabel(columnName), gbc);

         int columnWidth = rsmd.getColumnDisplaySize(i);
         JTextField tb = new JTextField(columnWidth);
         if (!rsmd.getColumnClassName(i).equals("java.lang.String"))
            tb.setEditable(false);
               
         fields.add(tb);

         gbc.gridx = 1;
         gbc.anchor = GridBagConstraints.WEST;
         add(tb, gbc);
      }
   }

   /**
    * Shows a database row by populating all text fields with the column values.
    */
   public void showRow(ResultSet rs)
   {
      try
      {
         if (rs == null) return;
         for (int i = 1; i <= fields.size(); i++)
         {
            String field = rs == null ? "" : rs.getString(i);
            JTextField tb = fields.get(i - 1);
            tb.setText(field);
         }
      }
      catch (SQLException ex)
      {
         for (Throwable t : ex)
            t.printStackTrace();
      }
   }
   
   /**
    * Updates changed data into the current row of the row set.
    */
   public void setRow(RowSet rs) throws SQLException
   {
      for (int i = 1; i <= fields.size(); i++)
      {
         String field = rs.getString(i);
         JTextField tb = fields.get(i - 1);
         if (!field.equals(tb.getText()))
            rs.updateString(i, tb.getText());
      }
      rs.updateRow();
   }
}

java.sql.DatabaseMetaData:很多数据库的信息

java.sql.ResultSetNetaData:很多结果集的信息

5.9 事务

将多个语句组合成事务的主要原因是为了确保数据库完整性

5.9.1 用JDBC对事务编程

package Section5;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.*;
import java.sql.*;


import javax.imageio.ImageIO;
import javax.sql.rowset.*;
import javax.swing.ImageIcon;
/**
 * 连接测试
 * @author Roy wang
 *
 */
public class testDao extends BaseDao{
	public testDao() throws IOException {
	
			try {
				Connection conn=getConn();
				conn.setAutoCommit(false);
				Statement stat = conn.createStatement();
				
				stat.executeUpdate("update person set password='hello' where id=1");
				stat.executeUpdate("update person set password='hello' where id=1");
				stat.executeUpdate("update person set password='hello9' where id=1");
				
				//conn.commit();//事务提交
				conn.rollback(); // 事务回滚
				
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch(SQLException e) {
				e.printStackTrace();
			}
			
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			new testDao();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}

}

这样,程序将自动撤销自上次提交以来的所有语句。当事务被SQLException中断时,典型的方法就是发起回滚。

5.9.2 保存点

				Connection conn=getConn();
				conn.setAutoCommit(false);
				Statement stat = conn.createStatement();
				
				stat.executeUpdate("update person set password='h1' where id=1");
				Savepoint svpt = conn.setSavepoint();   //设置保存点
				stat.executeUpdate("update person set password='h2' where id=1");
				
				if(true)
					conn.rollback(svpt);
				conn.releaseSavepoint(svpt);
				conn.commit();//事务提交
				//conn.rollback(); // 事务回滚

5.9.3 批量更新

在使用批量更新时,一个语句序列作为一批操作同时被提交和收集

Connection conn=getConn();
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.createStatement();
String command1="create table t1(id int)";
String command2="create table t2(id int)";
String command3="create table t3(id int)";
stat.addBatch(command1);
stat.addBatch(command2);
stat.addBatch(command3);
int[] counts= stat.executeBatch();
conn.commit();
conn.setAutoCommit(autoCommit);

interface java.sql.Savepoint:

    • Modifier and TypeMethod and Description
      intgetSavepointId()

      检索此 Savepoint对象所代表的保存点的生成ID。

      StringgetSavepointName()

      检索此 Savepoint对象所代表的保存点的名称。

5.10 高级SQL类型

5.11 Web与企业应用中的链接管理

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值