JDBC技術

一、JDBC簡介

  JDBC,Java Ddatabase Connection,Java數據庫連接。

  Sun公司爲了簡化、統一對數據庫的操作,定義了一套Java操作數據庫的規範,稱之爲JDBC。

wKiom1jTsi2SZw6CAAA9tlwO81M640.png

wKioL1jTskyA8LrJAABH8_oqf5o968.png


什麼是驅動?兩個設備要進行通信,滿足一定通信數據格式,數據格式由設備提供商規定,設備提供商爲設備提供驅動軟件,通過軟件可以與該設備進行通信。


如果沒有JDBC,Java程序員需要面向各個數據庫驅動接口編程,開發複雜;sun公司提供一套統一JDBC接口規範,Java程序只需要使用JDBC就可以操作任何數據庫,JDBC實現類由各個數據庫廠商提供。


1.組成JDBC的2個包:java.sql和javax.sql。

DriverManger驅動管理類、Connection連接接口、Statement(PreparedStatement、CallableStatement)數據庫操作、ResultSet結果集。

2.開發jdbc應用需要以上2個包外,還需要導入相應JDBC的數據庫實現。


二、JDBC快速入門

創建一個user表

create table user(
    id int primary key auto_increment,
    username varchar(20) unique not null,
    password varchar(20)  not null,
    email varchar(40) not null
);
package cn.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import com.mysql.jdbc.Driver;

public class Test1 {
	public static void main(String[] args) throws Exception {
		//加載數據庫驅動
		DriverManager.registerDriver(new Driver());
		//獲取連接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//創建用於向數據庫發送SQL的Statement對象,併發送SQL
		Statement stat = conn.createStatement();
		//從結果集中取出數據
		String sql = " select * from user ";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4));
		}
		//斷開數據庫的連接,並釋放相關資源
		rs.close();
		conn.close();
		
	}
}


三、JDBC編程步驟

wKiom1jTuAixemdMAADHwV-kFrs058.png


四、JDBC訪問數據庫的流程

wKioL1jTuEGxsmJJAADmygqL-IA232.png

五、JDBC API詳解


5.1DriverManager類

  jdbc程序中的DriverManager用於加載驅動,並創建和數據庫的連接,這個API的常用方法:

DriverManager.registerDriver(new Driver);
DriverManager.getConnection(url,username,password);

 注意,在實際開發中並不推薦採用registerDriver方法註冊驅動,原因有二:

    1)查看Driver的源代碼可以看出,如果採用此種方式,會導致驅動程序註冊兩次,也就是在內存中會有兩個Driver對象。

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
	static {
		try {
			DriverManager.registerDriver(new Driver());
		} catch (SQLException E) {
			throw new RuntimeException("Can't register driver!");
		}
	}
}

    2)程序依賴MySQL的API,脫離MySQL的jar包,程序將無法編譯,將來程序切換底層數據庫將會非常麻煩。


  推薦方式:class.forName("com.mysql.jdbc.Driver");

    採用此種方式不會導致驅動對象在內存中重複出現,並且採用此種方式,程序僅僅只需要一個字符串,不需要依賴具體的驅動,使得程序的靈活性更高。


同樣,在開發中也不建議採用具體的驅動類型指向getConnection方法返回的Connection對象。


5.2數據庫URL

URL用於標識數據庫的位置,程序員通過URL地址告訴JDBC程序連接那個數據庫,URL的寫法爲:

wKioL1jTu6nhyVbtAAAt0VWrL_M556.png

常用數據庫URL的地址的寫法:

oracle  jdbc:oracle:thin:@localhost:1521:sid
mysql    jdbc:mysql://localhost:3306/sid

常用屬性:useUnicode=true&characterEncoding=UTF-8


5.3Connection連接接口

應用一:獲取SQL的操作對象

Statement stat = conn.createSteatement() 該對象可以將SQL發送給數據庫進行執行
PreparedStatement pstmt = conn.prepareStatement(String sql) 對SQL語句進行預編譯,防止SQL注入
CallableStatement cstmt = conn.prepareCall(String sql) 該對象可以調用數據庫中存儲過程


應用二:對數據庫事務進行管理

conn.setAutoCommit(boolean flag) 設置事務是否自動提交
conn.commit()    提交數據庫事務
conn.rollback()    回滾數據庫事務


5.4Statement 用於將SQL發送給數據庫,獲取操作結果

  jdbc程序中的Statement對象用於向數據庫發送SQL語句,Statement對象常用方法::

executeQuery(String sql) 用於向數據發送查詢語句
executeUpdate(String sql) 用於向數據庫發送insert、update或delete語句
execute(String sql) 用於向數據庫發送任意SQL語句
addBatch(String sql) 把多條SQL語句放到一個批處理中
executeBatch() 向數據庫發送批處理執行


5.5ResultSet

  jdbc程序中採用的ResultSet用於代表SQL語句的執行結果。ResultSet封裝執行結果的時候,採用類似於表格的方式。ResultSet對象維護了一個指向表格數據行的遊標,初始化的時候,遊標在第一行之前,調用next()方法,可以使得遊標指向具體的數據行,進而調用方法獲取該行數據。

  resultSet既然用於封裝執行結果,所以該對象提供的大部分方法都是用獲取數據的get方法:

    獲取任意類型的數據

getObject(int index) 
getObject(String columnName)

   獲取指定類型的數據

getString(int index)

getString(String columnName)


5.6釋放資源

  jdbc程序運行完畢後,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet、Statement和Connection對象。

  特別是Connection對象,它是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是儘量晚創建,儘量早的釋放。

  爲確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。


六、JDBC完成CRUD示例

增加:

private static void create() throws Exception {
		//加載數據庫驅動
		Class.forName("com.mysql.jdbc.Driver");
		//獲取連接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//創建用於向數據庫發送SQL的Statement對象,併發送SQL
		Statement stat = conn.createStatement();
		String sql = " insert into user (username,password,email) values('哈哈','haha','[email protected]') ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("執行增加完畢");
		}
		
		//斷開數據庫的連接,並釋放相關資源
		conn.close();
	}

刪除

private static void delete() throws Exception {
		//加載數據庫驅動
		Class.forName("com.mysql.jdbc.Driver");
		//獲取連接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//創建用於向數據庫發送SQL的Statement對象,併發送SQL
		Statement stat = conn.createStatement();
		String sql = " delete from user where username = '哈哈'; ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("執行刪除完畢");
		}
		
		//斷開數據庫的連接,並釋放相關資源
		conn.close();

	}

修改

private static void update() throws Exception {
		//加載數據庫驅動
		Class.forName("com.mysql.jdbc.Driver");
		//獲取連接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//創建用於向數據庫發送SQL的Statement對象,併發送SQL
		Statement stat = conn.createStatement();
		String sql = " update user set email = '[email protected]' where id = 1 ";
		int rows = stat.executeUpdate(sql);
		if(rows > 0){
			System.out.println("執行修改完畢");
		}
		
		//斷開數據庫的連接,並釋放相關資源
		conn.close();
		
	}

查詢

//加載數據庫驅動
		Class.forName("com.mysql.jdbc.Driver");
		//獲取連接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "root");
		//創建用於向數據庫發送SQL的Statement對象,併發送SQL
		Statement stat = conn.createStatement();
		//從結果集中取出數據
		String sql = " select * from user ";
		ResultSet rs = stat.executeQuery(sql);
		while(rs.next()){
			System.out.println(rs.getInt(1)+","+rs.getString(2)+","+rs.getString(3)+","+rs.getString(4));
		}
		//斷開數據庫的連接,並釋放相關資源
		rs.close();
		conn.close();


七、DAO模式

  DAO模式(Data Access Object 數據庫訪問對象),在持久成通過DAO將數據源操作完全封裝起來,業務層通過Java對象,完成對數據源操作。

wKioL1jTw32hBa1pAAECA62sYNg848.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章