一、 JDBC的抽象接口
图3. sql包中的主要接口和相互关系
这些接口都存放在Java的sql包中,它们的名称和基本功能是:
l Java.sql.DriverManager
管理驱动器,支持驱动器与数据库连接的创建
l Java.sql.Connection
Connection 对象代表与数据库的连接。连接过程包括所执行的 SQL 语句和在该连接上所返回的结果。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。
l Java.sql.Statement
Statement 对象用于将 SQL 语句发送到数据库中。
实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和 CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句: Statement由方法 createStatement 所创建。用于执行不带参数的简单 SQL 语句;
PreparedStatement由方法 prepareStatement 所创建。用于执行带或不带 IN 参数的预编译 SQL 语句;
CallableStatement 对象用于执行对数据库已存储过程的调用。
该类常用方法:
方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。
方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能,所以本概述后面将在单独一节中对其进行介绍。
l Java.sql.ResultSet
代表执行SQL声明后产生的数据结果
二、 连接各种数据库方式速查表
下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。
1、Oracle8/8i/9i数据库(thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
2、DB2数据库
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase数据库
Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据库
Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url =
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库名
Connection conn= DriverManager.getConnection(url);
6、MySQL数据库
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL数据库
Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);
8、access数据库直连用ODBC的
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;
三、 在oracle中的使用
1 注册
Driver driver = null;
String url = null;
String user = null;
String password = null;
driver = (Driver) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
DriverManager.registerDriver(driver);
url = "jdbc:oracle:thin:@10.40.90.103:1521:zxin";
user = "system";
password = "manager";
conn = DriverManager.getConnection(url, user, password);
2 Java中执行sql语句
v sqlStr = "begin update zxinoda.users set name=? where id=?; commit; end;";
stmt = conn.prepareStatement(sqlStr);
stmt.setString(1, "gaox1");
stmt.setInt(2, 1);
stmt.executeUpdate();
v sqlStr = "select id, name, password from zxinoda.users where id=?";
stmt = conn.prepareStatement(sqlStr);
stmt.setInt(1, 1);
rs = stmt.executeQuery(); //简单sql语句执行能够得到结果集
while (rs.next()) {
System.err.println("id="+rs.getInt(1)+", name="+rs.getString(2));
}
3 Java中调用存储过程
v sqlStr = "{ call zxinoda.sp_addsoftphone(?, ) }";
stmt = conn.prepareCall(sqlStr);
stmt.setString(1, "6130444");
stmt.executeUpdate();
v sqlStr = "{ call zxinoda.sp_addsmrcv(?, ?) }";
stmt = conn.prepareCall(sqlStr);
stmt.setInt(1, 1);
stmt.registerOutParameter(2, OracleTypes.INTEGER);
stmt.executeQuery();
System.err.println("return="+stmt.getInt(1)); //注意:采用存储过程时是不能得到结果集的,不能使用rs.getInt(1),
v sqlStr = "{ call zxinoda.sp_getuserinfo5(?,?)}";
stmt = conn.prepareCall(sqlStr);
stmt.setInt(1, 1);
stmt.registerOutParameter(2, OracleTypes.CURSOR);
stmt.executeQuery();
rs = ((OracleCallableStatement)stmt).getCursor(2); //注意:采用存储过程时是不能得到结果集的,若需要得到结果集,需要使用游标,
while (rs.next()){
System.err.println("id="+rs.getInt(1)+", login="+rs.getString(2));