首頁 >資料庫 >mysql教程 >原生JDBC是怎麼使用的?

原生JDBC是怎麼使用的?

零下一度
零下一度原創
2017-07-03 09:31:181042瀏覽

JDBC
Java DataBase Connectivity,java資料庫連線,是一種用來執行SQL語句的Java API。
JDBC是Java存取資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類別組成。

驅動
JDBC需要連接驅動,驅動是兩個設備要進行通信,滿足一定通信資料格式,資料格式由設備提供者規定,設備提供者為設備提供驅動軟體,透過軟體可以與該設備進行通訊。

JDBC規格(掌握四個核心物件
DriverManager:用於註冊驅動程式
Connection: 表示與資料庫建立的連線
Statement: 操作資料庫sql語句的物件
ResultSet: 結果集或一張虛擬表

使用JDBC技術,透過mysql提供的驅動程式,操作資料庫實現步驟:
1.註冊驅動
告知JVM我們使用的是什麼驅動程式(mysql,oracle....)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用
原因有2個:
>導致驅動被註冊2次。
>強烈依賴資料庫的驅動程式jar
解決方法:
Class.forName("com.mysql.jdbc.Driver");
2.取得資料庫的連線
資料庫是TCP程式伺服器,連接伺服器(透過3次握手)
就相當於建立了一條java程式通往資料庫伺服器的連線路徑
static Connection getConnection(String url, String user, String password)
試圖建立到給定資料庫URL 的連接。
參數說​​明:url 需要連接資料庫的位置(網址) user使用者名稱 password 密碼
例如:getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");
URL:SUN公司與資料庫廠商之間的一種協定。
jdbc:mysql://localhost:3306/day06
協定子協定 IP :連接埠號碼資料庫
mysql: jdbc:mysql://localhost:3306/day04或jdbc:mysql:///day14 (預設本機連線)
oracle資料庫: jdbc:oracle:thin:@localhost:1521:sid
3.取得執行者物件
執行SQL語句的物件,作用就是執行SQL
介面的實作在資料庫驅動中。所有與資料庫互動都是基於連結對象的。
Statement  createStatement(); //建立操作sql語句的物件
4.執行SQL語句,取得結果集
使用執行者物件執行SQL語句
取得SQL語句的結果集(增刪改:整數,執行有效行數 查詢:傳回的就是一個結果集)
常用方法:
? int executeUpdate(String sql); --執行insert update delete語句.
? ResultSet executeQuery(String sql ); --執行select語句.
? boolean execute(String sql); --僅當執行select並且有結果時才傳回true,執行其他的語句傳回false.
5.處理結果集
ResultSet其實就是一張二維的表格,我們可以呼叫其boolean next()方法指向某行記錄,當第一次呼叫next()方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開始不同個,列從1開始)來取得指定列的資料:
rs.next();//指向第一行
rs.getInt (1);//取得第一行第一列的資料
常用方法:
? 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) 獲得雙精確度浮點型
6.釋放資源
與IO流一樣,使用後的東西都需要關閉!關閉的順序是先得到的後關閉,後來得到的先關閉。
使用JDBC對資料庫進行增刪改查程式碼示範:

  1 public static void main(String[] args) throws Exception {  2         //1.注册驱动  3         Class.forName("com.mysql.jdbc.Driver");  4         //2.获取数据库连接  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.获取执行者对象 10         Statement stat = conn.createStatement(); 11         //调用更新数据的方法 12         //update(stat); 13         //调用删除数据的方法 14         //delete(stat); 15         //调用增加数据的方法 16         //insert(stat); 17         //调用查询数据的方法 18         select(stat); 19         //6.释放资源 20         stat.close(); 21         conn.close(); 22     } 23  24     /* 25      * 使用JDBC技术,查询数据库中表的数据 26      */ 27     private static void select(Statement stat) throws Exception { 28         //拼接sql语句 29         String sql = "SELECT * FROM category"; 30         /* 31          * 4.执行sql语句 32          * 使用Statement中的方法 33          * ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
 34          * 返回值ResultSet标准接口的实现类对象,实现类对象由mysql驱动提供,可以使用ResultSet接口接收 35          */ 36         ResultSet rs = stat.executeQuery(sql); 37         System.out.println(rs);//com.mysql.jdbc.JDBC4ResultSet@1acb189 38         /* 39          * 5.处理结果 40          * ResultSet中有一个方法 41          * boolean next() 将光标从当前位置向前移一行。 42          * 如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 
 43          * 如果有结果集返回true,若果没有结果集返回false 44          * 相当于迭代器中的hasNext方法 45          */ 46         while(rs.next()){ 47             /* 48              * next返回true,有结果集 49              * 取出结果集 50              * 使用ResultSet中的方法getXXX(参数); 51              * 参数: 52              *     int columnIndex:列所在的索引,从1开始 53              *     String columnLabel:列名 54              * 注意: 55              *     如果使用getInt,getDouble指定数据类型的方法,返回值就是对应的数据类型 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技术,对数据库中的表数据进行增加 72      */ 73     private static void insert(Statement stat) throws SQLException { 74         //拼接sql语句 75         String sql = "INSERT INTO category(cname) VALUES('玩具')"; 76         //4.执行sql语句 77         int row = stat.executeUpdate(sql); 78         //5.处理结果 79         if(row>0){ 80             System.out.println("增加数据成功!"); 81         }else{ 82             System.out.println("增加数据失败!"); 83         } 84          85     } 86  87     /* 88      * 使用JDBC技术,对数据库中的表数据进行删除 89      */ 90     private static void delete(Statement stat) throws Exception { 91         //拼接sql语句 92         String sql = "DELETE FROM category WHERE cid=5"; 93         //4.执行sql语句 94         int row = stat.executeUpdate(sql); 95         //5.处理结果 96         if(row>0){ 97             System.out.println("删除数据成功!"); 98         }else{ 99             System.out.println("删除数据失败!");100         }101     }102 103     /*104      * 使用JDBC技术,对数据库中的表数据进行更新105      */106     private static void update(Statement stat) throws Exception {107         //拼接sql语句108         String sql = "UPDATE category SET cname='鞋帽' WHERE cid=6";109         //4.执行sql语句110         int row = stat.executeUpdate(sql);111         //5.处理结果112         if(row>0){113             System.out.println("更新数据成功!");114         }else{115             System.out.println("更新数据失败!");116         }117     }
#
 1 JDBC工具类 2 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。 3 代码演示: 4 public class JDBCUtils { 5      6     //私有构造方法,防止外界创建对象调用方法 7     private JDBCUtils() { 8     } 9     10     //定义Connectionn变量11     private static Connection conn;12     13     //保证代码只执行一次,可以放入静态代码块中14     static{15         try {16             //注册驱动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             //注意,如果连接数据库失败,停止程序25             throw new RuntimeException(e+"连接数据库失败");26         }27     }28     29     //创建一个静态方法,获取数据库连接对象,并返回30     public static Connection getConnection(){31         return conn;32     }33     34     /*35      * 创建一个静态方法,对资源进行释放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注入:使用者輸入的內容作為了SQL語句語法的一部分,改變了原有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來解決對應的問題。

preparedStatement:預編譯對象,是Statement物件的子類別。
特點:
效能高
會把sql語句先編譯
能過濾掉使用者輸入的關鍵字。

PreparedStatement預處理對象,處理的每個sql語句中所有的實際參數,都必須使用佔位符?來取代。
String sql = "select * from user where username = ? and password = ?";
PreparedStatement使用,需要透過以下3步驟完成:
1.PreparedStatement預處理物件代碼:
取得預處理對象,需要提供已經使用佔位符處理後的SQL語句
PreparedStatement psmt = conn.prepareStatement(sql)
2.設定實際參數
void setXxx(int index, Xxx xx) 將指定參數設定指定類型的值
參數1:index 實際參數序號,從1開始。
參數2:xxx 實際參數值,xxx表示特定的型別。
例如:
setString(2, "1234") 把SQL語句中第2個位置的佔位符?替換成實際參數"1234"
3.執行SQL語句:
int executeUpdate (); --執行insert update delete語句.
ResultSet executeQuery(); --執行select語句.
boolean execute(); --執行select回傳true 執行其他的語句傳回false.

以上是原生JDBC是怎麼使用的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn