(4)查询数据库的一些结构信息
这主要是获得数据库中的各个表,各个列及数据类型和存储过程等各方面的信息。根据这些信息,从而可以访问一个未知结构的数据库。这主要是通过DatabaseMetaData类的对象来实现并调用其中的方法来获得数据库的详细信息(即数据库的基本信息,数据库中的各个表的情况,表中的各个列的信息及索引方面的信息)。
DatabaseMetaData dbms=con.getMetaData();
System.out.println("数据库的驱动程序为 "+dbms.getDriverName());
(5)查询数据库中的数据:
在JDBC中查询数据库中的数据的执行方法可以分为三种类型,分别对应Statement (用于执行不带参数的简单SQL语句字符串),PreparedStatement(预编译SQL语句)和CallableStatement(主要用于执行存储过程)三个接口。
9.5.1、实现对数据库的一般查询Statement
1、创建Statement对象(要想执行一个SQL查询语句,必须首先创建出Statement对象,它封装代表要执行的SQL语句)并执行SQL语句以返回一个ResultSet对象,这可以通过Connection类中的createStatement()方法来实现。
Statement stmt=con.createStatement();
2、执行一个SQL查询语句,以查询数据库中的数据。Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate() 和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类中的executeQuery()方法来实现的代码段。executeQuery()方法的输入参数是一个标准的SQL查询语句,其返回值是一个ResultSet类的对象。
ResultSet rs=stmt. executeQuery ("select * from DBTableName");
要点:①JDBC在编译时并不对将要执行的SQL查询语句作任何检查,只是将其作为一个String类对象,直到驱动程序执行SQL查询语句时才知道其是否正确。对于错误的SQL查询语句,在执行时将会产生 SQLException。
②一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。
③如果想对多个结果集同时操作,必须创建出多个Statement对象,在每个Statement对象上执行SQL查询语句以获得相应的结果集。
④如果不需要同时处理多个结果集,则可以在一个Statement对象上顺序执行多个SQL查询语句,对获得的结果集进行顺序操作。
import java.sql.*;
public class ResultSetTest
{
public static void main(String args[])
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:studlist");
Statement stmt=con.createStatement();
ResultSet rs1=stmt.executeQuery("select name from student");
ResultSet rs2=stmt.executeQuery("select age from student");
//此时rs1已经被关闭
while(rs2.next())
{
System.out.println(rs2.getObject(1));
}
rs2.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
注意:
此时显示出的将是姓名还是年龄?(将显示的是rs2的结果集的内容,即学生的年龄,因为采用JDBC-ODBC方式的驱动程序时,并且是采用同一个Statement对象,它只会保留最新的结果集,rs1中的内容将会被新的结果集所取代)。
3、关闭Statement对象:每一个Statement对象在使用完毕后,都应该关闭。
stmt.close();