三十九,JDBC操做詳解

1.JDBC的基本概念

JDBC:java database connective數據庫連接,是一組專門負責連接並操做數據庫的標準, 在整個JDBC,實際上提供了大量的接口.要使用java對數據庫進行數據庫的開發,則確定必須對這些標準有所支持. java

JDBC使用中的方式: sql

JDBC-ODBC:實際開發中使用不多,效率很是低. 數據庫

JDBC鏈接: 使用各個數據庫提供商給定的數據庫驅動程序,完成JDBC的開發,這時須要在classpath中配置驅動程序. 網絡

JDBC網絡鏈接:主要使用網絡鏈接數據庫. oracle

2.JDBC的操做步驟

操做步驟: 學習

①加載數據庫驅動程序,classpath中配置. this

②鏈接數據庫,經過Connection接口和DriverManger類完成. spa

③操做數據庫,經過Statement,PreparedStatement,ResultSet三個接口完成. code

④關閉數據庫. orm

3.JDBC的鏈接操做

鏈接步驟:

①經過Class.forName加載數據庫的驅動程序.

②經過DriverManager類進行數據庫的鏈接,鏈接時須要輸入數據庫的鏈接地址,用戶名,密碼.

③經過Connection接口接收鏈接.

鏈接示例:

package com.ares.connectdemo;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectJDBC {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		System.out.println(conn);
		// 四、關閉數據庫
		conn.close();
	}

}




4.數據庫更新操做

執行數據庫的更新操做須要Statement接口支持,能夠執行增,,改操做.

4.1增長操做示例

package com.ares.updatedemo;

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

