Java-JDBC詳解

 
Java-JDBC詳解
 

JDBC常用的接口和類庫

1.DriverManager:驅動JDBC驅動的服務類

2.Connection:數據庫連接對象

3. Statement:執行sql的對象

4. PreparedStatement:執行sql的對象

5. ResultSet:結果集對象,封裝查詢結果

使用JDBC的步驟

登錄練習

JDBC工具類

登錄代碼

 創作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦。  


JDBC是Java程序連接數據庫的一個重要接口,是搭建Java程序與數據庫連接的重要橋樑,描述了一個訪問關係型數據庫的標準類庫,並且爲數據庫廠商提供了一個標準的體系結構。JDBC允許用戶訪問任何形式的表格數據,執行流程:1.連接數據源      2.爲數據庫傳遞查詢和更新指令   3.處理數據庫響應並返回的結果。

如何對常用的SQL語句還不熟悉那就先跳轉到這裏吧!!史上超強最常用SQL語句大全

JDBC常用的接口和類庫

 

1.DriverManager:驅動JDBC驅動的服務類

主要功能是註冊驅動、獲取Connection對象

 1. 註冊驅動:告訴程序該使用哪一個數據庫驅動jar

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


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

2. 獲取數據庫連接:

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

參數:

          url:指定連接的路徑

          user:用戶名

          password:密碼 

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

          細節:如果連接的是本機mysql服務器,並且mysql服務默認端口是3306,則url可以簡寫爲:jdbc:mysql:///數據庫名稱      

//獲取數據庫連接對象Connection
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");

2.Connection:數據庫連接對象

每一個Connection代表一個物理連接會話,要訪問數據庫,必須先獲得數據庫連接。

常用方法:

       1. 獲取執行sql 的對象

              Statement createStatement()

              PreparedStatement prepareStatement(String sql)  

       2. 管理事務:

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

             提交事務:commit() 

             回滾事務:rollback() 

3. Statement:執行sql的對象

Statemet是一個執行sql語句的工具接口,該對象既可以執行DDL、DCL語句,也可以執行DML語句,當執行SQL查詢時,它會返回查詢到的結果集。

主要方法

                1. boolean execute(String sql) :該方法可以執行任意的sql語句。瞭解即可  

                2. int executeUpdate(String sql) :執行DML(insert、update、delete)語句、DDL(create,alter、drop)語句

                       返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功

                       返回值>0的則執行成功,反之,則失敗。

                3. ResultSet executeQuery(String sql)  :執行DQL(select)語句

                       該方法只能用於執行查詢語句,並返回查詢結果對應的ResultSet對象。 

 

4. PreparedStatement:執行sql的對象

PreparedStatement是一個預編譯的Statement對象,PreparedStatement是Statement的子接口,它允許數據庫預編譯SQL語句,以後每次只需改變SQL命令參數,避免數據庫每次都編譯SQL語句,因此性能更好。預編譯SQL解決了SQL注入的問題, 預編譯的SQL:參數使用?作爲佔位符。

常用方法

        boolean execute():執行此PreparedStatement對象中的SQL語句,該語句可以是任何類型的SQL語句。

        int executeUpdate() :執行此PreparedStatement對象中的SQL語句,它必須是一個SQL數據操縱語言(DML)語句,比如INSERTUPDATE或 DELETE; 或不返回任何內容的SQL語句,例如DDL語句。

       ResultSet executeQuery() :在此PreparedStatement對象中執行SQL查詢,並返回ResultSet查詢生成的對象。

由於PreparedStatement是Statement的子接口,所以他們的常用方法很一致。PreparedStatement主要是預編譯SQL,解決了SQL注入的問題,提高性能。

5. ResultSet:結果集對象,封裝查詢結果

ResultSet是一個結果對象,該對象包含查詢結果的方法,ResultSet可以通過索引或列名類獲得列中的數據。

常用方法

            boolean next(): 遊標向下移動一行,判斷當前行是否是最後一行末尾(是否有數據),如果是,則返回false,如果不是則返回true

            void beforeFirst():將ResultSet的記錄指針定位到首行之前,初始位置。

            boolean absolute(int row):將結果集的記錄指針移動到第row行。

            getXxx(參數):獲取數據

                 Xxx:代表數據類型   如: int getInt() ,    String getString()

                 參數:

                    1. int:代表列的編號,從1開始   如: getString(1)

                    2. String:代表列名稱。 如: getDouble("balance")

