明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

原生JDBC是如何使用的?

[摘要]JDBCJava DataBase Connectivity,java數(shù)據(jù)庫連接,是一種用于執(zhí)行SQL語句的Java API。JDBC是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范,可以為不同的關(guān)系型數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的接口和類組成。驅(qū)動(dòng)JDBC需要連接驅(qū)動(dòng),驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信,...
JDBC
Java DataBase Connectivity,java數(shù)據(jù)庫連接,是一種用于執(zhí)行SQL語句的Java API。
JDBC是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范,可以為不同的關(guān)系型數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的接口和類組成。

驅(qū)動(dòng)
JDBC需要連接驅(qū)動(dòng),驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動(dòng)軟件,通過軟件可以與該設(shè)備進(jìn)行通信。

JDBC規(guī)范(掌握四個(gè)核心對象
DriverManager:用于注冊驅(qū)動(dòng)
Connection: 表示與數(shù)據(jù)庫創(chuàng)建的連接
Statement: 操作數(shù)據(jù)庫sql語句的對象
ResultSet: 結(jié)果集或一張?zhí)摂M表

使用JDBC技術(shù),通過mysql提供的驅(qū)動(dòng)程序,操作數(shù)據(jù)庫實(shí)現(xiàn)步驟:
1.注冊驅(qū)動(dòng)
告知JVM我們使用的是什么驅(qū)動(dòng)程序(mysql,oracle....)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用
原因有2個(gè):
>導(dǎo)致驅(qū)動(dòng)被注冊2次。
>強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動(dòng)jar
解決辦法:
Class.forName("com.mysql.jdbc.Driver");
2.獲取數(shù)據(jù)庫的連接
數(shù)據(jù)庫是TCP程序服務(wù)器,連接服務(wù)器(通過3次握手)
就相當(dāng)于建立了一條java程序通往數(shù)據(jù)庫服務(wù)器的連接通路
static Connection getConnection(String url, String user, String password)
試圖建立到給定數(shù)據(jù)庫 URL 的連接。
參數(shù)說明:url 需要連接數(shù)據(jù)庫的位置(網(wǎng)址) user用戶名 password 密碼
例如:getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司與數(shù)據(jù)庫廠商之間的一種協(xié)議。
jdbc:mysql://localhost:3306/day06
協(xié)議子協(xié)議 IP :端口號數(shù)據(jù)庫
mysql: jdbc:mysql://localhost:3306/day04或者jdbc:mysql:///day14(默認(rèn)本機(jī)連接)
oracle數(shù)據(jù)庫: jdbc:oracle:thin:@localhost:1521:sid
3.獲取執(zhí)行者對象
執(zhí)行SQL語句的對象,作用就是執(zhí)行SQL
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中。所有與數(shù)據(jù)庫交互都是基于連接對象的。
Statement createStatement(); //創(chuàng)建操作sql語句的對象
4.執(zhí)行SQL語句,獲取結(jié)果集
使用執(zhí)行者對象執(zhí)行SQL語句
獲取SQL語句的結(jié)果集(增刪改:整數(shù),執(zhí)行有效行數(shù) 查詢:返回的就是一個(gè)結(jié)果集)
常用方法:
? int executeUpdate(String sql); --執(zhí)行insert update delete語句.
? ResultSet executeQuery(String sql); --執(zhí)行select語句.
? boolean execute(String sql); --僅當(dāng)執(zhí)行select并且有結(jié)果時(shí)才返回true,執(zhí)行其他的語句返回false.
5.處理結(jié)果集
ResultSet實(shí)際上就是一張二維的表格,我們可以調(diào)用其boolean next()方法指向某行記錄,當(dāng)?shù)谝淮握{(diào)用next()方法時(shí),便指向第一行記錄的位置,這時(shí)就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開始不同個(gè),列從1開始)來獲取指定列的數(shù)據(jù):
rs.next();//指向第一行
rs.getInt(1);//獲取第一行第一列的數(shù)據(jù)
常用方法:
? Object getObject(int index) / Object getObject(String name) 獲得任意對象
? String getString(int index)/ String getString(String name) 獲得字符串
? int getInt(int index)/int getInt(String name) 獲得整形
? double getDouble(int index)/ double getDouble(String name) 獲得雙精度浮點(diǎn)型
6.釋放資源
與IO流一樣,使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。
使用JDBC對數(shù)據(jù)庫進(jìn)行增刪改查代碼演示:

  1 public static void main(String[] args) throws Exception {  2         //1.注冊驅(qū)動(dòng)  3         Class.forName("com.mysql.jdbc.Driver");  4         //2.獲取數(shù)據(jù)庫連接  5         String url = "jdbc:mysql://localhost:3306/mybase4";  6         String user = "root";  7         String password = "root"; 
  8         Connection conn = DriverManager.getConnection(url, user, password);  9         //3.獲取執(zhí)行者對象 10         Statement stat = conn.createStatement(); 11         //調(diào)用更新數(shù)據(jù)的方法 12         //update(stat); 13         //調(diào)用刪除數(shù)據(jù)的方法 14         //delete(stat); 15         //調(diào)用增加數(shù)據(jù)的方法 16         //insert(stat); 17         //調(diào)用查詢數(shù)據(jù)的方法 18         select(stat); 19         //6.釋放資源 20         stat.close(); 21         conn.close(); 22     } 23  24     /* 25      * 使用JDBC技術(shù),查詢數(shù)據(jù)庫中表的數(shù)據(jù) 26      */ 27     private static void select(Statement stat) throws Exception { 28         //拼接sql語句 29         String sql = "SELECT * FROM category"; 30         /* 31          * 4.執(zhí)行sql語句 32          * 使用Statement中的方法 33          * ResultSet executeQuery(String sql) 執(zhí)行給定的 SQL 語句,該語句返回單個(gè) ResultSet 對象。 
 34          * 返回值ResultSet標(biāo)準(zhǔn)接口的實(shí)現(xiàn)類對象,實(shí)現(xiàn)類對象由mysql驅(qū)動(dòng)提供,可以使用ResultSet接口接收 35          */ 36         ResultSet rs = stat.executeQuery(sql); 37         System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@1acb189 38         /* 39          * 5.處理結(jié)果 40          * ResultSet中有一個(gè)方法 41          * boolean next() 將光標(biāo)從當(dāng)前位置向前移一行。 42          * 如果新的當(dāng)前行有效,則返回 true;如果不存在下一行,則返回 false 
 43          * 如果有結(jié)果集返回true,若果沒有結(jié)果集返回false 44          * 相當(dāng)于迭代器中的hasNext方法 45          */ 46         while(rs.next()){ 47             /* 48              * next返回true,有結(jié)果集 49              * 取出結(jié)果集 50              * 使用ResultSet中的方法getXXX(參數(shù)); 51              * 參數(shù): 52              *     int columnIndex:列所在的索引,從1開始 53              *     String columnLabel:列名 54              * 注意: 55              *     如果使用getInt,getDouble指定數(shù)據(jù)類型的方法,返回值就是對應(yīng)的數(shù)據(jù)類型 56              *     如果使用getObject方法返回值是object類型(只是打印可用) 57              * 如果使用getString方法返回值是String類型 58              */ 59             /*int i1 = rs.getInt(1); 60             String s2 = rs.getString(2); 61             System.out.println(i1+"\t"+s2);*/ 62              63             //System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)); 64             System.out.println(rs.getObject("cid")+"\t"+rs.getObject("cname")); 65             //5.釋放資源 66             rs.close(); 67         } 68     } 69  70     /* 71      * 使用JDBC技術(shù),對數(shù)據(jù)庫中的表數(shù)據(jù)進(jìn)行增加 72      */ 73     private static void insert(Statement stat) throws SQLException { 74         //拼接sql語句 75         String sql = "INSERT INTO category(cname) VALUES('玩具')"; 76         //4.執(zhí)行sql語句 77         int row = stat.executeUpdate(sql); 78         //5.處理結(jié)果 79         if(row>0){ 80             System.out.println("增加數(shù)據(jù)成功!"); 81         }else{ 82             System.out.println("增加數(shù)據(jù)失敗!"); 83         } 84          85     } 86  87     /* 88      * 使用JDBC技術(shù),對數(shù)據(jù)庫中的表數(shù)據(jù)進(jìn)行刪除 89      */ 90     private static void delete(Statement stat) throws Exception { 91         //拼接sql語句 92         String sql = "DELETE FROM category WHERE cid=5"; 93         //4.執(zhí)行sql語句 94         int row = stat.executeUpdate(sql); 95         //5.處理結(jié)果 96         if(row>0){ 97             System.out.println("刪除數(shù)據(jù)成功!"); 98         }else{ 99             System.out.println("刪除數(shù)據(jù)失敗!");100         }101     }102 103     /*104      * 使用JDBC技術(shù),對數(shù)據(jù)庫中的表數(shù)據(jù)進(jìn)行更新105      */106     private static void update(Statement stat) throws Exception {107         //拼接sql語句108         String sql = "UPDATE category SET cname='鞋帽' WHERE cid=6";109         //4.執(zhí)行sql語句110         int row = stat.executeUpdate(sql);111         //5.處理結(jié)果112         if(row>0){113             System.out.println("更新數(shù)據(jù)成功!");114         }else{115             System.out.println("更新數(shù)據(jù)失敗!");116         }117     }
 1 JDBC工具類 2 “獲得數(shù)據(jù)庫連接”操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連接對象的方法,從而達(dá)到代碼的重復(fù)利用。 3 代碼演示: 4 public class JDBCUtils { 5      6     //私有構(gòu)造方法,防止外界創(chuàng)建對象調(diào)用方法 7     private JDBCUtils() { 8     } 9     10     //定義Connectionn變量11     private static Connection conn;12     13     //保證代碼只執(zhí)行一次,可以放入靜態(tài)代碼塊中14     static{15         try {16             //注冊驅(qū)動(dòng)17             Class.forName("com.mysql.jdbc.Driver");18             //獲取連接19             String url="jdbc:mysql://127.0.0.1:3306/mybase4";20             String user="root";21             String password = "root";22             conn = DriverManager.getConnection(url, user, password);23         } catch (Exception e) {24             //注意,如果連接數(shù)據(jù)庫失敗,停止程序25             throw new RuntimeException(e+"連接數(shù)據(jù)庫失敗");26         }27     }28     29     //創(chuàng)建一個(gè)靜態(tài)方法,獲取數(shù)據(jù)庫連接對象,并返回30     public static Connection getConnection(){31         return conn;32     }33     34     /*35      * 創(chuàng)建一個(gè)靜態(tài)方法,對資源進(jìn)行釋放36      * ResultSet rs37      * Statement stat38      * Connection conn39      */40     public static void close(ResultSet rs,Statement stat,Connection conn){41         try {42             if(rs!=null){43                 rs.close();44             }45         } catch (SQLException e) {46             e.printStackTrace();47         }48         try {49             if(stat!=null){50                 stat.close();51             }52         } catch (SQLException e) {53             e.printStackTrace();54         }55         try {56             if(conn!=null){57                 conn.close();58             }59         } catch (SQLException e) {60             e.printStackTrace();61         }62     }63 }

sql注入問題
SQL注入:用戶輸入的內(nèi)容作為了SQL語句語法的一部分,改變了原有SQL真正的意義。
假設(shè)有登錄案例SQL語句如下:
SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸?shù)拿艽a;
此時(shí),當(dāng)用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。但是當(dāng)用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a(chǎn)’=’a時(shí),則真正執(zhí)行的代碼變?yōu)椋?br>SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此時(shí),上述查詢語句時(shí)永遠(yuǎn)可以查詢出結(jié)果的。那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問題。
為此,我們使用PreparedStatement來解決對應(yīng)的問題。

preparedStatement:預(yù)編譯對象,是Statement對象的子類。
特點(diǎn):
性能高
會(huì)把sql語句先編譯
能過濾掉用戶輸入的關(guān)鍵字。

PreparedStatement預(yù)處理對象,處理的每條sql語句中所有的實(shí)際參數(shù),都必須使用占位符?替換。
String sql = "select * from user where username = ? and password = ?";
PreparedStatement使用,需要通過以下3步驟完成:
1.PreparedStatement預(yù)處理對象代碼:
獲得預(yù)處理對象,需要提供已經(jīng)使用占位符處理后的SQL語句
PreparedStatement psmt = conn.prepareStatement(sql)
2.設(shè)置實(shí)際參數(shù)
void setXxx(int index, Xxx xx) 將指定參數(shù)設(shè)置指定類型的值
參數(shù)1:index 實(shí)際參數(shù)序列號,從1開始。
參數(shù)2:xxx 實(shí)際參數(shù)值,xxx表示具體的類型。
例如:
setString(2, "1234") 把SQL語句中第2個(gè)位置的占位符?替換成實(shí)際參數(shù) "1234"
3.執(zhí)行SQL語句:
int executeUpdate(); --執(zhí)行insert update delete語句.
ResultSet executeQuery(); --執(zhí)行select語句.
boolean execute(); --執(zhí)行select返回true 執(zhí)行其他的語句返回false.

以上就是原生JDBC是怎么使用的?的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。