JDBC (Java DataBase Connectivity) 是 Java 數據庫鏈接技術的簡稱,用於鏈接經常使用數據庫。java
Sun 公司提供了 JDBC API ,供程序員調用接口和類,集成在 java.sql 和 javax.sql 包中。mysql
Sun 公司還提供了 DriverManager 類用來管理各類不一樣的JDBC驅動。程序員
不一樣數據庫廠商提供各自的JDBC驅動,因此咱們想要鏈接數據庫除了要了解 JDBC API 還須要下載各數據庫廠商的驅動 jar 包。sql
JDBC API主要用於與數據庫創建鏈接、執行SQL語句、處理結果,其中核心類和接口以下:數據庫
一、與數據庫創建鏈接並獲取鏈接api
Connection connection=DriverManager.getConnection(URL,數據庫用戶名,密碼);
二、發送SQL語句,獲得執行結果編碼
Statement stmt=connection.createStatement(); ResultSet rs=stmt.executeQuery(SQL語句);
三、處理返回結果url
while(rs.next()){ int a=rs.getInt("a"); String b=rs.getString("b"); Date d=rs.getDate("d"); …… }
四、釋放資源code
rs.close(); stmt.close(); connection.close();
本例適合已經會使用 MySQL 數據庫的同窗,首先咱們下載 JDBC 的驅動 jar 包。這個網址提供了 MySQL 各類語言鏈接數據庫的驅動 https://www.mysql.com/products/connector/,MySQL Connector / J 8.0與從MySQL 5.5開始的全部MySQL版本兼容。
8.0下載地址
下載完成後解壓,後將jar添加依賴到項目中。server
鏈接到MySQL數據庫
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DemoConnectMySQL { public static void main(String[] args) { //鏈接MySQL的URL String url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false"; //MySQL數據庫用戶名 String user="root"; //MySQL數據庫的密碼 String password="1234"; Connection connection=null; try { connection=DriverManager.getConnection(url, user, password); System.out.println("鏈接成功"); } catch (SQLException e) { e.printStackTrace(); }finally { try { connection.close(); System.out.println("鏈接關閉"); } catch (SQLException e) { e.printStackTrace(); } } } }
url指定數據庫的鏈接字符串,格式爲:
jdbc:數據庫://ip或域名:端口號?參數&參數……
這裏的參數 useUnicode=true 使用Unicode字符,characterEncoding=utf8 設置編碼防止中文亂碼,serverTimezone=UTC 設置時區,useSSL=false 不使用SSL
jdbc4.0不須要加載驅動
PreparedStatement 繼承了 Statement 接口,表示預編譯的 SQL 語句對象,SQL 語句被預編譯並存儲在 PreparedStatement 對象中,可使用此對象屢次高效地執行該語句。(還避免了 SQL 注入的隱患)
先準備好數據庫 books
表 book
字段 | 類型 | 屬性 |
---|---|---|
id | 整數 | 主鍵,自增 |
bName | 字符串 | 非空 |
price | 小數 | 非空 |
腳本也準備好了
#建立數據庫 CREATE DATABASE books; USE books; #建立表 CREATE TABLE book ( id INT primary key auto_increment, bName VARCHAR ( 255 ) NOT NULL, price FLOAT NOT NULL );
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestInsert { public static void main(String[] args) { Connection connection=null; PreparedStatement pstmt=null; String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false"; String user="root"; String password="1234"; try { connection=DriverManager.getConnection(url,user,password); //sql語句 String sql="insert into book(bName,price) values (?,?)"; pstmt=connection.prepareStatement(sql); //傳入參數 pstmt.setString(1, "《java入門到改行》"); pstmt.setFloat(2, 11.11f); int result=pstmt.executeUpdate(); System.out.println("受影響行數:"+result); } catch (SQLException e) { e.printStackTrace(); }finally { if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
說明:
一、鏈接字符串要修改數據庫名字爲 books
String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
二、插入數據庫的數據不能拼接而是要用 ?
代替
String sql="insert into book(bName,price) values (?,?)";
三、?
代替的參數要經過 set類型(位置,值)
傳入
pstmt.setString(1, "《java入門到改行》"); pstmt.setFloat(2, 11.11f);
pstmt.setXxx()的位置從 1 開始!
四、增刪改的SQL語句都使用這個方法,返回受影響行數
int result=pstmt.executeUpdate();
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestDelete { public static void main(String[] args) { Connection connection=null; PreparedStatement pstmt=null; String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false"; String user="root"; String password="1234"; try { connection=DriverManager.getConnection(url,user,password); //sql語句 String sql="delete from book where id=?"; pstmt=connection.prepareStatement(sql); //傳入參數 要刪除id pstmt.setInt(1, 1); int result=pstmt.executeUpdate(); System.out.println("受影響行數:"+result); } catch (SQLException e) { e.printStackTrace(); }finally { if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestUpdate { public static void main(String[] args) { Connection connection=null; PreparedStatement pstmt=null; String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false"; String user="root"; String password="1234"; try { connection=DriverManager.getConnection(url,user,password); //sql語句 String sql="update book set bName=?,price=? where id=?"; pstmt=connection.prepareStatement(sql); //傳入參數 要刪除id pstmt.setString(1, "《MySQL從刪庫到跑路》"); pstmt.setFloat(2, 16.66f); pstmt.setInt(3, 2); int result=pstmt.executeUpdate(); System.out.println("受影響行數:"+result); } catch (SQLException e) { e.printStackTrace(); }finally { if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
增、刪、改操做的寫法都同樣,都調用 executeUpdate() 方法返回一個受影響行數,惟一不一樣的 SQL語句。
查詢數據須要用到 ResultSet 類保存返回的結果集,咱們獲取數據要操做 ResultSet 獲取。
ResultSet 經常使用方法
方法名 | 說明 |
---|---|
boolean next() | 將遊標從當前位置向下移動一行 |
void close() | 關閉 ResultSet 對象 |
int getInt(int colIndex) | 以int形式獲取結果集當前行指定列號值 |
int getInt(String colLabel) | 以int形式獲取結果集當前行指定列名值 |
float getFloat(String colLabel) | 以float形式獲取結果集當前行指定列名值 |
String getString(String colLabel) | 以 String 形式獲取結果集當前行指定列名值 |
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestSelect { public static void main(String[] args) { Connection connection=null; PreparedStatement pstmt=null; ResultSet rs=null; String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false"; String user="root"; String password="1234"; try { connection=DriverManager.getConnection(url,user,password); //sql語句 String sql="select bName,price,id from book where id=?"; pstmt=connection.prepareStatement(sql); //傳入查詢條件 pstmt.setInt(1, 2); rs=pstmt.executeQuery(); while(rs.next()) { //經過列名獲取列的值 int id=rs.getInt("id"); //經過位置獲取列的值 String bName=rs.getString(1); float price=rs.getFloat("price"); System.out.println(id+" "+bName+" "+price); } } catch (SQLException e) { e.printStackTrace(); }finally { if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (pstmt!=null) { try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection!=null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
關閉對象時注意關閉的順序,後使用的先關閉:rs.close()->pstmt.close()->connection.close()
ResultSet 對象存在一個光標,光標所指行爲當前行。想要獲取列的數據須要先指向一行,因此要先指定 next() 方法用於指向一行,若是沒有數據next()方法返回false,有數據返回true。
使用 getXxx() 方法獲取列的數據時建議寫列名,這樣好識別