1. 程式人生 > >JAVAOO之JDBC

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();
	}
}

}