JDBC编程的基本概念
用于JDBC编程的类都包含在java.sql和javax.sql包中
java.sql.DriverManager类用于选择数据库驱动程序和创建新的数据库连接。
只有在驱动管理器中注册过的驱动程序才可以被激活。
"jdbc.drivers"属性包含一系列驱动程序的类名。驱动管理器会在启动时注册这些驱动。
System.setProperty("jdbc.drivers", "oracle.jdbc.driver.OracleDriver")
程序运行在Servlet引擎容器中时要通过加载驱动程序类来手动加载驱动程序,如Class.forName("oracle.jdbc.driver.OracleDriver");
调用DriverManager.getConnection方法获得java.sql.Connection对象
驱动管理器遍历当前所有已经注册过的驱动程序,….
创建一个java.sql.Statement对象
Statement stat = conn.createStatement();
调用Statement类中的executeUpdate方法执行字符串中的SQL语句。
当执行查询操作时可通过executeQuery方法返回一个java.sql.ResultSet对象,来每次一行地迭代遍历所有查询结果。执行SELECT查询时必须使用executeQuery方法。
ResultSet rs = stat.executeQuery("SELECT * FROM Books")
每一个Connection对象都可以创建一个或一个以上的Statement对象,同一个Statement对象可以用于多个不相关的命令和查询。但是,一个Statement对象最多只能打开一个结果集。
当使用完ResultSet、Statement、Connection对象时,应立即调用close()方法关闭连接对象。这些对象都使用了规模较大的数据结构,自行回收而不是等垃圾回收。
4.5 执行查询操作
预备语句(Prepared Statement) java.sql.PreparedStatement
返回一个含预编译语句的PreparedStatement对象,sql语句可以包含一个或多个?指明的占位符。
void setXxx(int n, Xxx x)
(Xxx is a type such as int, double, String, Date, etc.) sets the value of the nth parameter to x.
参数:第一个参数指的是需要赋值的宿主变量的位置,第二个参数指的是赋予宿主变量的值
4.6 可滚动和可更新的结果集
PreparedStatement stat = conn.preparedStatement(command,type,concurrency);
参数type的值:TYPE_FORWARD_ONLY(结果集不能滚动) TYPE_SCROLL_INSENSITIVE(结果集可以滚动,但对数据库变化不敏感) TYPE_SCROLL_SENSITIVE(结果集可以滚动,且对数据库变化敏感)
参数concurrency的值:CONCUR_READ_ONLY(结果集不能用于更新数据库) CONCUR_UPDATABLE(结果集可以用于更新数据库)
4.7 元数据
在SQL中描述数据库或其组成部分的数据称为元数据。包括三个类别:关于数据库的元数据(java.sql.DatabaseMetaData)、 关于结果集的元数据(java.sql.ResultSetMetaData)、关于预备语句参数的元数据 (java.sql.ParameterMetaData)
4.8 行集
适用于无需始终保持与数据库连接的应用或者将结果集移动到复杂应用的其他层。javax.sql.RowSet
RowSet接口继承了resultset接口
一个被缓存的行集包含了一个结果集中所有的数据。javax.sql.CachedRowSet
CachedRowSet接口继承了resultset接口
4.9 事务
当所有语句都顺利执行之后,事务可以被提交,否则,如果其中某个语句遇到错误,那么事务将被回滚。默认情况下,数据库的连接处于自动提交模式。一旦提交成功就无法进行回滚操作。
//You turn off autocommit mode with the command
conn.setAutoCommit(false);
//Now you create a statement object in the normal way:
Statement stat = conn.createStatement();
Call executeUpdate any number of times:
stat.executeUpdate(command1);
stat.executeUpdate(command2);
stat.executeUpdate(command3);
. . .
//When all commands have been executed, call the commit method:
conn.commit();
//However, if an error occurred, call
conn.rollback();
//Then, all commands until the last commit are automatically reversed. You typically issue a //rollback when your transaction was interrupted by a SQLException.
使用保存点(save point)可以让事务只需回滚到保存点,而非事务的开始。java.sql.Savepoint
Statement stat = conn.createStatement(); // start transaction; rollback() goes here
stat.executeUpdate(command1);
Savepoint svpt = conn.setSavepoint(); // set savepoint; rollback(svpt) goes here
stat.executeUpdate(command2);
if (. . .) conn.rollback(svpt); // undo effect of command2
. . .
conn.commit();
//When you are done with a save point, you should release it:
stat.releaseSavepoint(svpt);
批量更新
Statement stat = conn.createStatement();
//Now, instead of calling executeUpdate, you call the addBatch method:
String command = "CREATE TABLE . . ."
stat.addBatch(command);
while (. . .)
{
command = "INSERT INTO . . . VALUES (" + . . . + ")";
stat.addBatch(command);
}
//Finally, you submit the entire batch:
int[] counts = stat.executeBatch();
4.10 高级连接管理
Java名字和目录接口(JNDI)定位数据源。javax.sql.DataSource接口
4.11 LDAP概述
LDAP(Lightweight Directory Access Protocol,轻量级目录访问协议),通常主要应用于目录存储,且该目录包含了如用户名、密码和权限之类的数据。适用于应用数据遵从树状结构,且读操作多于写操作。
LDAP数据库将所有数据存储在一个树状结构中,树中的每一项包含:
1、0个或0个以上属性,每个属性都有一个ID和一个值。
2、一个或一个以上的对象类,一个对象类定义了该元素上的一组属性。
3、一个专有名称,专有名称是一组描述路径的属性序列,该路径将该条目与树的根连接在一起。