JDBC開發,數據庫的鏈接

 

JDBC開發步驟

  1.建完工程後,右擊工程,new,新建一個文件夾Folder,裝jar包,
        2.將下載好的驅動包打開,找到jar文件,CTRL+C,選中裝jar包的文件夾,CTRL+V,
        3.選中添加的jar,右鍵,Build Path,Add to Build Path
        4.新建一個包,再新建一個自定義類
        5.註冊驅動:Class.forName("com.mysql.jdbc.Driver");throws異常
        6.得到連接,
          數據庫的url:jdbc:mysql://localhost:3306/數據庫名    
             //解決中文亂碼:在url中數據庫名後加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE        
           Connection con = DriverManager.getConnection("");
          導包,java.sql,throws異常
             
        7.得到語句執行平臺
                    經過鏈接對象獲取對SQL語句的執行者對象
                    Statement stm=連接對象.createStatement();
        8.執行sql語句
                    使用執行者對象,向數據庫執行SQL語句
                    獲取到數據庫的執行後的結果
                    
例子:java

         

package com.oricle.Demo01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo01 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        /*        1.建完工程後,右擊工程,new,新建一個文件夾Folder,裝jar包,
         *         2.將下載好的驅動包打開,找到jar文件,CTRL+C,選中裝jar包的文件夾,CTRL+V,
         *         3.選中添加的jar,右鍵,Build Path,Add to Build Path 
         *         4.新建一個包,再新建一個自定義類
         *         5.註冊驅動:Class.forName("com.mysql.jdbc.Driver");throws異常
         *         6.得到連接,
             *         數據庫的url:jdbc:mysql://localhost:3306/數據庫名    
             *         //解決中文亂碼:在url中數據庫名後加?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE        
         *             Connection con = DriverManager.getConnection("");
         *             導包,java.sql,throws異常
         *             
                7.得到語句執行平臺
                    經過鏈接對象獲取對SQL語句的執行者對象
                    Statement stm=連接對象.createStatement();
                8.執行sql語句
                    使用執行者對象,向數據庫執行SQL語句
                    獲取到數據庫的執行後的結果
                    
         *         
        */
            //1註冊驅動
            Class.forName("com.mysql.jdbc.Driver");
            //2得到連接
            String url="jdbc:mysql://localhost:3306/fuxi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE";
            String user="root";
            String password="123456";
            Connection con=DriverManager.getConnection(url, user, password);
            //3得到語句執行平臺
            Statement stm=con.createStatement();
            //4.執行語句
            String sql="delete from sort where sid=5";
            stm.execute(sql);//增刪改
            //5.針對於查詢操做
            //6,先開的後關
            stm.close();
            con.close();
            
            
    }

}

 用集合來裝從數據庫裏面獲取的數據mysql

自定義一個類,類名和數據庫名一致sql

package com.oricle.demo01;

public class sort {
    private int sid;
    private String sname;
    private String sdesc;
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSdesc() {
        return sdesc;
    }
    public void setSdesc(String sdesc) {
        this.sdesc = sdesc;
    }
    @Override
    public String toString() {
        return "sort [sid=" + sid + ", sname=" + sname + ", sdesc=" + sdesc + "]";
    }
    
}

測試類:數據庫

package com.oricle.demo01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class demo03 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1註冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取鏈接
        String url="jdbc:mysql://localhost:3306/fuxi";
        String user="root";
        String password="123456";
        Connection co=DriverManager.getConnection(url, user, password);
        // 3得到預處理對象
        Statement s=co.createStatement();
        // 4 SQL語句佔位符設置實際參數
        // 5執行SQL語句

        String sql="select *from sort";
        ResultSet rs=s.executeQuery(sql);
        
        //6處理結果集
        ArrayList<sort> as=new ArrayList<sort>();//建立集合用來裝新建sort對象
        //遍歷
        while(rs.next()){
            sort so=new sort();//自定義一個類,類名和數據庫名一致,建立對象
            so.setSid(rs.getInt("sid"));//把獲取當前行的分類id利用set方法存入對象的成員變量中,
            so.setSname(rs.getString("sname"));
            so.setSdesc(rs.getString("sdesc"));
            as.add(so);//把該對象添加到集合as中

        }
        System.out.println(as);//打印集合裏面內容
        
        //7釋放資源
        rs.close();
        s.close();
        co.close();
        
    }

}

註冊驅動服務器

代碼:Class.forName("com.mysql.jdbc.Driver");

JDBC規範定義驅動接口:java.sql.Driver,MySql驅動包提供了實現類:com.mysql.jdbc.Driveride

DriverManager工具類,提供註冊驅動的方法 registerDriver(),方法的參數是java.sql.Driver,因此咱們能夠經過以下語句進行註冊:工具

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

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

  1. 硬編碼,後期不易於程序擴展和維護
  2. 驅動被註冊兩次。

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

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

查詢com.mysql.jdbc.Driver源碼,發現Driver類「主動」將本身進行註冊,重複

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());//註冊
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
……
}

得到連接

代碼:Connection con = DriverManager.getConnection
(「jdbc:mysql://localhost:3306/mydb」,」root」,」root」);

獲取鏈接須要方法

 DriverManager.getConnection(url,username,password);

  三個參數分別表示,url 須要鏈接數據庫的位置(網址) user用戶名  password 密碼

  下面是mysql的url:

jdbc:mysql://localhost:3306/mydb

  JDBC規定url的格式由三部分組成,每一個部分中間使用冒號分隔。

    第一部分是jdbc,這是固定的;

    第二部分是數據庫名稱,那麼鏈接mysql數據庫,第二部分固然是mysql了;

    第三部分是由數據庫廠商規定的,咱們須要瞭解每一個數據庫廠商的要求,mysql的第三部分分別由數據庫服務器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。

得到語句執行平臺

String sql = "某SQL語句";
獲取Statement語句執行平臺:Statement stmt = con.createStatement();
經常使用方法:
  int executeUpdate(String sql); --執行insert update delete語句.
  ResultSet executeQuery(String sql); --執行select語句.
  boolean execute(String sql); --執行select返回true 執行其餘的語句返回false.

 

 

SQL注入問題

假設有登陸案例SQL語句以下:

SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸的密碼;

  此時,當用戶輸入正確的帳號與密碼後,查詢到了信息則讓用戶登陸。可是當用戶輸入的帳號爲XXX 密碼爲:XXX’  OR ‘a’=’a時,則真正執行的代碼變爲:

SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

  此時,上述查詢語句時永遠能夠查詢出結果的。那麼用戶就直接登陸成功了,顯然咱們不但願看到這樣的結果,這即是SQL注入問題。

爲此,咱們使用PreparedStatement來解決對應的問題。

package com.oricle.demo01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class demo05 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // TODO Auto-generated method stub
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/fuxi";
        String user="root";
        String password="123456";
        Connection co=DriverManager.getConnection(url, user, password);
        Scanner sc=new Scanner(System.in);
        System.out.println("請輸入用戶名:");
        String uname=sc.next();
        System.out.println("請輸入密碼:");
        String pwd=sc.next();
        String sql="select * from user where uname=? and pwd=?";
        PreparedStatement pst=co.prepareStatement(sql);
        
        pst.setString(1, uname);
        pst.setString(2,pwd);
        
      ResultSet rs=pst.executeQuery();
        
        while(rs.next()){
            System.out.println(rs.getString("uname")+"..."+rs.getString("pwd"));
        }
        
        rs.close();
        pst.close();
        co.close();
    }

}

?佔位符,插入數據時,用逗號隔開

String sql = "insert into sort(sid,sname) values(?,?)";
相關文章
相關標籤/搜索