1. 程式人生 > >JDBC學習總結1(JDBC基礎)

JDBC學習總結1(JDBC基礎)

001.JDBC

1.JDBC:java database connectivity  ;   java連線資料庫

簡單來說,jdbc就是一組規範;將對所有關係型資料庫的操作都抽象出來的規範;
作用:採用統一的方式來操作各種資料庫;

2.如何通過jdbc來訪問資料庫; 

JDBC中常用的介面和實現類;
    DriverManager:驅動程式管理器,用來管理驅動,並獲得連線;
    Connection:連線;代表java與資料庫的一個連線;
    Statement :宣告;用來向資料庫傳送sql;
3.使用jdbc訪問資料的步驟

載入驅動 ;

            Class.forName("com.mysql.jdbc.Driver");

獲得連線;
            Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/books","root","tiger");
建立宣告
            Statement st=conn.createStatement();
執行sql
            st.execute(sql);
            st.executeUpdate();
關閉資源
            st.close();
            conn.close();

程式碼如下:

package jdbc;

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

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		//1.載入驅動
		Class.forName("com.mysql.jdbc.Driver");
		//2.獲得連線
        //String url:jdbc:子協議:子名稱
		Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "tiger");
		//3.建立宣告
		Statement st=conn.createStatement();
		//4.執行sql
		String sql="insert into tb_book values(null,'1984',32,'喬治·奧威爾')";
		st.execute(sql);
		//5.關閉資源
		st.close();
		conn.close();
	}

}

002.Statement方法

1.DriverManager類
    作用:管理驅動,並且可以獲得資料庫連線;
    方法:
        public static Connection getConnection(url,userName,password);

建立一個類,將載入驅動放在靜態塊裡,獲得連線定義為靜態方法,程式碼如下:

package jdbc;

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

public class JdbcUtil {
	
	static String url="jdbc:mysql://localhost:3306/test";
	static String userName="root";
	static String password="tiger";
	
	//載入驅動	
	static {
			try {
				Class.forName("com.mysql.jdbc.Driver");
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	//獲得連線
		public static Connection getConnection() {
			try {
				return DriverManager.getConnection(url,userName,password);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return null;
		}
		
}

關於關閉資源:java1.7之後的try可以:

String sql="";

try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
      st.execute(sql);
}

無論是否產生異常,在try執行後會自動關閉資源(包括網路、流等可關閉的資源)

最終程式碼如下:

package jdbc;

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

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		String sql="select * from tb_book";
		try (Connection conn=JdbcUtil.getConnection();Statement st=conn.createStatement()){
		      st.execute(sql);
		}
	}

}


2.Connection
    代表與資料庫的連線;連線用完一定要立即關閉;
    方法:
        createStatement():建立宣告;
        preparedStatement(); 建立預編譯的宣告;
        
        setAutoCommit():事務是否為自動提交;
        commit;
        rollback:控制事務;        
3.Statement (宣告)
    作用:用來執行各種sql
    方法:
            boolean execute(sql);
                  所有語句都可執行;執行語句後是否存在結果集;
            int executeUpdate(sql);
                  受影響的記錄數量; 

            ResultSet executeQuery();

003.ResultSet

ResultSet
    Result代表結果集
        .next():移動游標,如果有下一條記錄則返回true,否則返回false; 
        .get<Type>(int): 根據列號獲得當前記錄的一個欄位的值,並將值轉換成<Type>型別,
        .get<Type>(String):根據列名查詢出當前記錄的欄位值,並轉換成<Type>型別
        .close():關閉資源;

004.PreparedStatement

1.什麼是sql注入;
    通過傳遞一個sql 片段來破壞原有的sql語名,及達到sql攻擊的目的; 
2.PreparedStatment 介面;
    它是Statment的子介面,是預編譯的Statment ;此介面的特點;
①解決sql注入的問題;
②為不同的資料型別賦值更加方便;
③同一個sql執行多次時,效能更好;

建議:如果sql中帶引數,則建議使用preparedSstatement;

3.使用ps的步驟;
            String sql="select * from miaosha_user where userid=? and password=?";
            //定義預編譯的ps; 用?代表可變的引數;
            PreparedStatement ps=conn.prepareStatement(sql);            
            //給萬用字元賦值;
            ps.setString(1, name);
            ps.setString(2, passwd);
            //執行sql;
            ResultSet rs=ps.executeQuery();
4.ps的方法;
    set<Type>(int,Object):給指定位置的萬用字元賦值;
    executeQuery();
    executeUpdate();
    execute();  
            以上三個方法,都沒有引數;

005.日期型別

關於日期型別的對映;
    java.util.Date;    
        在jdbc中,表示java中時間可以使用以下三個型別,這三個型別都是java.util.Date 的子類;並且都在java.sql包中;
    Date:只表示日期;
    Time:只表示時間
    Timestamp:表示一個精確的時間(日期+時間)    

006.事務控制

1.關於事務的處理;
    登入;
        表:使用者資訊表;
                uid,nickname,password.login_time,login_count,amount;
              登入日誌;
                logid,uid,login_time,score;
                
2.在jdbc中如何控制事務?
    在jdbc中通過Connection來控制事務;
        三個方法;
        setAutoCommit(false);

        commit():提交
        rollback():回退; 

        示例;
        Connection conn=JdbcUtil.getConnection();
        conn.setAutoCmmit(false);

        try{
            ps.execute();...
            .....();
            conn.commit();
        }catch(Exception e){
            conn.rollback();
        }finally{
            conn.close();
        }

007.元資料

元資料(MetaData)
    用來描述資料的資料;
        用來描述資料的含義的一些資訊;
     jdbc為我們提供了多種元資料;主要有;
        表示資料庫連線的元資料;
            DatabaseMetaData ;  conn.getMetaData();
        表示結果集的元資料;
            ResultSetMetaData result.getMetaData();
            方法有;
                getColumnCount():獲得結果集的列數;
                getColumnLabel():獲得列名
                getColumnType():獲得列的資料型別;    

008.大物件的處理

jdbc對大資料的處理;
    思路;
        1、使用Connection.createBlob()建立一個blob物件;
        2、獲得這個blob 物件的輸出流;setBinaryStream(1);
        3、向流中寫入位元組;
        4、通過ps.setBlob()將二進位制存在資料庫中;

            //建立一個Blob型別;
            Blob blob=conn.createBlob();            
            //獲得blob的輸出流;
            OutputStream os=blob.setBinaryStream(1);
            //此處省略向os中寫入位元組的程式碼
            ps.setBlob(3, blob);

009.大物件的讀取       010.返回生成的主鍵

如何獲得資料庫生成的主鍵 
    通過一個過載的prepareStatement(sql,int);來設定是否返回由資料庫生成的主鍵 ;然後再使用ps.getGenereatedKeys()來獲得包含主鍵的結果集; 
    PreparedStatement ps=conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
    ps.execute();
    //獲得生成的主鍵;
    ResultSet keys=ps.getGeneratedKeys();
    keys.next();
    System.out.println("生成的主鍵是:"+keys.getInt(1)); 
總結
    元資料 ;MetaData; 
    大物件;
        BLOB:binary Large Object; 
    返回生成的主鍵 ; 
        事務:
    作業;註冊功能;
            受教育經歷;