JDBC數據庫經常使用操做(mysql)

JDBC
英文名稱:JavaDataBaseConnectivity
中文名稱:java數據庫鏈接
簡稱:JDBC
JDBC是一種用於執行SQL語句的JavaAPI,
能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此能夠構建更高級的工具和接口,使數據庫開發人員可以編寫數據庫應用
程序。java

1、創建數據庫鏈接mysql

一、引用jar文件(http://dev.mysql.com/downloads/connector/j/ 下載jar文件)sql

二、註冊驅動Class.forName(「com.mysql.jdbc.Driver」)(只需註冊一次)數據庫

三、定義數據庫鏈接字符串URL="jdbc:mysql://127.0.0.1:3306/數據庫名稱?user=用戶名&password=密碼&useUnicode=true&characterEncoding=utf-8";安全

  JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
  user:用戶名
  password:密碼
  useUnicode:是否使用Unicode字符集,若是參數characterEncoding設置爲gb2312或gbk,本參數值必須設置爲true
  characterEncoding:當useUnicode設置爲true時,指定字符編碼。好比可設置爲gb2312或gbk
  autoReconnect:當數據庫鏈接異常中斷時,是否自動從新鏈接。(默認:false)
  autoReconnectForPools:是否使用針對數據庫鏈接池的重連策略。(默認:false)
  failOverReadOnly:自動重連成功後,鏈接是否設置爲只讀。(默認:true)
  maxReconnects:autoReconnect設置爲true時,重試鏈接的次數 (默認3:)
  initialTimeout:autoReconnect設置爲true時,兩次重連之間的時間間隔,單位:秒 2
  connectTimeout:和數據庫服務器創建socket鏈接時的超時,單位:毫秒。 0表示永不超時,適用於JDK 1.4及更高版本 0
  socketTimeout:socket操做(讀寫)超時,單位:毫秒。 0表示永不超時服務器

2、經常使用數據庫操做 併發

  //數據庫鏈接字符串
    public static final String DRIVER="com.mysql.jdbc.Driver";
    public static final String URL="jdbc:mysql://127.0.0.1:3306/MyLibrary?user=root&password=123456&useUnicode=true&characterEncoding=utf-8";

一、添加數據socket

    public static void insert()throwsSQLException{
        Connectioncon=null;
        Statementst=null;
        try{
            Class.forName(DRIVER);
            con=DriverManager.getConnection(URL);
            st=con.createStatement();
            st.execute("insertintoarticle(title)values('標題');");
        }catch(ClassNotFoundExceptione){
            e.printStackTrace();
        }finally{
            con.close();
            st.close();
        }
    }

二、刪除數據工具

    public static void delete(intid)throwsSQLException{
        Connectioncon=null;
        Statementst=null;
        try{
            Class.forName(DRIVER);
            con=DriverManager.getConnection(URL);
            st=con.createStatement();
            st.executeUpdate("deletefromarticlewhereid="+id+";");
        }catch(ClassNotFoundExceptione){
            e.printStackTrace();
        }finally{
            con.close();
            st.close();
        }
    }

三、修改數據編碼

    public static void update()throwsSQLException{
        Connectioncon=DriverManager.getConnection(URL);
        Statementst=con.createStatement();
        st.executeUpdate("updatearticlesettitle='新標題'whereid=1;");
        con.close();
        st.close();
    }

四、查詢數據

    public static void select()throwsSQLException{
        Connectioncon=null;
        Statementst=null;
        try{
            Class.forName(DRIVER);
            con=DriverManager.getConnection(URL);
            st=con.createStatement();
            ResultSetrs=st.executeQuery("select*fromarticle;");
            while(rs.next()){
                System.out.print(rs.getInt("id"));
                System.out.println(rs.getString("title"));
            }
            //按表結構自動輸出
//            ResultSetMetaDatarsmd=rs.getMetaData();
//            for(inti=1;i<rsmd.getColumnCount();i++){
//                System.out.print(rsmd.getColumnName(i));
//                System.out.println(rsmd.getColumnTypeName(i));
//            }
        }catch(ClassNotFoundExceptione){
            e.printStackTrace();
        }finally{
            st.close();
            con.close();
        }
    }

五、參數預處理

    public static void insert(Stringtitle)throwsSQLException{
        Connectioncon=DriverManager.getConnection(URL);
        PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);");
        pst.setString(1,title);
        pst.executeUpdate();
        con.close();
        pst.close();
    }

