JDBC:(java Data Base Connectivity)java数据库连接,由一些接口和类构成的API
J2SE的一部分,由java.sql和javax.sql包组成。
连接数据库的步骤:
1、注册驱动(只做一次)
2、建立连接(Connection)
3、创建执行SQL的语句(Statement)
4、执行语句
5、处理执行的结果(ResultSet)
6、释放资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;
public class ConnectionOracle {
/**
* @param args
*/
private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String user = "scott";
private static final String pass = "tiger";
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
// 加载数据库驱动
DriverManager.registerDriver(new OracleDriver());
// 建立连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 创建语句
Statement sm = conn.createStatement();
// 执行语句
ResultSet rs = sm.executeQuery("select * from student");
// 输出结果
while (rs.next()) {
System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t"
+ rs.getObject(3));
}
// 释放资源
rs.close();
sm.close();
conn.close();
}
}
注意:
上面的代码并没有问题,但是运行会报错,我们修改一个配置文件即可:
listener.ora
//注意驱动可以注册多个
注册驱动的另一种方式:
System.setProperty(“jdbc.drivers”,”OracleDriver”);多个驱动之间用冒号隔开,列如要注册两个驱动,驱动a,驱动b,那么要这么写(“jdbc.drivers”,”a:b”);
还有一种方式:
Class.forName(“OracleDriver”);//推荐使用这种方式。想想这种方式为什么也会加载驱动,其实原因很简单,在OracleDriver这个类里面,有个静态代码块,静态代码块中有注册驱动的代码,我们知道静态代码块的运行时机是最早的。所以他也可以注册驱动。
这就引入了另一个问题,在上面代码中写的利用DriverManager来注册驱动其实是注册了两次,注册了两个一模一样的驱动,而且这种方式不利于利用配置文件进行配置,以使程序动态加载何种驱动,所以推荐使用Class.forName()这种方式。
上面的代码只是个简单的演示,实际开发中这样写并不合理,我们要避免异常发生时,Connection不能关闭的问题。
修改代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.jdbc.driver.OracleDriver;
public class ConnectionOracle {
/**
* @param args
*/
private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String user = "scott";
private static final String pass = "tiger";
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
Connection conn = null;
Statement sm = null;
ResultSet rs = null;
try {
// 加载数据库驱动
DriverManager.registerDriver(new OracleDriver());
// 建立连接
conn = DriverManager.getConnection(url, user, pass);
// 创建语句
sm = conn.createStatement();
// 执行语句
rs = sm.executeQuery("select * from student");
// 输出结果
while (rs.next()) {
System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)
+ "\t" + rs.getObject(3));
}
} finally {
// 释放资源
try {
if (rs != null) {
rs.close();
}
} finally {
try {
if (sm != null) {
sm.close();
}
} finally {
conn.close();
}
}
}
}
}
我们继续对上面的代码进行优化:
首先上面的代码只是对数据进行查询,我们可能要对数据进行增删改查,所以对上面的代码进行抽取,将注册数据库驱动、建立连接、释放连接都抽取到工具类JDBCUtils类中。
JDBCUtils类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public final class JDBCUtils {
private static final String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private static final String user = "scott";
private static final String pass = "tiger";
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private JDBCUtils() {
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, pass);
}
public static void free(ResultSet rs, Statement sm, Connection conn) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
} finally {
try {
if (sm != null) {
sm.close();
}
} catch (SQLException e) {
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
}
}
}
}
}
ConnectionOracle类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectionOracle {
/**
* @param args
*/
public static void main(String[] args) throws SQLException {
// TODO Auto-generated method stub
selectStatement();
}
static void selectStatement() throws SQLException {
Connection conn = null;
Statement sm = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
// 创建语句
sm = conn.createStatement();
// 执行语句
rs = sm.executeQuery("select * from student");
// 输出结果
while (rs.next()) {
System.out.println(rs.getObject(1) + "\t" + rs.getObject(2)
+ "\t" + rs.getObject(3));
}
} finally {
JDBCUtils.free(rs, sm, conn);
}
}
}