JAVAOO之JDBC
JDBC
JDBC是java database connection 即資料庫連線技術。本文將簡述jdbc常用類、jdbc程式設計步驟、驅動的四種類型、3種編譯方式及結果集的處理方式及處理大物件型別資料等內容。
JDBC常用類
在JDBC的基本操作中,最常用的類和介面包括DriverManager、Connection、Statement、PreparedStatement、CallableStatement和ResultSet。使用這幾個類,就可以完成大部分的資料庫操作工作。 DriverManager類用於管理JDBC驅動的服務類,程式中主要使用該類獲得Connection物件。 Connection介面代表資料庫連線,每個Connection物件代表一個與資料庫的物理連線會話。要想訪問資料庫,就必須先獲得資料庫連線。 Statement介面代表SQL語句,Statement物件用於執行SQL語句,它可以用於執行DML、DDL和DCL語句。當執行SQL查詢時,返回查詢到的結果集。 PreparedStatement介面是Statement的子介面,代表預編譯的SQL語句。使用PreparedStatement物件可以執行預編譯的SQL語句,效能更好。 CallableStatement介面也是Statement的子介面,代表資料庫中的儲存過程。使用CallableStatement物件可以執行資料庫中的儲存過程。 ResultSet介面代表返回的結果集。ResultSet包含訪問查詢結果的方法,它可以通過列索引或者列名獲得列資料。使用Result物件可以操作查詢返回的結果集。
JDBC程式設計步驟
JDBC程式設計一般包括如下六個步驟: 步驟一:根據應用程式所用的資料庫,選擇JDBC驅動程式型別。 步驟二:連線到資料庫,得到Connection物件。 步驟三:通過Connection建立Statement物件 步驟四:使用Statement物件提交SQL語句 步驟五:操作結果集 步驟六:回收資料庫資源 如要通過JAVA與學校資料庫連線,在學生表中插入一條學生資訊
驅動的四種類型
1、 型別一(JDBC-ODBC橋加ODBC驅動程式):型別一是一種JDBC-ODBC橋加上ODBC驅動程式混合方式,通過ODBC驅動程式提供JDBC訪問。在Java剛出現的時候,大多數資料庫只支援ODBC訪問,所以這也是當時唯一可用的驅動程式。 2、 型別二(本地API和部分基於Java的驅動程式):這種型別的驅動程式將JDBC呼叫轉換為客戶端API上的Oracle、Sybase、Informix或其他DBMS的呼叫。 3、 型別三(為資料庫中介軟體實現的純Java驅動程式):這種驅動程式將JDBC呼叫轉換為與中介軟體廠商的網路協議,然後又通過中介軟體伺服器轉換為DBMS協議。 4、 型別四(本地協議純Java驅動程式):這類驅動程式將JDBC呼叫直接轉換為DBMS所使用的網路協議,來自客戶端機器上的請求可直接呼叫DBMS伺服器。 **
載入驅動
Class.forName(驅動程式類); 這裡驅動程式類就是資料庫驅動類所對應的字串。例如,如下是載入SQL Server、MySQL和Oracle驅動程式的程式碼:
//載入SQL Server驅動程式
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//載入MySQL驅動程式
Class.forName("com.mysql.jdbc.Driver");
//載入Oracle驅動程式
Class.forName("oracle.jdbc.driver.OracleDriver");
編譯的3種方式
Statement 直接編譯,在定義sql語句用‘“++”’連線需要引數如下:
String sql=" select * from t_student where id=’"+student.getId()+"’"; 此編譯可能會出現注入攻擊,在輸入時惡意破壞。
PrepareStatement 預編譯 Statement常用於執行一個肯定只發生一次,並且沒有引數的SQL語句。如果我們有SQL語句要執行很多次,不管這個語句是否帶有引數,都應該使用PreparedStatement。
psmt = conn.prepareStatement("insert into Employee values(?, ?, ?)");
psmt.setXX(index,values);//set何種資料型別,index是第幾個從1開始,values值是什麼
CallableStatement 用於編譯儲存過程
執行方式
execute 在不知道執行語句是更新還是查詢時使用 executeUpdate 在執行語句為插入、修改、刪除的語句,返回一個int值 executeQuery 在執行語句為查詢的語句時,採用此方法。返回一個ResultSet結果集
結果集的處理方式
判斷結果集中是否有資料,使用next()方法 獲得結果集中的資料,使用getxx()的方法,可以通過索引和列名得到值。 ORM物件關係對映,把從資料庫獲得的資料,物件關係實體對映。
如:學生表中的資料新增一條記錄,學生表在學校資料庫中 思路如下: 1、通過JavaBean新建學生類 2、連線資料庫 程式碼如下:
新建學生類:
package com.gezhi.bean;
import java.io.Serializable;
/**
* 學生類
* @author Administrator
*
*/
public class StudentBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 學生名字
*/
private String stuName;
/**
* 性別
*/
private Integer gender;
/**
* 年齡
*/
private Integer age;
/**
* 班級編號
*/
private int classId;
public StudentBean() {
super();
// TODO Auto-generated constructor stub
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public int getClassId() {
return classId;
}
public void setClassId(int classId) {
this.classId = classId;
}
@Override
public String toString() {
return "StudentBean [stuName=" + stuName + ", gender=" + gender + ", age=" + age + ", classId=" + classId + "]";
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.gezhi.bean.StudentBean;
public class ConnectionDB {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 準備資料
*/
StudentBean student=new StudentBean();
student.setStuName("張三");
student.setAge(18);
student.setGender(0);
student.setClassId(2);
/**
* 載入驅動
*/
String driver="com.mysql.jdbc.Driver";
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 連線資料庫
*/
Connection conn =null;
String url="jdbc:mysql://localhost:3306/DatabaseName=test?useUnicode=true&characterEncoding=UTF8";
String user="root";
String password="1234";
try {
conn=DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PreparedStatement ps=null;
/**
* 宣告sql語句
*/
String sql="insert into(student_name,gender,age,class_id) values(?,?,?,?)";
try {
ps=conn.prepareStatement(sql);
ps.setString(1,student.getStuName());
ps.setInt(2, student.getGender());
ps.setInt(3, student.getAge());
ps.setInt(4, student.getClassId());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 執行sql語句
*/
try {
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 關閉連線
*/
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}