这里写一个典型的JDBC程序,往后写的JDBC程序的步骤基本上和这里的一样:
(仔细观察会发现,似乎所有的对象都是通过调用方法生成的,没有一个new关键字,这也是我们生成驱动对象时不使用new oracle.jdbc.driver.OracleDriver的原因,为了方便统一)
//这是一个JDBC处理有返回值的sql语句的典型例子
import java.sql.* ; //第一步,导入java中的sql.*包(实际是第二步,第一步引入外部包)
public class JdbcTest1 {
public static void main(String[] args) {
Connection conn = null; //为什么要定义在这里呢?因为如果在使用时才定义的话将造成finally中找不到这些引用变量
Statement stmt = null;
ResultSet rs = null;
try{
Class.forName("oracle.jdbc.driver.OracleDriver"); //第二步,生成驱动对象,并且自动向DriverManager注册
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.1:1521:SXT", "scott","tiger"); //第三步,和数据库建立连接
stmt = conn.createStatement(); //一般的,要执行SQL语句之前的必要操作
rs = stmt.executeQuery("select * from dept"); //返回对应的执行结果。execute译作执行,query译作查询,即“执行查询语句”
//上面不结果返回给结果集合ResultSet,rs就像一个游标,但和数据库中的游标不同,在数据库中游标是指向第一条记录的,
//而程序中的游标是指向第一条记录的上面的,就像以前学过的迭代器。
while(rs.next()) {
String s1 = rs.getString("deptno"); //getString方法表示把结果以字符串的形式读取出来,参数是一个字段,表示把该字段中的记录(数据)以字符串的形式拿出来
System.out.println(s1);
int i = rs.getInt("deptno"); //把字段对应的数据以数值的形式拿出来
System.out.println(i);
//当然,只要可以转换,我们可以把结果以各种各样的形式拿出来
}
}
catch(ClassNotFoundException e){
System.out.println("找不到驱动类!"); //学过建立日志之后我们应该把异常记录到日志里面,LOG
}
catch(SQLException e) { //调用sql包中的类的方法,可能会抛出该异常
e.printStackTrace();
}
//连接就像我们之前学过的流,好比管道一样,使用完了之后不要忘了关闭
//后打开的先关闭
finally{
try{ //因为这里调用close方法,也可能出现异常,所以要用try-catch
if(rs != null){ //只有非空的引用才能调用方法,这样做是为了避免产生新的异常
rs.close();
rs = null; //结束对一个引用的使用后,应该使之指向空,方便回收器进行回收
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
} catch(SQLException e) {
e.printStackTrace();
}
}
}
}
/*
思考:为什么我们要处理抛出的异常而不直接抛出去呢?
因为如果直接抛出异常的话,程序运行时一旦某个位置出现异常,异常后面的程序块不在执行,
那么我们的连接将无法关闭,日积月累,将占用大量的内存,最后导致整个系统崩溃,
这也是要求我们有能处理的异常一定要处理的原因!
总结: 要学会随时随地处理任何可能出现的异常和避免异常的产生,在使用引用时更要小心仔细,尽量追求完美!
*/
各种数据库的连接串: