JDBC技術

1、JDBC簡介
java

  JDBC,Java Ddatabase Connection,Java數據庫鏈接。mysql

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

wKiom1jTsi2SZw6CAAA9tlwO81M640.png

wKioL1jTskyA8LrJAABH8_oqf5o968.png


什麼是驅動?兩個設備要進行通訊,知足必定通訊數據格式,數據格式由設備提供商規定,設備提供商爲設備提供驅動軟件,經過軟件能夠與該設備進行通訊。sql


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


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

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

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


2、JDBC快速入門
ide

建立一個user表url

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


3、JDBC編程步驟

wKiom1jTuAixemdMAADHwV-kFrs058.png


4、JDBC訪問數據庫的流程

wKioL1jTuEGxsmJJAADmygqL-IA232.png

5、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語句中。


6、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','hah@163.com') ";
		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 = '123@163.com' 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();


7、DAO模式

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

wKioL1jTw32hBa1pAAECA62sYNg848.png

相關文章
相關標籤/搜索