使用JDBC的步驟

靜態編譯SQL步驟:使用Statement

 

 

1. 導入驅動jar包 mysql-connector-java-5.1.37-bin.jar

         1.複製mysql-connector-java-5.1.37-bin.jar到項目的libs目錄下

         2.右鍵-->Add As Library

  2. 註冊驅動

  3. 獲取數據庫連接對象 Connection

  4. 定義sql

  5. 獲取執行sql語句的對象 Statement

  6. 執行sql,接受返回結果

  7. 處理結果

  8. 釋放資源

動態編譯SQL步驟:使用PreparedStatement對象

 

 1. 導入驅動jar包 mysql-connector-java-5.1.37-bin.jar

 2. 註冊驅動

 3. 獲取數據庫連接對象 Connection

 4. 定義sql

          * 注意:sql的參數使用?作爲佔位符。 如:select * from user where username = ? and password = ?;

  5. 獲取執行sql語句的對象 PreparedStatement  Connection.prepareStatement(String sql) 

  6. 給?賦值:

          * 方法: setXxx(參數1,參數2)

                  * 參數1:?的位置編號 從1 開始

                  * 參數2:?的值

  7. 執行sql,接受返回結果,不需要傳遞sql語句

  8. 處理結果

  9. 釋放資源

public static void main(String[]args)throwsException{
	//1.導入驅動jar包
	//2.註冊驅動
	Class.forName("com.mysql.jdbc.Driver");
	//3.獲取數據庫連接對象Connection
	Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3","root","root");
	//4.定義SQL
	Stringsql="update emp set salary=8001 WHERE id=1001;";
	//5.執行SQL語句對象Statement
	Statementstmt=conn.createStatement();
	//6.執行SQL,接收返回結果
	intcount=stmt.executeUpdate(sql);
	//7.處理結果
	System.out.println(count);
	//8.釋放資源
	stmt.close();
	conn.close();
}

登錄練習

JDBC工具類

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具類
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的讀取,只需要讀取一次即可拿到這些值。使用靜態代碼塊
     */
    static{
        //讀取資源文件,獲取值。

        try {
            //1. 創建Properties集合類。
            Properties pro = new Properties();

            //獲取src路徑下的文件的方式--->ClassLoader 類加載器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL res  = classLoader.getResource("jdbc.properties");
            String path = res.getPath();
          
            //2. 加載文件
            pro.load(new FileReader(path));

            //3. 獲取數據,賦值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //4. 註冊驅動
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 獲取連接
     * @return 連接對象
     */
    public static Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url, user, password);
    }

    /**
     * 釋放資源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt,Connection conn){
        if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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


    /**
     * 釋放資源
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs,Statement stmt, Connection conn){
        if( rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

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

}

登錄代碼

public class DemoLogin {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入賬號:");
        String userName = sc.nextLine();
        System.out.println("請輸入密碼:");
        String password = sc.nextLine();
        boolean flag = new DemoLogin().login2(userName, password);
        if (flag) {
            System.out.println("登錄成功!");
        } else {
            System.out.println("賬號或密碼錯誤!");
        }

    }

    public boolean login(String name, String password) {
        //賬號密碼正確性校驗
        if (name == null || password == null) {
            return false;
        }
        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConn();
            statement = conn.createStatement();
            String sql = "SELECT*FROM login WHERE username='" + name + "'andpassword='" + password + "';";
            System.out.println(sql);
            resultSet = statement.executeQuery(sql);
            return resultSet.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCUtils.close(conn, statement, resultSet);
        }
        return false;
    }


    //使用PreparedStatement傳參
    public boolean login2(String name, String password) {
        //賬號密碼正確性校驗
        if (name == null || password == null) {
            return false;
        }

        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConn();
            String sql = "SELECT*FROM login WHERE username=? and password=?;";
            //預編譯SQL
            statement = conn.prepareStatement(sql);
            System.out.println(sql);
            //給參數賦值
            statement.setString(1, name);
            statement.setString(2, password);
            //執行查詢
            resultSet = statement.executeQuery();
            return resultSet.next();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            JDBCUtils.close(conn, statement, resultSet);
        }
        return false;

    }
}

重磅福利:如果覺得以上代碼很麻煩請跳轉到下一篇博客《Java-Spring JDBC》。你會發現只要會寫SQL語句就行了,剩下的框架都幫你做好了。

創作不易,如果本篇博客對您有一定的幫助,大家記得留言+點贊哦。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章