JDBC連接數據庫的流程
是Sun 公司制定的一個可以用Java 語言連接數據庫的技術。一、JDBC 基礎知識JDBC (Java Data Base Connectivity,java數據庫連接)是一種用于執(zhí)行SQL 語句的
是Sun 公司制定的一個可以用Java 語言連接數據庫的技術。
一、JDBC 基礎知識
JDBC (Java Data Base Connectivity,java數據庫連接)是一種用于執(zhí)行SQL 語句的Java API ,可以為多種關系數據庫提供統(tǒng)一訪問,它由一組用Java 語言編寫的類和接口組成。JDBC 為數據庫開發(fā)人員提供了一個標準的API ,據此可以構建更高級的工具和接口,使數據庫開發(fā)人員能夠用純 Java API 編寫數據庫應用程序,并且可跨平臺運行,并且不受數據庫供應商的限制。
1、跨平臺運行:這是繼承了Java 語言的“一次編譯,到處運行”的特點;
2、不受數據庫供應商的限制:巧妙在于JDBC 設有兩種接口,一個是面向應用程序層,其作用是使得開發(fā)人員通過SQL 調用數據庫和處理結果,而不需要考慮數據庫的提供商;另一個是驅動程序層,處理與具體驅動程序的交互,JDBC 驅動程序可以利用JDBC API 創(chuàng)建Java 程序和數據源之間的橋梁。應用程序只需要編寫一次,便可以移到各種驅動程序上運行。Sun 提供了一個驅動管理器,數據庫供應商——如MySQL 、Oracle ,提供的驅動程序滿足驅動管理器的要求就可以被識別,就可以正常工作。所以JDBC 不受數據庫供應商的限制。
JDBC API可以作為連接Java 應用程序與各種關系數據庫的紐帶,在帶來方便的同時也有負面影響,以下是JDBC 的優(yōu)、缺點。優(yōu)點如下:
操作便捷:JDBC 使得開發(fā)人員不需要再使用復雜的驅動器調用命令和函數;
可移植性強:JDBC 支持不同的關系數據庫,所以可以使同一個應用程序支持多個數據庫的訪問,只要加載相應的驅動程序即可;
通用性好:JDBC-ODBC 橋接驅動器將JDBC 函數換成ODBC ;
面向對象:可以將常用的JDBC 數據庫連接封裝成一個類,在使用的時候直接調用即可。
缺點如下:
訪問數據記錄的速度受到一定程度的影響;
更改數據源困難:JDBC 可支持多種數據庫,各種數據庫之間的操作必有不同,這就給更改數據源帶來了很大的麻煩
二、JDBC 連接數據庫的流程及其原理
1、在開發(fā)環(huán)境中加載指定數據庫的驅動程序。例如,接下來的實驗中,使用的數據庫是Oracle ,所以需要去下載Oracle 支持JDBC 的驅動程序(其實這個地方并不需要去官網上下載jdbc 驅動,本地安裝的Oracle 中就有,是一個ojdbc14.jar 的文件) ;而開發(fā)環(huán)境是MyEclipse ,將下載得到的驅動程序加載進開發(fā)環(huán)境中(具體示例的時候會講解如何加載) 。
2、在Java 程序中加載驅動程序。在Java 程序中,可以通過 “Class.forName(“指定數據庫的驅動程序”) ” 方式來加載添加到開發(fā)環(huán)境中的驅動程序,例如加載Oracle 的數據驅動程序的代碼為: Class.forName(“oracle.jdbc.driver.OracleDriver ”)
1
,3、創(chuàng)建數據連接對象:通過DriverManager 類創(chuàng)建數據庫連接對象Connection 。DriverManager 類作用于Java 程序和JDBC 驅動程序之間,用于檢查所加載的驅動程序是否可以建立連接,然后通過它的getConnection 方法,根據數據庫的URL 、用戶名和密碼,創(chuàng)建一個JDBC Connection 對象。如:Connection connection = DriverManager.geiConnection(“連接數據庫的URL", "用戶名", "密碼”) 。其中,URL=協(xié)議名 IP地址(域名) 端口 數據庫名稱;用戶名和密碼是指登錄數據庫時所使用的用戶名和密碼, 具體示例創(chuàng)建Oracle 的數據庫連接代碼如下: conn=DriverManager.getConnection(url, user, password);
4、創(chuàng)建Statement 對象:Statement 類的主要是用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結果的對象。通過Connection 對象的 createStatement()方法可以創(chuàng)建一個Statement 對象。例如:Statement statament = connection.createStatement(); 具體示例創(chuàng)建Statement 對象代碼如下:
Statement statamentMySQL =connectMySQL.createStatement();
5、調用Statement 對象的相關方法執(zhí)行相對應的 SQL 語句:通過execuUpdate()方法用來數據的更新,包括插入和刪除等操作,例如向staff 表中插入一條數據的代碼:
statement.excuteUpdate( "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ;
通過調用Statement 對象的executeQuery()方法進行數據的查詢,而查詢結果會得到 ResulSet 對象,ResulSet 表示執(zhí)行查詢數據庫后返回的數據的集合,ResulSet 對象具有可以指向當前數據行的指針。通過該對象的next()方法,使得指針指向下一行,然后將數據以列號或者字段名取出。如果當next()方法返回null ,則表示下一行中沒有數據存在。使用示例代碼如下:
ResultSet resultSel = statement.executeQuery( "select * from staff" );
6、關閉數據庫連接:使用完數據庫或者不需要訪問數據庫時,通過Connection 的close() 方法及時關閉數據連接。
三、JDBC 應用示例實驗
實驗 步驟:
S1、下載ojdbc14.jar 驅動文件,并將該文件放到你的項目中去;
S2、在MyEclipse 中的項目中添加Oracle 驅動程序:在項目名上右鍵-> Build Path ->Add External Archiver 然后選擇你剛才放在項目中的文件, 點確定即可。
S3、打開Oracle 的各項服務,并在Oracle 中建一張表。
S4、編寫MyEclipse 與Oracle 的連接程序:
[cpp] view plaincopyprint?import java.sql.Connection; import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.* ;
2
,public class JDBC_Test {
//orcl為oracle 數據庫中的數據庫名,localhost 表示連接本機的oracle 數據庫 //1521為連接的端口號
private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
//system為登陸oracle 數據庫的用戶名
private static String user="system";
//manager為用戶名system 的密碼
private static String password="manager";
public static Connection conn;
public static PreparedStatement ps;
public static ResultSet rs;
public static Statement st ;
//連接數據庫的方法
public void getConnection(){
try {
//初始化驅動包
Class.forName("oracle.jdbc.driver.OracleDriver");
//根據數據庫連接字符,名稱,密碼給conn 賦值
conn=DriverManager.getConnection(url, user, password);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//測試能否與oracle 數據庫連接成功
public static void main(String[] args) {
JDBC_Test basedao=new JDBC_Test();
basedao.getConnection();
if(conn==null){
System.out.println("與oracle 數據庫連接失敗!");
}else{
System.out.println("與oracle 數據庫連接成功!");
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.* ;
3
,public class JDBC_Test {
//orcl為oracle 數據庫中的數據庫名,localhost 表示連接本機的oracle 數據庫 //1521為連接的端口號
private static String url="jdbc:oracle:thin:@localhost:1521:orcl";
//system為登陸oracle 數據庫的用戶名 private static String user="system"; //manager為用戶名system 的密碼 private static String password="manager"; public static Connection conn; public static PreparedStatement ps; public static ResultSet rs; public static Statement st ; //連接數據庫的方法 public void getConnection(){ try { //初始化驅動包 Class.forName("oracle.jdbc.driver.OracleDriver"); } //根據數據庫連接字符,名稱,密碼給conn 賦值 conn=DriverManager.getConnection(url, user, password); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //測試能否與oracle 數據庫連接成功 public static void main(String[] args) { JDBC_Test basedao=new JDBC_Test(); basedao.getConnection(); if(conn==null){ System.out.println("與oracle 數據庫連接失?。?); }else{
System.out.println("與oracle 數據庫連接成功!");
}
}
}
S5、如果上述的連接已經建立,就可以利用JDBC 中的Java API 對數據庫進行操作了,具體的查詢,插入,刪除,更新操作如下:
[cpp] view plaincopyprint?代碼轉載自:http://blog.csdn.net/cxwen78/article/details/6863696
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
4
,import java.sql.SQLException;
import java.sql.Statement;
public class JDBC_Test {
// 創(chuàng)建靜態(tài)全局變量
static Connection conn;
static Statement st;
public static void main(String[] args) {
insert(); //插入添加記錄
update(); //更新記錄數據
delete(); //刪除記錄
query(); //查詢記錄并顯示
}
/* 插入數據記錄,并輸出插入的數據記錄數*/
public static void insert() {
conn = getConnection(); // 首先要獲取連接,即連接到數據庫
try {
String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入數據的sql 語句
st = (Statement) conn.createStatement(); // 創(chuàng)建用于執(zhí)行靜態(tài)sql 語句的Statement 對象
int count = st.executeUpdate(sql); // 執(zhí)行插入操作的sql 語句,并返回插入數據的個數
System.out.println("向staff 表中插入 " count " 條數據"); //輸出插入操作的處理結果
conn.close(); //關閉數據庫連接
} catch (SQLException e) {
System.out.println("插入數據失敗" e.getMessage());
}
}
/* 更新符合要求的記錄,并返回更新的記錄數目*/
public static void update() {
5
,conn = getConnection(); //同樣先要獲取連接,即連接到數據庫
try {
String sql = "update staff set wage='2200' where name = 'lucy'";// 更新數據的sql 語句
st = (Statement) conn.createStatement(); //創(chuàng)建用于執(zhí)行靜態(tài)sql 語句的Statement 對象,st 屬局部變量
int count = st.executeUpdate(sql);// 執(zhí)行更新操作的sql 語句,返回更新數據的個數
System.out.println("staff表中更新 " count " 條數據"); //輸出更新操作的處理結果
conn.close(); //關閉數據庫連接
} catch (SQLException e) {
System.out.println("更新數據失敗");
}
}
/* 查詢數據庫,輸出符合要求的記錄的情況*/
public static void query() {
conn = getConnection(); //同樣先要獲取連接,即連接到數據庫
try {
String sql = "select * from staff"; // 查詢數據的sql 語句
st = (Statement) conn.createStatement(); //創(chuàng)建用于執(zhí)行靜態(tài)sql 語句的Statement 對象,st 屬局部變量
ResultSet rs = st.executeQuery(sql); //執(zhí)行sql 查詢語句,返回查詢數據的結果集
System.out.println("最后的查詢結果為:");
while (rs.next()) { // 判斷是否還有下一個數據
// 根據字段名獲取相應的值
String name = rs.getString("name");
int age = rs.getInt("age");
String sex = rs.getString("sex");
String address = rs.getString("address");
String depart = rs.getString("depart");
String worklen = rs.getString("worklen");
String wage = rs.getString("wage");
6
,//輸出查到的記錄的各個字段的值
System.out.println(name " " age " " sex " " address
" " depart " " worklen " " wage);
}
conn.close(); //關閉數據庫連接
} catch (SQLException e) {
System.out.println("查詢數據失敗");
}
}
/* 刪除符合要求的記錄,輸出情況*/
public static void delete() {
conn = getConnection(); //同樣先要獲取連接,即連接到數據庫
try {
String sql = "delete from staff where name = 'lili'";// 刪除數據的sql 語句 st = (Statement) conn.createStatement(); //創(chuàng)建用于執(zhí)行靜態(tài)sql 語句的Statement 對象,st 屬局部變量
int count = st.executeUpdate(sql);// 執(zhí)行sql 刪除語句,返回刪除數據的數量
System.out.println("staff表中刪除 " count " 條數據n"); //輸出刪除操作的處理結果
conn.close(); //關閉數據庫連接
} catch (SQLException e) {
System.out.println("刪除數據失敗");
}
}
/* 獲取數據庫連接的函數*/
public static Connection getConnection() {
Connection con = null; //創(chuàng)建用于連接數據庫的Connection 對象
try {
Class.forName("com.mysql.jdbc.Driver");// 加載Mysql 數據驅動
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myuser", "root", "root");// 創(chuàng)建數據連接
} catch (Exception e) {
System.out.println("數據庫連接失敗" e.getMessage());
}
return con; //返回所建立的數據庫連接
}
}
7