JDBC 基礎用法學習

JDBC概述

  java 數據庫連接,sun公司退出的 java 訪問數據庫的標準規範接口java

  是一種用於執行SQL語句的 java APImysql

  能夠做爲多種關係數據庫提供統一接口git

  是一組 java 工具類和接口的組成。github

JDBC 原理

  

  JDBC是接口,驅動接口的實現,沒有驅動沒法完成數據庫連接,而不能操做數據庫。sql

  每一個數據庫廠商都須要提供本身的驅動,用來連接本身公司的數據庫數據庫

  也就是說,驅動通常由數據庫廠商提供。工具

  固然還有第三方公司專門爲某一數據庫提供驅動,這樣的驅動每每不會是開源免費的!單元測試

  例如:mysql 驅動包 是 mysql-connector-java-5.1.28-bin.jar測試

   

建立項目

1. 修改項目的編碼格式爲 UTF-8

  點擊 window -> workspace -> 修改UTF-8  點擊應用 ok。編碼

  

2. 建立新項目

  

 3.  導入jar包

  首先new一個文件夾

  建立一個 lib 文件夾存放 jar 包

  將 mysql-connector-java-5.1.28-bin.jar 放入 lib 文件夾

  而後:

   

  完成以後

  

4. 單元測試

  先建立一個包,而後創建一個類

  

編輯代碼

package cn.study.test;

import org.junit.Test;

public class TestJunit {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
    }
    
    @Test
    public void testJunit(){
        System.out.println("hello junit");
    }
    
}

  

  右擊 @Test 點擊運行

  

  

  修改代碼

package cn.study.test;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestJunit {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
    }
    
    @Test
    public void testJunit(){
        System.out.println("hello junit");
    }
    
    @Before
    public void testBefore() {
        System.out.println("before!");
    }
    
    @After
    public void testAfter() {
        System.out.println("after!");
    }

}

  

 JDBC開發步驟

  1. 註冊驅動

  2. 得到連接

  3. 得到語句執行者

  4. 執行 sql 語句

  5. 處理結果

  6. 釋放資源

API詳解:註冊驅動

代碼:

class.forName(「com.mysql.jdbc.Driver」)

分析步驟1 :

  JDBC規範定義驅動接口:java.sql.Driver

  mysql 驅動包提供了實現類:com.mysql.jdbc.Driver

分析步驟2:

  DriverManager工具類提供註冊驅動的方法

  方法的參數是 java.sql.Driver 因此咱們能夠經過以下語句進行註冊

  DriverManager.registerDriver(new com.mysql.jdbc.Driver());

  以上代碼不推薦使用,存在兩方面不足

    1. 硬編碼,後期不易於拓展和維護

    2. 驅動被註冊兩次

分析步驟3:

  一般開發咱們使用 Class.forName() 加載一個使用字符串描述的驅動類。

  若是使用Class.forName() 將類加載到內存,該類的靜態代碼將自動執行。

  經過查詢 com.mysql.jdbc.Driver 源碼,咱們發現Driver類主動將本身進行註冊。

 API 詳解:獲取連接

代碼:

Connection con=DriverManager.getConnection{"jdbc:mysql://localhost:3306/mydb1","root","123456"};

  獲取連接須要使用方法 DriverManager.getConnection(url , username , password)

  URL 表示連接數據庫的位置(網址)

    user 表示用戶名

    password :表示數據庫密碼

    jdbc:mysql://localhost:3306/mydb1

  URL由三部分組成,每部分用逗號隔開

    第一部分 jdbc 爲固定的

    第二部分是數據庫名稱

    第三部分爲數據庫廠商制定:數據庫服務地址ip、端口、數據庫名稱。

  拓展參數:

jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8

 API 詳解:獲取語句執行

String sql = "insert into category(cid,cname) value ( 'c107' ,  '分類' )"

Statemet 語句執行代碼: 

Statement stmt = con.createStatement();

執行sql語句:

執行  insert   update   delete 語句

int executeUpdate(string sql); 

執行select語句

ResultSet executeQuery( string sql );

執行 select 語句返回 true ,執行其餘語句返回 false

boolean execute(string sql); 

  若是返回true 須要使用 getResultSet() 獲取查詢結果。

  若是返回 false 須要使用 getUpdateCount() 獲取影響行數。

執行批處理:

addBatch(string sql);

clearBath();

executeBatch();

若是有參數須要在sqql語句中進行拼湊,存在sql注入問題。

API 詳解:處理結果集

