首頁 資料庫 mysql教程 原生JDBC的開發步驟與介紹

原生JDBC的開發步驟與介紹

Jul 17, 2017 am 09:48 AM
jdbc 原生

   導包:將所需的jar包複製到專案名下的新建的lib資料夾中,

    jdbc的原生開發步驟

    1、註冊驅動

    2、取得連結

    3、取得執行者物件

    4、取得結果集

##  處理

    6、釋放資源



JDBCJava 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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Java8(291)之後禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008怎麼解決 Java8(291)之後禁用了TLS1.1使JDBC無法用SSL連接SqlServer2008怎麼解決 May 16, 2023 pm 11:55 PM

Java8-291之後,禁用了TLS1.1,使JDBC無法用SSL連接SqlServer2008怎麼辦,以下是解決辦法修改java.security檔案1.找到jre的java.security檔案如果是jre,在{JAVA_HOME}/jre/ lib/security中,例如????C:\ProgramFiles\Java\jre1.8.0_301\lib\security如果是Eclipse綠色免安裝便攜版在安裝資料夾搜尋java.security,例如?????xxx\plugins \org

Java錯誤:JDBC錯誤,如何解決與避免 Java錯誤:JDBC錯誤,如何解決與避免 Jun 24, 2023 pm 02:40 PM

隨著Java的廣泛應用,Java程式在連接資料庫時經常會出現JDBC錯誤。 JDBC(JavaDatabaseConnectivity)是Java中用於連接資料庫的程式設計接口,因此,JDBC錯誤是在Java程式與資料庫互動時遇到的錯誤。以下將介紹一些最常見的JDBC錯誤及如何解決和避免它們。 ClassNotFoundException這是最常見的JDBC

Java如何實作JDBC批次插入 Java如何實作JDBC批次插入 May 18, 2023 am 10:02 AM

一、說明在JDBC中,executeBatch這個方法可以將多個dml語句批次執行,效率比單一執行executeUpdate高很多,這是什麼原理呢?在mysql和oracle中又是如何實現批次執行的呢?本文將為大家介紹背後的原理。二、實驗介紹本實驗將透過以下三步驟進行a.記錄jdbc在mysql中批量執行和單條執行的耗時b.記錄jdbc在oracle中批量執行和單條執行的耗時c.記錄oracleplsql批量執行和單條執行的耗時相關java和資料庫版本如下:Java17,Mysql8,Oracl

MySQL中的JDBC程式設計該如何分析 MySQL中的JDBC程式設計該如何分析 May 30, 2023 pm 10:19 PM

一、資料庫程式設計的必備條件程式語言,如Java,C、C++、Python等資料庫,如Oracle,MySQL,SQLServer等資料庫驅動套件:不同的資料庫,對應不同的程式語言提供了不同的資料庫驅動包,如:MySQL提供了Java的驅動包mysql-connector-java,需要基於Java操作MySQL即需要該驅動包。同樣的,要基於Java操作Oracle資料庫則需要Oracle的資料庫驅動包ojdbc。二、Java的資料庫程式設計:JDBCJDBC,即JavaDatabaseConnectiv

Java使用JDBC API連接MySQL資料庫遇到的常見問題 Java使用JDBC API連接MySQL資料庫遇到的常見問題 Jun 10, 2023 am 09:55 AM

近年來,Java語言的應用越來越廣泛,而JDBCAPI是Java應用程式中與資料庫互動的一種創意方法,JDBC基於一種名為ODBC的開放資料庫連接標準,使得Java應用程式能夠連接到任何資料庫管理系統(DBMS)。其中,MySQL更是一款備受青睞的資料庫管理系統。然而,連接MySQL資料庫時,開發人員也會遇到一些常見問題,本文旨在介紹JDBCAPI連接M

CSS原生嵌套語法來了!使用指南速覽! CSS原生嵌套語法來了!使用指南速覽! Feb 08, 2023 pm 03:31 PM

目前,CSS 原生嵌套語法處於開發者試用狀態,CSS 工作小組正在製定相關規範,Chrome 瀏覽器預計將於 112 版本正式推出 CSS 原生巢狀功能。

Hibernate 框架與 JDBC 的差異是什麼? Hibernate 框架與 JDBC 的差異是什麼? Apr 17, 2024 am 10:33 AM

Hibernate與JDBC的差異:抽象層級:Hibernate提供高階物件映射和查詢生成,而JDBC需要手動編寫程式碼。物件-關聯映射:Hibernate映射Java物件和資料庫表,而JDBC不提供此功能。查詢產生:Hibernate使用HQL簡化查詢生成,而JDBC需要寫複雜的SQL查詢。事務管理:Hibernate自動管理事務,而JDBC需要手動管理。

MySQL如何實作JDBC MySQL如何實作JDBC May 27, 2023 am 11:06 AM

JDBC基礎入門概念JDBC(JavaDataBaseConnectivity,java資料庫連接)是一種用於執行SQL語句的JavaAPI,可以為多種關係型資料庫提供統一訪問,它是由一組用Java語言編寫的類別和介面組成的。  JDBC規範定義接口,具體的實作由各大資料庫廠商來實現。 JDBC是Java存取資料庫的標準規範,真正怎麼操作資料庫還需要具體的實作類別,也就是資料庫驅動。每個資料庫廠商根據自家資料庫的通訊格式編寫好自己資料庫的驅動。所以我們只需要會呼叫J

See all articles