數據庫-JDBC

JDBC概述

咱們學習了數據庫,數據庫實現了數據的持久化,但咱們最終要在程序裏處理數據啊,那java代碼中怎麼去訪問數據庫讀寫數據呢?java

這就要用到sun公司設定的一套數據庫標準了,這套標準就是JDBC(Java Database Connectivity)。但它只是規範,不作具體實現。因而數據庫廠商又根據JDBC標準,實現自家的驅動Driver。如:mysql驅動com.mysql.cj.jdbc.Driver,Oracle的驅動oracle.jdbc.OracleDriver。有了這套解決方案,java就能夠訪問數據庫中的數據了。mysql

public interface Connection  extends Wrapper, AutoCloseable {} 
public interface Statement extends Wrapper, AutoCloseable {}
public interface PreparedStatement extends Statement {}
public interface CallableStatement extends PreparedStatement {} 
public interface ResultSet extends Wrapper, AutoCloseable {}

調用方式有三種:
Statement語句、PreparedStatement預處理語句、CallableStatement存儲過程,推薦使用第二種PreparedStatement,防止SQL注入,其也是預編譯性能高。sql

JDBC的三種調用

Statement語句:
步驟:
1.加載驅動
2.建立數據庫鏈接connection
3.建立sql語句對象(statement語句,preparestatement預編譯語句,call存儲過程X)
4.執行查詢語句,返回結果集ResultSet
5.利用查詢到的結果集對象進行數據處理數據庫

package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test3JDBC {
    public static void main(String[] args) throws Exception {
        //基本查詢語句
 method();
    }
    public static void method() throws Exception {
        //第一步,須要加載驅動
 String driver = "com.mysql.jdbc.Driver";
        //第二步,添加連接,用戶名,密碼
 String url = "jdbc:mysql://localhost:3306/jtdb2007";
        String usename="root";
        String  password="1234";
        //建立driver聲明的類的全路徑的Class類對象
 Class.forName(driver);
        //第三步,建立一個數據庫連接connection
 Connection cn = DriverManager.getConnection(url,usename,password);
        //第四步,建立語句對象(statement語句,preparestatement預編譯語句,call存儲過程X)
 Statement state =  cn.createStatement();//建立Statement對象,該對象來將sql發送到數據庫。
 //第五步,執行查詢語句,返回結果集ResultSet
 String sql = "select * from emp";
        ResultSet rs = state.executeQuery(sql);
        int cols = rs.getMetaData().getColumnCount();//獲取列的數量
 for (int i = 1; i <=cols ; i++) {
            //第六步,獲取列名,元數據
 System.out.print(rs.getMetaData().getColumnName(i)+"t");//ResultSetMetaData接口,獲取指定列的名稱
 }
        //第七步,for循環打印表字段內容
 while(rs.next()){
            System.out.println();
            for (int i = 1; i <=cols ; i++) {
                System.out.print(rs.getString(i)+"t");
            }
        }
    }
}

PreparedStatement預處理語句:oracle

package test;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Test2JDBC {
    @Test //預編譯查詢語句
 public <PrepareStatement> void prepareStatement() throws Exception {
        String driver = "com.mysql.jdbc.Driver";  //驅動
 String url = "jdbc:mysql://localhost:3306/jtdb2007";  //鏈接
 //預編譯sql中用?做爲佔位符,未來會被真實值替換掉
 String sql = "select * from dept where deptno = ?";
        Class.forName(driver);
        Connection cn = DriverManager.getConnection(url, //獲取連接
 "root","1234");
        //帶參數
 PreparedStatement ps=cn.prepareStatement(sql);  //返回預編譯對象
 ps.setString(1,"2");//?位置,參數值
 //查詢
 ResultSet rs = ps.executeQuery();
        //打印列標題
 int cols = rs.getMetaData().getColumnCount();  //列的總數
 for (int i = 1; i <=cols ; i++) {
            //打印列的名稱
 System.out.print(rs.getMetaData().getColumnName(i)+"t");
        }
        //打印數據
 while(rs.next()){ //每次向下取一條,直到結尾
 System.out.println();  //換行
 for (int i = 1; i <=cols ; i++) {
                System.out.print(rs.getString(i)+"t");
            }
        }
    }
}

Procedure 存儲過程:app

package jdbc;

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

public class TestProcedure {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String driver = "oracle.jdbc.OracleDriver";
        String url = "jdbc:oracle:thin:@localhost:1521:xe";        //注意SID
        String sql = "{call paging_cursor(?,?,?,?,?,?)}";
        
        String user = "ht";
        String password = "ht";
        
        Class.forName(driver);
        Connection cn = DriverManager.getConnection(url, user, password);
        CallableStatement cs = cn.prepareCall(sql);
        
        // 給in?賦值
        cs.setString(1, "emp");// 傳表名
        cs.setInt(2, 3);    // 傳入pagesize,每頁顯示多少條記錄
        cs.setInt(3, 2);    // 傳入pagenow,顯示第幾頁。
        
        // 給out?註冊
        cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
        cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
        cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER);

        // 執行
        cs.execute();

        // 這裏是關鍵所在,java沒有接收結果集的get方法,因此只能用getObject來接收結果集,接收到後須要使用ResultSet強轉才能夠
        ResultSet rs = (ResultSet) cs.getObject(4);
        // 循環取出
        while (rs.next()) {
            System.out.println(rs.getString("ename") + " " + rs.getString("sal"));
        }
        // 取出總記錄數
        int rowCount = cs.getInt(5);
        // 取出總頁數
        int pageCount = cs.getInt(6);

        System.out.println("共有記錄:" + rowCount + "條!   " + "共有記錄:" + pageCount + "頁!");

    }
}

Statement和PreparedStatement的異同

同:二者均可建立執行sql語句的對象性能

異:PreparedStatement能夠設置佔位符,預編譯,編譯效率高,它可以經過設置參數,指定相應的值;
Statement使用的是字符串拼接的方式,具有注入攻擊的風險。學習

execute和executeUpdate的區別

相同點:都可以執行增長、刪除、修改等操做。url

不一樣點:rest

一、execute能夠執行查詢語句,而後經過getResult把結果取出來。executeUpdate不能執行查詢語句。

二、execute返回Boolean類型,true表示執行的是查詢語句,false表示執行的insert、delete、update等。executeUpdate的返回值是int,表示有多少條數據受到了影響。

相關文章
相關標籤/搜索