日期:2014-05-16  浏览次数:20462 次

JDBC备忘录5_核心接口

核心接口

(1)Connection
(2)Statement/PreparedStatement/CallableStatement
(3)ResultSet

?

Connection接口作用:
(1)获取数据库的基本信息;
(2)连接控制;
(3)事务控制;
(4)创建数据库对象;

		Connection conn = JdbcUtils.getConnection();
		
		//连接控制
		conn.isClosed();
		conn.isReadOnly();
		conn.isValid(0);
		conn.close();
		
		
		//事务控制
		conn.commit();
		conn.getTransactionIsolation();
		conn.setTransactionIsolation(conn.TRANSACTION_NONE);	//设置事务隔离级别
		conn.setAutoCommit(false);	//取消自动提交
		conn.rollback();
		
		conn.setSavepoint();	//设置事务保存点
		conn.setSavepoint("");
		
		
		//创建Statement对象
		Blob blob = conn.createBlob();
		Clob clob = conn.createClob();
		SQLXML sqlXml = conn.createSQLXML();
		
		Statement stms = conn.createStatement();
		//创建PreparedStatement
		PreparedStatement pstmt = conn.prepareStatement("");
		//创建存储过程对象
		CallableStatement cstmt = conn.prepareCall("");
		
		
		//获取连接信息
		conn.getCatalog();
		conn.getClientInfo();
		conn.getMetaData();

?

?

Statement接口

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


PreparedStatement接口
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

?

(1)执行相关的数据库操作功能;
(2)执行批处理功能,addBatch()
(3)获取结果集数据信息 ResultMetaData getMetaData()
(4)获取参数集信息??? getParameterMetaDate getParameterMetaDate()


由PreparedStatement接口可获取的两个重要接口ResultSetMetaData和ParameterMetaData两个接口

?

因为 PreparedStatement 对象被预编译,所以不必执行就可以知道它将返回的 ResultSet 对象。因此,可以对 PreparedStatement 对象调用 getMetaData 方法,而不必等待执行该对象,然后再对返回的 ResultSet 对象调用 ResultSet.getMetaData 方法。

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。以下代码片段创建 ResultSet 对象 rs,创建 ResultSetMetaData 对象 rsmd,并使用 rsmd 查找 rs 有多少列,以及 rs 中的第一列是否可以在 WHERE 子句中使用。

     ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
     ResultSetMetaData rsmd = rs.getMetaData();
     int numberOfColumns = rsmd.getColumnCount();
     boolean b = rsmd.isSearchable(1);

?

?

PreparedStatement和Statement接口的区别:


(1)PreparedStatement可以处理sql注入,并对sql中的特殊字符进行处理;
(2)Statement会频繁编译sql,造成数据库缓冲区溢出;PreparedStatement可以对sql进行预编译,提高sql执行效率;
(3)数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。

?

?

ResultSet接口 结果集接口

默认的结果集对象不可更新,可以通过设置滚动结果集向前向后移动。

?

创建可滚动的结果集

Statement st = 
	connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  ResultSet.CONCUR_UPDATABLE);
	ResultSet rs = st.executeQuery(sql);
	//相关方法
	rs.beforeFirst(); rs.afterLast();rs.first();rs.isFirst();rs.last();rs.isLast();
	rs.absolute(9);rs.moveToInsertRow();

?

创建可更新的结果集

	conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
					ResultSet.CONCUR_UPDATABLE);
	rs.updateString("col name", "new value");
	rs.updateRow();

?

?

两个常量:
TYPE_SCROLL_INSENSITIVE(无法感知库变化)
该常量指示可滚动但通常不受 ResultSet 底层数据更改影响的 ResultSet 对象的类型。

TYPE_SCROLL_SENSITIVE(可以感知数据库变化)
该常量指示可滚动并且通常受 ResultSet 底层数据更改影响的 ResultSet 对象的类型。

所谓的感知是指当我们拿到ResultSet之后,数据库中的记录发生了变化,则在遍历rs过程中,ResultSet可以感知数据库的变化,与数据库的数据保持同步。有的数据库不能支持。

?


ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。


resultSet中getObject()与getInt(), getString()的区别?
取值后尝试转化的类