public class StatementDemo01 {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		Statement stmt = null ;	// 表示數據庫的更新操做
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口須要經過Connection接口進行實例化操做
		stmt = conn.createStatement() ;
		// 執行SQL語句,更新數據庫
		stmt.executeUpdate("INSERT INTO person(pid,name,age,birthday,salary) VALUES 
                (perseq.nextval,'張三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			//TO_DATE是oracle數據庫的時間日期格式.
		// 四、關閉數據庫
		conn.close();
	}
}

4.2更新操做示例

stmt.executeUpdate("UPDATE person SET name='李四',age=33,
birthday=sysdate,salary=8000.0 WHERE pid=4") ;

4.3刪除操做示例

stmt.executeUpdate("DELETE FROM person WHERE pid=4") ;

4.4查詢操做示例

經過SELECT命令查詢數據庫,程序經過ResultSet保存所有的查詢結果,經過Statement接口中的executeQuery()方法查詢.經過next()方法找到返回的沒一行數據,沒一行中的各個列數據須要經過getXXX方法得到.

示例代碼:

package com.ares.resultdemo;

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

public class ResultSetDemo01 {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		Statement stmt = null ;	// 表示數據庫的更新操做
		ResultSet result = null ;// 表示接收數據庫的查詢結果
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口須要經過Connection接口進行實例化操做
		stmt = conn.createStatement() ;
		// 執行SQL語句,查詢數據庫
		result = stmt.executeQuery("SELECT pid,name,age,birthday,salary FROM person") ;
		while(result.next()){// 是否有下一行數據
			int pid = result.getInt("pid") ;
			String name = result.getString("name") ;
			int age = result.getInt("age") ;
			Date birthday = result.getDate("birthday") ;
			float salary = result.getFloat("salary") ;
			System.out.print("pid = " + pid + ";") ;
			System.out.print("name = " + name + ";") ;
			System.out.print("age = " + age + ";") ;
			System.out.print("birthday = " + birthday + ";") ;
			System.out.println("salary = " + salary + ";") ;
		}
		// 四、關閉數據庫
		result.close() ;
		stmt.close() ;
		conn.close();
	}
}

數據查詢後取值的另外一種方式:

int pid = result.getInt(1) ;

String name = result.getString(2) ;

int age = result.getInt(3) ;

Date birthday = result.getDate(4) ;

float salary = result.getFloat(5) ;




5.動態操做數據庫

插入數據示例:

InputData

package com.ares.execdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class InputData {
	private BufferedReader buf = null;

	public InputData() {
		this.buf = new BufferedReader(new InputStreamReader(System.in));
	}

	public String getString(String info) {
		String str = null;
		System.out.print(info);// 打印提示信息
		try {
			str = this.buf.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return str;
	}

	public int getInt(String info, String err) {
		int temp = 0;
		boolean flag = true;// 定義一個標誌位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d+")) {
				temp = Integer.parseInt(str);
				flag = false;// 退出循環
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public float getFloat(String info, String err) {
		float temp = 0.0f;
		boolean flag = true;// 定義一個標誌位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d+.?\\d+")) {
				temp = Float.parseFloat(str);
				flag = false;// 退出循環
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public char getChar(String info, String err) {
		char temp = ' ';
		boolean flag = true;// 定義一個標誌位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\w")) {
				temp = str.charAt(0);
				flag = false;// 退出循環
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}

	public Date getDate(String info, String err) {
		Date temp = null ;
		boolean flag = true;// 定義一個標誌位
		while (flag) {
			String str = this.getString(info);
			if (str.matches("\\d{4}-\\d{2}-\\d{2}")) {
				try {
					temp = new SimpleDateFormat("yyyy-MM-dd").
                                                    parse(str) ;
				} catch (ParseException e) {
					System.out.print(err) ;
				}
				flag = false;// 退出循環
			} else {
				System.out.print(err);
			}
		}
		return temp;
	}
}

InsertDemo類示例:

package com.ares.execdemo;

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

public class InsertDemo {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		Statement stmt = null; // 表示數據庫的更新操做
		InputData input = new InputData() ;
		String name = input.getString("請輸入姓名:");
		int age = input.getInt("請輸入年齡:", "年齡必須是數字,");
		String date = input.getString("請輸入生日:");
		float salary = input.getFloat("請輸入工資:", "輸入的工資必須是數字,");
		String sql = "INSERT INTO person(pid,name,age,birthday,salary)
                                 VALUES (perseq.nextval,'"
				+ name + "'," + age + ",TO_DATE('"
				+ date + "','yyyy-mm-dd'),"	+ salary + ") ";
		System.out.println(sql) ;
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、Statement接口須要經過Connection接口進行實例化操做
		stmt = conn.createStatement();
		// 執行SQL語句,更新數據庫
		stmt.executeUpdate(sql);
		// 四、關閉數據庫 
		conn.close();
	} 
}

備註:這種拼湊的SQL語句其實是有問題的,好比單引號就會出現解析異常,同時也會出現數據庫的注入非法操做等等.


6.PreparedStatement接口

PreparedStatementStatement接口的子接口,也是實際操做中使用較多的接口,表示預處理操做.

插入示例:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Date;

public class InsertDemo {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		PreparedStatement pstmt = null; // 表示數據庫的更新操做
		InputData input = new InputData() ;
		String name = input.getString("請輸入姓名:");
		int age = input.getInt("請輸入年齡:", "年齡必須是數字,");
		Date date = input.getDate("請輸入生日:","輸入的不是日期,");
		float salary = input.getFloat("請輸入工資:", "輸入的工資必須是數字,");
		String sql = "INSERT INTO person(pid,name,age,birthday,salary) 
                                VALUES (perseq.nextval,?,?,?,?) ";
		System.out.println(sql) ;
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口須要經過Connection接口進行實例化操做
		pstmt = conn.prepareStatement(sql) ;// 使用預處理的方式建立對象
		pstmt.setString(1, name) ;// 第一個?號的內容
		pstmt.setInt(2, age) ;	// 第二個?號的內容
		pstmt.setDate(3, new java.sql.Date(date.getTime())) ;
 //將util下的格式轉爲sql下的格式.
		pstmt.setFloat(4,salary) ;
		// 執行SQL語句,更新數據庫
		pstmt.executeUpdate();
		// 四、關閉數據庫 
		pstmt.close() ;
		conn.close();
	} 
}

查詢操做示例:

String sql = "SELECT pid,name,age,birthday,salary FROM person" ;
… ...
pstmt = conn.prepareStatement(sql) ;
		// 執行SQL語句,查詢數據庫
result = pstmt.executeQuery() ;
while(result.next()){// 是否有下一行數據
			int pid = result.getInt(1) ;
			String name = result.getString(2) ;
			int age = result.getInt(3) ;
			Date birthday = result.getDate(4) ;
			float salary = result.getFloat(5) ;
		}

模糊查詢操做:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;

public class SelectDemo02 {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		PreparedStatement pstmt = null ;	// 表示數據庫的更新操做
		ResultSet result = null ;// 表示接收數據庫的查詢結果
		String keyWord = "" ;
		String sql = "SELECT pid,name,age,birthday,salary FROM person 
                                WHERE name LIKE ? OR birthday LIKE ?" ;
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口須要經過Connection接口進行實例化操做
		pstmt = conn.prepareStatement(sql) ;
		pstmt.setString(1,"%"+keyWord+"%") ;
		pstmt.setString(2,"%"+keyWord+"%") ; 
		// 執行SQL語句,查詢數據庫
		result = pstmt.executeQuery() ;
		while(result.next()){// 是否有下一行數據
			int pid = result.getInt(1) ;
			String name = result.getString(2) ;
			int age = result.getInt(3) ;
			Date birthday = result.getDate(4) ;
			float salary = result.getFloat(5) ;
			System.out.print("pid = " + pid + ";") ;
			System.out.print("name = " + name + ";") ;
			System.out.print("age = " + age + ";") ;
			System.out.print("birthday = " + birthday + ";") ;
			System.out.println("salary = " + salary + ";") ;
		}
		// 四、關閉數據庫
		result.close() ;
		pstmt.close() ;
		conn.close();
	}
}




7.批處理

定義:多條SQL語句能夠一次性執行完畢,稱爲批處理操做.批處理是JDBC2.0以後提出的一個概念.2.0還有滾動的結果集及用滾動結果集更新數據等,可是這些操做使用較少.

Statement上定義了一個addBatch()方法,此方法能夠加入批處理,以後使用executeBatch()方法執行批處理操做.
代碼示例:

package com.ares.prepareddemo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class BatchInsertDemo {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		PreparedStatement pstmt = null; // 表示數據庫的更新操做
		String sql = "INSERT INTO person(pid,name,age,birthday,salary) 
                                VALUES (perseq.nextval,?,?,?,?) ";
		System.out.println(sql) ;
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		// 三、PreparedStatement接口須要經過Connection接口進行實例化操做
		pstmt = conn.prepareStatement(sql) ;// 使用預處理的方式建立對象
		for(int i=0;i<10;i++){
			pstmt.setString(1, "lxh-" + i);// 第一個?號的內容
			pstmt.setInt(2, 20 + i); // 第二個?號的內容
			pstmt.setDate(3, new java.sql.Date(new java.util.Date().getTime()));
			pstmt.setFloat(4, 900*i);
			pstmt.addBatch() ;	// 增長批處理
		}
		// 執行SQL語句,更新數據庫
		int i[] = pstmt.executeBatch() ; 
		System.out.println(i.length);
		// 四、關閉數據庫 
		pstmt.close() ;
		conn.close();
	} 
}




8.事務處理

經過commit提交事務,經過rollback回滾事務.事務處理須要依靠Connection完成.commit是提交更新操做,rollback表示提交執行過程當中出現異常,取消操做,回滾.由於數據庫的操做不用事務處理的話,操做都是當即執行的.

package com.ares.trandemo;

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

public class TransactionDemo02 {
	// 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中
	public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver";
	// 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住
	public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO";
	// 鏈接數據庫的用戶名
	public static final String DBUSER = "scott";
	// 鏈接數據庫的密碼
	public static final String DBPASS = "tiger";

	public static void main(String[] args) throws Exception {
		Connection conn = null; // 表示數據庫的鏈接的對象
		Statement stmt = null; // 表示數據庫的更新操做
		// 一、使用Class類加載驅動程序
		Class.forName(DBDRIVER);
		// 二、鏈接數據庫
		conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
		conn.setAutoCommit(false) ;	// 取消自動提交
		// 三、Statement接口須要經過Connection接口進行實例化操做
		stmt = conn.createStatement() ;
		try{
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'張三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'李四',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'王'五',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'趙六',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'孫七',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ;
			// 執行SQL語句,更新數據庫
			int i[] = stmt.executeBatch() ; 
			System.out.println(i.length);
			conn.commit() ;// 提交
		}catch(Exception e){
			conn.rollback() ;// 回滾
		}
		// 四、關閉數據庫 
		stmt.close() ;
		conn.close();
	} 
}





20150528


JAVA學習筆記系列

--------------------------------------------

                    聯繫方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------
相關文章
相關標籤/搜索