六、批處理

    public static void insertBatch(String[]title)throwsSQLException{
//        Connectioncon=DriverManager.getConnection(URL);
//        Statementst=con.createStatement();
//        for(inti=0;i<title.length;i++){
//            st.addBatch("insertintoarticle(title)values('"+title[i]+"');");
//        }
//        st.executeBatch();        
//        con.close();
//        st.close();
        
        //參數預處理+批處理
        Connectioncon=DriverManager.getConnection(URL);
        PreparedStatementpst=con.prepareStatement("insertintoarticle(title)values(?);");
        for(inti=0;i<title.length;i++){
            pst.setString(1,title[i]);
            pst.addBatch();
        }
        pst.executeBatch();
        con.close();
        pst.close();
    }

七、事務操做

  7.一、數據庫事務的特性:
    原子性(atomicity):一個事務是一個不可分割的工做單位,事務中包括的操做要麼都作,要麼都不作。
    一致性(consistency):事務必須是使數據庫從一個一致性狀態變到另外一個一致性狀態。一致性與原子性是密切相關的。
    隔離性(isolation):一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。
    持久性(durability):持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其餘操做或故障不該該對其有任何影響。
  7.二、JDBC事務操做
  (1)setAutoCommit(Booleanauto Commit):設置是否自動提交事務;
  (2)commit():提交事務;
  (3)rollback():撤消事務;
    默認的狀況爲自動提交事務,也就是說,每一條對數據庫的更新的sql語句表明一項事務,操做成功後,系統自動調用commit()來提交,不然將調用rollback()來撤消事務。在jdbc中,能夠經過調用setAutoCommit(false)來禁止自動提交事務。而後就能夠把多條更新數據庫的sql語句作爲一個事務,在全部操做完成以後,調用commit()來進行總體提交。假若其中一項sql操做失敗,就不會執行commit()方法,而是產生相應的sqlexception,此時就能夠捕獲異常代碼塊中調用rollback()方法撤消事務。

    public static void transaction()throwsSQLException{
        Connectioncon=DriverManager.getConnection(URL);
        Statementst=con.createStatement();
        try{
            con.setAutoCommit(false);//更改JDBC事務的默認提交方式
            st.executeUpdate("deletefromarticlewhereid=1;");
       //Savepoint sp = conn.setSavepoint();設置回滾點 st.executeUpdate(
"deletefromarticlewhereid=2;"); con.commit();//提交JDBC事務 con.setAutoCommit(true);//恢復JDBC事務的默認提交方式 }catch(Exceptionexc){ con.rollback();//回滾JDBC事務 }finally{ st.close(); con.close(); } }

八、調用mysql存儲過程

    public static void callProcedure()throwsSQLException{
        Connectioncon=DriverManager.getConnection(URL);
        CallableStatementcst=con.prepareCall("{callproc_select(?)}");
     //傳入參數值 cst.setInt(
1,3); //若是第一個結果是ResultSet對象,則返回true;若是第一個結果是更新、添加、修改或者沒有結果,則返回false booleanissuccess=cst.execute(); //成功返回true,失敗返回false System.out.println(issuccess); }

3、JDBC執行sql語句方法

  一、executeQuery(String sql): 執行SQL查詢,並返回ResultSet 對象。

  二、executeUpdate(String sql): 可執行增,刪,改,返回執行受到影響的行數。

  三、execute(String sql);:可執行任何SQL語句,返回一個布爾值,表示是否返回ResultSet 。

4、JDBC Statement類型

  一、Statement:接口提供了執行語句和獲取結果的基本方法,用於執行不帶參數的簡單SQL語句,每次執行sql語句,數據庫都要執行sql語句的編譯,最好用於僅執行一次查詢並返回結果的情形,效率高於PreparedStatement。

  二、PrepareStatement:可變參數的SQL,編譯一次,執行屢次,效率高;安全性好,有效防止Sql注入等問題;支持批量更新,批量刪除;執行的SQL語句中是能夠帶參數的,並支持批量執行SQL。因爲採用Cache機制,則預先編譯的語句,就會放在Cache中,下次執行相同SQL語句時,則能夠直接從Cache中取出來。

  三、CallableStatement:用於執行對數據庫已存儲過程的調用,繼承自PreparedStatement,支持帶參SQL操做;支持調用存儲過程,提供了對輸出和輸入/輸出參數的支持;在JDBC中調用存儲過程的語法以下所示:  {call過程名[(?,?)]}  返回結果參數的過程的語法爲:  {?=call過程名[(?,?,...)]}  不帶參數的存儲過程的語法相似:  {call過程名}  CallableStatement中定義的全部方法都用於處理OUT參數或INOUT參數的輸出部分:註冊OUT參數的JDBC類型(通常SQL類型)、從這些參數中檢索結果,或者檢查所返回的值是否爲JDBCNULL。

相關文章
相關標籤/搜索