1. 程式人生 > >JDBC相關概念及使用步驟

JDBC相關概念及使用步驟

一、相關概念

JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高階的工具和介面,使資料庫開發人員能夠編寫資料庫應用程式。

                                                                

二、常用介面及使用JDBC的步驟

  載入JDBC驅動程式 → 建立資料庫連線Connection → 建立執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源

1.Driver介面:註冊驅動 (只做一次)

  Driver介面由資料庫廠家提供,作為java開發人員,只需要使用Driver介面就可以了。在程式設計中要連線資料庫,必須先裝載特定廠商的資料庫驅動程式,不同的資料庫有不同的裝載方法。

       方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推薦這種方式,不會對具體的驅動類產生依賴。
  方式二

:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。

2.Connection介面:建立連線

  Connection與特定資料庫的連線(會話),在連線上下文中執行sql語句並返回結果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定義的資料庫Connection連線上。

  連線MySql資料庫:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  URL用於標識資料庫的位置,通過URL地址告訴JDBC程式連線哪個資料庫,URL的寫法為:

  

  其他引數如:?useSSL=falseuseUnicode=true&characterEncoding=utf8

  常用方法:

    • createStatement():建立向資料庫傳送sql的statement物件。
    • prepareStatement(sql) :建立向資料庫傳送預編譯sql的PrepareSatement物件。
    • prepareCall(sql):建立執行儲存過程的callableStatement物件。
    • setAutoCommit(boolean autoCommit):設定事務是否自動提交。
    • commit() :在連結上提交事務。
    • rollback() :在此連結上回滾事務。

備註:使用properties配置檔案

1.在src底下宣告一個檔案 xxx.properties ,裡面的內容吐下:
driverClass=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost/student 
name=root 
password=root

