JDBC(java data base connectivity)java数据库连接,由一些接口和类构成的API
应用程序通过JDBC通过Driver(驱动)来访问数据库
**注册驱动** 只需要注册一次
有两种方式
Class.forName("com.mysql.jdbc.Driver");
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
JDBC提供了独立于数据库的api,数据库公司都可以基于这个标准接口进行开发。包括java.sql包下的Driver,Connection,Statement,ResultSet是JDBC提供的接口,DriverManager是用于管理JDBC驱动的服务类,主要用于获取Connection对象(此类中全是静态方法)
Driver接口中,明确要求,Driver接口是每个驱动程序类都必须实现的接口,Java SQL框架允许多个数据库驱动程序,每个驱动程序都应该提供一个实现Driver接口的类,并且明确,在加载某一个类的时候,它应该创建自己的实例并向DriverManager注册该实例
我们会想 Class.forName(driverClass) 只能帮助我们得到Driver的Class对象啊,为什么会帮我们完成注册了呢。从上边对Driver()的API的查阅,API要求:在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。我们猜想是在类加载时,就自动完成了注册。下边去具体看一下源码:
其JDK1.7下的DriverManger的registerDriver()方法:
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != ) {
registeredDrivers.addIfAbsent(new DriverInfo(driver));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
第二种方法是怎么通过只要获得Driver的Class对象就可以完成注册呢,下边看一下其com.mysql.jdbc.Driver的源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
// ~ Static fields/initializers
// ---------------------------------------------
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
** 根据类加载机制,当执行 Class.forName(driverClass) 获取其Class对象时, com.mysql.jdbc.Driver 就会被JVM加载,连接,并进行初始化,初始化就会执行静态代码块**
java.sql.DriverManager.registerDriver(new Driver());
对于上边的两种驱动注册方法,我们一般采用第二种方法:
(1)第一种方式 Driver driver = new Driver() 其在内部也执行静态代码块,这相当于实例化了两个Driver对象;
(2)第一种方式 Driver driver = new Driver() 会产生对某一种数据库的依赖(会import驱动包),耦合性较高。
所以一般采用低二种方式。
**建立连接**
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc",user,password);
创建语句
Statement st =conn.createStatement();
执行语句
ResultSet rs =st.executeQuery("select *from user);
处理结果
rs相当于获得一个表,有行有列
while(rs.next(){
system.out.printIn(rs.getObject(1) +"\t"+)
}
释放资源
rs.close();
st.close();
conn.close();
import java.sql.*;
public class Demoone {
static final String JDBC_DRIVER="com.mysql.jdbc.Driver" ;
static final String DB_URL="jdbc:mysql://localhost/jdbc" ;
static final String USER="root";
static final String PWD="password";
public static void main(String[] args) {
Connection conn =null;
Statement stmt=null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("连接数据库中...");
conn=DriverManager.getConnection(DB_URL,USER,PWD);
System.out.println("连接成功");
stmt=conn.createStatement();
String sql="select * from user";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getObject(1) +"\t"+rs.getObject(2)+"\t"+
rs.getObject(3)+"\t"+rs.getObject(4));
}
rs.close();
stmt.close();
conn.close();
}catch (SQLException se){
se.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}
System.out.println("demoone实例演示成功");
}
}
Connection相当于桥
Statement相当于车
Result相当于资源