jdbc mysql api_JDBC Api详解
一.什么是JDBC
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據(jù)此可以構建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應用程序。
二.數(shù)據(jù)庫驅動
JDBC是對數(shù)據(jù)庫操作的接口抽象,而不同數(shù)據(jù)庫廠商的數(shù)據(jù)庫驅動程序則對應JDBC接口實現(xiàn),通過抽象出JDBC接口,應用程序和實際的數(shù)據(jù)庫驅動即JDBC實現(xiàn)解耦。
三、常用接口
1.Driver接口
Driver接口由數(shù)據(jù)庫廠家提供,作為java開發(fā)人員,只需要使用Driver接口就可以了。在編程中要連接數(shù)據(jù)庫,必須先裝載特定廠商的數(shù)據(jù)庫驅動程序,不同的數(shù)據(jù)庫有不同的裝載方法。如:
裝載MySql驅動:Class.forName("com.mysql.jdbc.Driver");
裝載Oracle驅動:Class.forName("oracle.jdbc.driver.OracleDriver");
2.Connection接口
Connection與特定數(shù)據(jù)庫的連接(會話),在連接上下文中執(zhí)行sql語句并返回結果。DriverManager.getConnection(url,?user,?password)方法建立在JDBC URL中定義的數(shù)據(jù)庫Connection連接上。
連接MySql數(shù)據(jù)庫:Connection conn =?DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
連接Oracle數(shù)據(jù)庫:Connection conn =?DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");
連接SqlServer數(shù)據(jù)庫:Connection conn =?DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");
常用方法:
createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對象。
prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預編譯sql的PrepareSatement對象。
prepareCall(sql):創(chuàng)建執(zhí)行存儲過程的callableStatement對象。
setAutoCommit(boolean?autoCommit):設置事務是否自動提交。
commit() :在鏈接上提交事務。
rollback() :在此鏈接上回滾事務。
3.Statement接口
用于執(zhí)行靜態(tài)SQL語句并返回它所生成結果的對象。
三種Statement類:
Statement:由createStatement創(chuàng)建,用于發(fā)送簡單的SQL語句(不帶參數(shù))。
PreparedStatement :繼承自Statement接口,由preparedStatement創(chuàng)建,用于發(fā)送含有一個或多個參數(shù)的SQL語句。PreparedStatement對象比Statement對象的效率更高,并且可以防止SQL注入,所以我們一般都使用PreparedStatement。
CallableStatement:繼承自PreparedStatement接口,由方法prepareCall創(chuàng)建,用于調用存儲過程。
常用Statement方法:
execute(String?sql):運行語句,返回是否有結果集
executeQuery(String?sql):運行select語句,返回ResultSet結果集。
executeUpdate(String?sql):運行insert/update/delete操作,返回更新的行數(shù)。
addBatch(String?sql) :把多條sql語句放到一個批處理中。
executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行。
4.ResultSet接口
ResultSet提供檢索不同類型字段的方法,常用的有:
getString(int index)、getString(String columnName):獲得在數(shù)據(jù)庫里是varchar、char等類型的數(shù)據(jù)對象。
getFloat(int index)、getFloat(String columnName):獲得在數(shù)據(jù)庫里是Float類型的數(shù)據(jù)對象。
getDate(int index)、getDate(String columnName):獲得在數(shù)據(jù)庫里是Date類型的數(shù)據(jù)。
getBoolean(int index)、getBoolean(String columnName):獲得在數(shù)據(jù)庫里是Boolean類型的數(shù)據(jù)。
getObject(int index)、getObject(String columnName):獲取在數(shù)據(jù)庫里任意類型的數(shù)據(jù)。
ResultSet還提供了對結果集進行滾動的方法:
next():移動到下一行
Previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最后面。
使用后依次關閉對象及連接:ResultSet →?Statement →?Connection
四、使用JDBC的步驟
加載JDBC驅動程序 →?建立數(shù)據(jù)庫連接Connection →?創(chuàng)建執(zhí)行SQL的語句Statement →?處理執(zhí)行結果ResultSet →?釋放資源
1.注冊驅動 (只做一次)
方式一:Class.forName(“com.MySQL.jdbc.Driver”);
推薦這種方式,不會對具體的驅動類產生依賴。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
會造成DriverManager中產生兩個一樣的驅動,并會對具體的驅動類產生依賴。
2.建立連接
Connection conn = DriverManager.getConnection(url, user, password);
URL用于標識數(shù)據(jù)庫的位置,通過URL地址告訴JDBC程序連接哪個數(shù)據(jù)庫,URL的寫法為:
其他參數(shù)如:useUnicode=true&characterEncoding=utf8
3.創(chuàng)建執(zhí)行SQL語句的statement
1 //Statement
2 String id = "5";
3 String sql = "delete from table where id=" + id;
4 Statement st = conn.createStatement();
5 st.executeQuery(sql);
6 //存在sql注入的危險
7 //如果用戶傳入的id為“5 or 1=1”,那么將刪除表中的所有記錄
1 //PreparedStatement 有效的防止sql注入(SQL語句在程序運行前已經(jīng)進行了預編譯,當運行時動態(tài)地把參數(shù)傳給PreprareStatement時,即使參數(shù)里有敏感字符如 or '1=1'也數(shù)據(jù)庫會作為一個參數(shù)一個字段的屬性值來處理而不會作為一個SQL指令)
2 String sql = “insert into user (name,pwd) values(?,?)”;
3 PreparedStatement ps = conn.preparedStatement(sql);
4 ps.setString(1, “col_value”); //占位符順序從1開始
5 ps.setString(2, “123456”); //也可以使用setObject
6 ps.executeQuery();
4.處理執(zhí)行結果(ResultSet)
1 ResultSet rs = ps.executeQuery();
2 While(rs.next()){
3 rs.getString(“col_name”);
4 rs.getInt(1);
5 //…
6 }
5.釋放資源
//數(shù)據(jù)庫連接(Connection)非常耗資源,盡量晚創(chuàng)建,盡量早的釋放
//都要加try catch 以防前面關閉出錯,后面的就不執(zhí)行了
1 try {
2 if (rs != null) {
3 rs.close();
4 }
5 } catch (SQLException e) {
6 e.printStackTrace();
7 } finally {
8 try {
9 if (st != null) {
10 st.close();
11 }
12 } catch (SQLException e) {
13 e.printStackTrace();
14 } finally {
15 try {
16 if (conn != null) {
17 conn.close();
18 }
19 } catch (SQLException e) {
20 e.printStackTrace();
21 }
22 }
23 }
總結
以上是生活随笔為你收集整理的jdbc mysql api_JDBC Api详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火狐浏览器title过长显示不全_浏览器
- 下一篇: java爬取单张图片