ResultSet 實際上就是一張二維表格,內部有一個行光標,光標默認位置在第一行上方,咱們能夠調用 rs 對象的 next() 方法把 行光標向下移動一行,當第一次調用 next() 的時候,行光標就到了第一行記錄的位置,這時候就能夠使用 resultSet 提供的 getXXX(int col)方法來獲取指定的列數據了。

光標移動到第一行

rs.next();  

獲取第一行第一列數據

rs.getInt(1);  

  

經常使用的方法有:

獲取任意對象

object getObject(int col) 

獲取字符串

string getString(inr col) 

獲取整形

int getInt(int col) ;

 獲取雙精度浮點數

double getDouble(int col);

API 詳解:釋放資源

與IO流同樣,使用後的東西都須要關閉!關閉的順序是先獲得的後關閉,後獲得的先關閉!

rs.close();

stmt.close();

con.close();

案例代碼:

package cn.study.test;

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

import java.sql.Connection;

import java.sql.Statement;

import org.junit.Test;

/**
 * 測試sql注入問題
 * @author Administrator
 *
 */
public class TestLogin {

    @Test
    public void testLogin() {
        try {
            login("wjw", "20");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
    
    
    /**
     * 用戶登陸方法
     * @param username
     * @param password
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void login(String username,String password) throws ClassNotFoundException, SQLException {
        
        // 1. 註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbtest","root","123456");
        // 3. 建立執行sql語句的對象
        Statement stmt = conn.createStatement();
        // 4. 書寫sql語句
        String sql = "select * from student where "+"name='"+username+"' and age='"+password+"'";
        // 5. 執行sql語句
        ResultSet rs =  stmt.executeQuery(sql);
        // 6.對結果集進行處理
        if (rs.next()) {
            System.out.println("恭喜你 "+username +" 登陸成功!");
            System.out.println(sql);
        }else{
            System.out.println("帳號或密碼錯誤!");
        }
        // 7. 釋放資源
        if (rs!=null) rs.close();
        if (stmt!=null) stmt.close();
        if (conn!=null) conn.close();
    }
}

sql 注入問題

防止sql攻擊

  過濾用戶輸入的數據是否包含非法字符。—— 很難作到

  分佈校驗,先使用用戶名來查詢用戶,若是查找到了在比較密碼。

  使用 PrepareStatement。

PrepareStatement是什麼?

  PrepareStatement 叫預編譯聲明。

  PrepareStatement是Statement的子接口,能夠使用 PrepareStatement 來替代 Statement。

PrepareStatement 的好處:

  防止sql攻擊

  提升代碼可讀性和可維護性

  提升效率

PreparedStatement的使用:

  使用 Connection 的 prepareStatement(string sql):即建立它時就讓他與一條sql鎖定。

  調用PrepareStatement 的 setXXX() 系列方法爲問號設置值。

  調用 executeUpdate() 或 executeQuery() 方法,但要注意,調用沒有參數的方法。

package cn.study.test;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.Connection;

import java.sql.Statement;

import org.junit.Test;

/**
 * 測試sql注入問題
 * 
 * @author Administrator
 * 
 */
public class TestLogin {

    @Test
    public void testLogin() {
        try {
            login("wjw", "20");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 用戶登陸方法
     * 
     * @param username
     * @param password
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void login1(String username, String password)
            throws ClassNotFoundException, SQLException {

        // 1. 註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        // 2. 獲取連接
        Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/dbtest", "root", "123456");
        // 3. 編寫sql語句
        String sql = "select * from student where name=? and age=?";
        // 4. 建立預處理對象
        PreparedStatement pstmt = conn.prepareStatement(sql);
        // 5. 設置參數
        pstmt.setString(1, "fasda");
        pstmt.setString(2, "365351");
        // 6. 執行查詢編輯
        ResultSet rs = pstmt.executeQuery();
        // 7.對結果集進行處理
        if (rs.next()) {
            System.out.println("恭喜你 " + username + " 登陸成功!");
            System.out.println(sql);
        } else {
            System.out.println("帳號或密碼錯誤!");
        }
        // 8. 釋放資源
        if (rs != null)
            rs.close();
        if (pstmt != null)
            pstmt.close();
        if (conn != null)
            conn.close();
    }

}

 

 分頁查詢 limit

(limit , 2 , 2)第一個起始位置,要查詢(第幾頁-1)*第二個參數,   第二個是數量。

 

項目代碼https://github.com/wjw1014/JavaMysqlStudy/tree/master/my_JDBC (小白操做,僅供參考!)

相關文章
相關標籤/搜索