2七、JDBC

JDBC:java

概念:Java數據庫鏈接,Java語言操做數據庫mysql

JDBC本質:實際上是官方定義的一套操做全部關係型數據庫的規則,即接口。各個數據庫廠商其實現這套接口,提供數據庫驅動jar包。咱們可使用這套接口編程,真正執行的代碼是驅動jar包中的實現類spring

 

快速入門:sql

一、導入驅動jar包數據庫

二、註冊驅動編程

三、獲取數據庫鏈接對象 connection安全

四、定義SQL語句app

五、獲取執行SQL語句的對象 statement框架

六、執行SQL,接收返回結果函數

七、處理結果

八、釋放資源

 

示例代碼:

public class Demo {

    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?useSSL=false","root","123");
        String sql = "select * from Student";
        Statement stmt = connection.createStatement();
        ResultSet rs  = stmt.executeQuery(sql);
        stmt.close();;
        connection.close();
    }

}

詳解JDBC:

一、DriverManager,驅動管理對象

        功能:一、註冊驅動:告訴程序該使用哪個數據庫驅動jar

                            static void registerDriver(Driver driver):註冊與給定的驅動程序 DriverManager

                            寫代碼使用 Class.forName("com.mysql.jdbc.Driver");

                             在com.mysql.jdbc.Driver類中存在靜態代碼塊

                               static{

                                        java.sql.DriverManager.registerDriver(new Driver());

}catch(SQLException E){

                                        thorw new RuntimeException("Can't register driver");

}

                        注意:mysql 5 以後的驅動jar包能夠省略註冊驅動的步驟

                 二、獲取數據庫鏈接

                        方法:static Connection getConnection(String url,string user,string password)

                        參數:一、url:指定鏈接的路徑

                                     語法: jdbc:mysql://ip地址(域名):端口號/數據庫名稱

                                     例如:jdbc:mysql://localhost:3306/db

                                     注意:若是鏈接的是本機地址,端口號爲3306,那麼能夠省略不寫

                                二、user:用戶名

                                三、password:密碼 

二、Connection,數據庫鏈接對象

                一、獲取執行SQL的對象Statement

                        statement createStatement();

                        preparStatement prepareStatement()

                二、管理事務

                        開啓事務:setAutoCommit(boolean autoCommit):調用該方法設置參數爲false,即開啓事務

                        提交事務:commit()

                        回滾事務:rollback()

三、Statement,執行SQL對象

                執行sql:一、boolean execute(String sql),能夠執行任意的sql

                             二、int executeUpdate(string sql),執行DML(Update,insert,delete),DDL(create,alter,drop),返回值爲影響行數

                            三、ResultSet executeQuery(string sql),執行DQL(select)

四、ResultSet,結果集對象,封裝查詢結果

                next():遊標向下移動一行,判斷當前行是不是最後一行末尾,若是是返回false,不是返回true

                getXXX(參數):獲取數據

                    參數:int:表明列的編號,從1開始,如:getString(1);

                            String :表明列的名稱 ,如:getDouble(「balance」)

                使用步驟:一、遊標向下移動一行

                               二、判斷是否有數據

                               三、獲取數據

                               while(rs.next()){int id = rs.getInt(1);}

五、PreparedStatement,執行SQL對象,Statement子類

            解決問題:SQL注入問題:在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接,會形成安全性問題

            預編譯SQL:參數使用?做爲佔位符

            步驟:一、導入驅動jar包

                     二、註冊驅動

                     三、獲取數據庫鏈接對象 Connection

                     四、定義sql

                     五、獲取執行sql語句對象 preparedStatement Connection.prepaereStatement(String sql)

                     六、給?賦值:setXXX(參數1,參數2):參數1:?的位置編號,從1開始,參數2:?的值

                     七、執行sql,接受返回結果,不須要傳遞sql語句

                     八、處理結果

                     九、釋放資源

                注意:後期都會使用preparedStatement來完成增刪改查的全部操做

                          一、能夠防止SQL注入

                          二、效率更高

public class Demo {

    public static void main(String[] args) throws Exception{
       Statement stme = null;
       Connection conn = null;
       try {
           Class.forName("com.mysql.jdbc.Driver");
           String sql="insert into Student value ('dd',18,'1992-07-05','1992-07-05')";
           conn=DriverManager.getConnection("jdbc:mysql:///db?useSSL=false","root","123");
           stme=conn.createStatement();
           int count =stme.executeUpdate(sql);
           if (count>0){
               System.out.println("成功");
           }else {
               System.out.println("失敗");
           }


       }catch (Exception e){
           e.printStackTrace();
       }
       
       if (conn != null){
           try {
               conn.close();
           }catch (Exception e){
               e.printStackTrace();
           }
       }
    }

}

JDBC控制事務:

使用Connection對象來管理事務

開啓事務:在執行sql以前開啓事務

提交事務:當全部sql都執行完提交事務

回滾事務:在catch中回滾事務

 

數據庫鏈接池:

概念:就是一個容器,存放數據庫鏈接的容器,當系統初始化好後,容器被建立,容器中會申請一些鏈接對象,當用戶來訪問數據庫時,從容器中獲取鏈接對象,用戶訪問完之後,會將鏈接對象歸還給容器

好處:一、節約資源

         二、用戶訪問高效

實現:標準接口:DataSource 

                方法:一、獲取鏈接:getConnection()

                         二、歸還鏈接:Connection.close()。若是鏈接對象是從數據庫鏈接池中獲取的,那麼調用Connection.close()方法,則不會再關閉鏈接,而是歸還鏈接

          通常咱們不去實現它,有數據庫廠商來實現

                一、C3P0

                        使用步驟:一、導入jar包,c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar

                                            注意還須要導入數據庫驅動包

                                       二、定義配置文件

                                            名稱:c3p0.properties 或者 c3p0-config.xml

                                            路徑:直接將文件放到src目錄下便可

                                        三、建立核心對象, 數據庫鏈接池對象 combopooledDataSource

                                        四、獲取鏈接:getConnection

                二、Druid

                            使用步驟:一、導入jar包,druid-1.0.9.jar

                                           二、定義配置文件,注意:配置文件格式爲priperties ,能夠叫任意名字,放置在任意目錄下

                                           三、加載配置文件,Properties

                                           四、獲取數據庫鏈接池對象:經過工廠來獲取,DruidDataSourceFactory

                                           五、獲取鏈接,getConnection

 

JDBCTemplate:

spring 框架對JDBC的簡單封裝,提供了一個JDBCTemplate對象簡化JDBC的開發

    步驟:一、導入jar包

             二、建立jdbcTemplate對象。依賴於數據源DataSource

                        jdbcTemplate template = new jabcTemplate(ds);

            三、調用jdbcTemplate的方法完成CRUD的操做

                        一、update():執行DML語句,增,刪,改語句

                        二、queryForMap():查詢結果將結果集封裝爲map集合,結果集長度只能是1。

                        三、queryForList():查詢結果將結果封裝爲list集合,將每一條記錄封裝問map集合,再添加到list集合

                        四、qurey():查詢結果,將結果封裝爲JavaBean對象

                                                參數:RowMapper

                                                            通常咱們使用BeanPropertyRowMapper實現類,實現自動封裝

                                                            例如:new BeanpropertyRowMapper<類型>(類型.class)

                        五、queryForObject:查詢結果,將結果封裝爲對象

                                                通常用於聚合函數的查詢結果

相關文章
相關標籤/搜索