2.在工具類裡面,使用靜態程式碼塊,讀取屬性:
	static String driverClass = null;
	static String url = null;
	static String username = null;
	static String password = null;
	
	static {
		try {
			//1.建立一個屬性配置物件
			Properties properties = new Properties();
			//InputStream is = new FileInputStream("jdbc.properties");
                         //JDBCUtil為當前類名
			InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");			
			//匯入輸入流
			properties.load(is);
			//讀取屬性			
			driverClass = properties.getProperty("driverClass");
			url = properties.getProperty("url");
			username = properties.getProperty("username");
			password = properties.getProperty("password");
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}

 

3.Statement介面:建立執行SQL語句的statement

  用於執行靜態SQL語句並返回它所生成結果的物件。

  三種Statement類:

    • Statement:由createStatement建立,用於傳送簡單的SQL語句(不帶引數)。
    • PreparedStatement :繼承自Statement介面,由preparedStatement建立,用於傳送含有一個或多個引數的SQL語句。PreparedStatement物件比Statement物件的效率更高,並且可以防止SQL注入,所以我們一般都使用PreparedStatement。相比較以前的statement, 預先處理給定的sql語句,對其執行語法檢查。 在sql語句裡面使用 ? 佔位符來替代後續要傳遞進來的變數。 後面進來的變數值,將會被看成是字串,不會產生任何的關鍵字。
    • CallableStatement:繼承自PreparedStatement介面,由方法prepareCall建立,用於呼叫儲存過程。
String sql = "insert into user values(null,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2,password);

 常用Statement方法:

    • execute(String sql):執行語句,返回是否有結果集
    • executeQuery(String sql):執行select語句,返回ResultSet結果集。
    • executeUpdate(String sql):執行insert/update/delete操作,返回更新的行數。
    • addBatch(String sql) :把多條sql語句放到一個批處理中。
    • executeBatch():向資料庫傳送一批sql語句執行。

4.ResultSet介面:處理執行結果(ResultSet)

  ResultSet提供檢索不同型別欄位的方法,常用的有:

    • getString(int index)、getString(String columnName):獲得在資料庫裡是varchar、char等型別的資料物件。
    • getFloat(int index)、getFloat(String columnName):獲得在資料庫裡是Float型別的資料物件。
    • getDate(int index)、getDate(String columnName):獲得在資料庫裡是Date型別的資料。
    • getBoolean(int index)、getBoolean(String columnName):獲得在資料庫裡是Boolean型別的資料。
    • getObject(int index)、getObject(String columnName):獲取在資料庫裡任意型別的資料。

  ResultSet還提供了對結果集進行滾動的方法:

    • next():移動到下一行
    • Previous():移動到前一行
    • absolute(int row):移動到指定行
    • beforeFirst():移動resultSet的最前面。
    • afterLast() :移動到resultSet的最後面。
    int result = ps.executeUpdate();		
    if(result>0) {		
	    System.out.println("插入成功");
	}else {			
		System.out.println("插入失敗");
	}

5.釋放資源

使用後依次關閉物件及連線:ResultSet → Statement → Connection

    public static void release(Connection con,Statement st, ResultSet rs) {
		closeRs(rs);
		closeSt(st);
		closeCon(con);
	}
	
	private static void closeRs(ResultSet rs) {
		try {
			if(rs!=null) {
				rs.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			rs = null;
		}
	}
	
	private static void closeSt(Statement St) {
		try {
			if(St!=null) {
				St.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			St = null;
		}
	}
	
	private static void closeCon(Connection Con) {
		try {
			if(Con!=null) {
				Con.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			Con = null;
		}
	}

三、資料庫的CRUD sql

1.insert

INSERT INTO t_stu VALUES (NULL,'wangqiang2',28);

        // 1. 獲取連線物件
		conn = JDBCUtil.getConn();
		// 2. 根據連線物件,得到statement
		st = conn.createStatement();
		
		//3. 執行新增
		String sql = "insert into t_stu values(null , 'aobama' , 59)";
		//影響的行數, ,如果大於0 表明操作成功。 否則失敗
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("新增成功");
		}else{
			System.out.println("新增失敗");
		}

2.delete

DELETE FROM t_stu WHERE id = 6

        // 1. 獲取連線物件
		conn = JDBCUtil.getConn();
		// 2. 根據連線物件,得到statement
		st = conn.createStatement();
		
		//3. 執行新增
		String sql = "delete from t_stu where name='aobama'";
		//影響的行數, ,如果大於0 表明操作成功。 否則失敗
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("刪除成功");
		}else{
			System.out.println("刪除失敗");
		}

3.query

SELECT * FROM t_stu

        // 1. 獲取連線物件
		conn = JDBCUtil.getConn();
		// 2. 根據連線物件,得到statement
		st = conn.createStatement();

		// 3. 執行sql語句,返回ResultSet
		String sql = "select * from t_stu";
		rs = st.executeQuery(sql);

		// 4. 遍歷結果集
		while (rs.next()) {
			String name = rs.getString("name");
			int age = rs.getInt("age");

			System.out.println(name + "   " + age);
		}

4.update

UPDATE t_stu SET age = 38 WHERE id = 1;

        // 1. 獲取連線物件
		conn = JDBCUtil.getConn();
		// 2. 根據連線物件,得到statement
		st = conn.createStatement();
		
		//3. 執行新增
		String sql = "update t_stu set age = 26 where name ='qyq'";
		//影響的行數, ,如果大於0 表明操作成功。 否則失敗
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("更新成功");
		}else{
			System.out.println("更新失敗");
		}

使用單元測試,測試程式碼

  • 定義一個類, TestXXX , 裡面定義方法 testXXX.
  • 新增junit的支援。

        右鍵工程 --- bulid path Configure add Library --- Junit --- Junit4

  • 在方法的上面加上註解 , 其實就是一個標記。

        @Test

        public void testQuery() { ... }

  • 游標選中方法名字,然後右鍵執行單元測試。 或者是開啟outline檢視, 然後選擇方法右鍵執行。