JDBC連接sql server數(shù)據(jù)庫的詳細步驟和代碼
JDBC連接sql server數(shù)據(jù)庫的步驟如下:
?1、加載JDBC驅動程序:??? ????在連接數(shù)據(jù)庫之前,首先要加載想要連接的數(shù)據(jù)庫的驅動到JVM(Java虛擬機),??? ????這通過java.lang.Class類的靜態(tài)方法forName(String??className)實現(xiàn)。 ???成功加載后,會將Driver類的實例注冊到DriverManager類中。??? ?2、提供JDBC連接的URL??? ????連接URL定義了連接數(shù)據(jù)庫時的協(xié)議、子協(xié)議、數(shù)據(jù)源標識。??? ?????書寫形式:協(xié)議:子協(xié)議:數(shù)據(jù)源標識??? ????協(xié)議:在JDBC中總是以jdbc開始??? ????子協(xié)議:是橋連接的驅動程序或是數(shù)據(jù)庫管理系統(tǒng)名稱。??? ????數(shù)據(jù)源標識:標記找到數(shù)據(jù)庫來源的地址與連接端口。????? ?3、創(chuàng)建數(shù)據(jù)庫的連接??? ?????要連接數(shù)據(jù)庫,需要向java.sql.DriverManager請求并獲得Connection對象,??? ?????該對象就代表一個數(shù)據(jù)庫的連接。??? ?????使用DriverManager的getConnectin(String?url?,?String?username?,???? ????String?password?)方法傳入指定的欲連接的數(shù)據(jù)庫的路徑、數(shù)據(jù)庫的用戶名和??? ?????密碼來獲得。 ?4、創(chuàng)建一個Statement??? ?????要執(zhí)行SQL語句,必須獲得java.sql.Statement實例,Statement實例分為以下3?? ?????種類型:??? ??????1、執(zhí)行靜態(tài)SQL語句。通常通過Statement實例實現(xiàn)。??? ??????2、執(zhí)行動態(tài)SQL語句。通常通過PreparedStatement實例實現(xiàn)。??? ??????3、執(zhí)行數(shù)據(jù)庫存儲過程。通常通過CallableStatement實例實現(xiàn)。??? ????具體的實現(xiàn)方式:??? ????????Statement?stmt?=?con.createStatement()?;??? ???????PreparedStatement?pstmt?=?con.prepareStatement(sql)?;??? ???????CallableStatement?cstmt?=?con.prepareCall("{CALL?demoSp(??,??)}")?;??? ?5、執(zhí)行SQL語句??? ????Statement接口提供了三種執(zhí)行SQL語句的方法:executeQuery?、executeUpdate??? ???和execute??? ????1、ResultSet?executeQuery():執(zhí)行查詢數(shù)據(jù)庫的SQL語句??? ????????,返回一個結果集(ResultSet)對象。??? ?????2、int?executeUpdate():用于執(zhí)行INSERT、UPDATE或??? ????????DELETE語句以及SQL?DDL語句,如:CREATE?TABLE和DROP?TABLE等??? ?????3、execute():用于執(zhí)行返回多個結果集、多個更新計數(shù)或二者組合的??? ????????語句。??? ???具體實現(xiàn)的代碼:??? ??????????ResultSet?rs?=?pstmt.executeQuery()?;??? ??????????int?rows?=?pstmt.executeUpdate()?;??? ??????????boolean?flag?=?pstmt.execute()?;??? ?6、處理結果??? ????兩種情況:??? ?????1、執(zhí)行更新返回的是本次操作影響到的記錄數(shù)。??? ?????2、執(zhí)行查詢返回的結果是一個ResultSet對象。??? ??????ResultSet包含符合SQL語句中條件的所有行,并且它通過一套get方法提供了對這些??? ??????行中數(shù)據(jù)的訪問。??? ??????使用結果集(ResultSet)對象的訪問方法獲取數(shù)據(jù):??? ?????while(rs.next()){??? ?????????String?name?=?rs.getString("name")?;??? ?????????String?pass?=?rs.getString(1)?; ?????}???? ?7、關閉JDBC對象???? ?????操作完成以后要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲??? ?????明順序相反:??? ?????1、關閉記錄集??? ?????2、關閉聲明??? ?????3、關閉連接對象
JDBC連接sql server數(shù)據(jù)庫代碼:
package?com.accp.jdbc; import?java.sql.Connection; import?java.sql.DriverManager; import?java.sql.PreparedStatement; import?java.sql.ResultSet; import?java.sql.SQLException; import?org.apache.log4j.Logger; public?class?BaseDao?{ //?使用log4j記錄日志 private?static?Logger?logger?=?Logger.getLogger(BaseDao.class); //?連接驅動 private?static?final?String?DRIVER?=?"com.microsoft.sqlserver.jdbc.SQLServerDriver"; //?連接路徑 private?static?final?String?URL?=?"jdbc:sqlserver://localhost:1433;databaseName=MySchool"; //?用戶名 private?static?final?String?USERNAME?=?"sa"; //?密碼 private?static?final?String?PASSWORD?=?"sa"; //靜態(tài)代碼塊 static?{ try?{ //?加載驅動 Class.forName(DRIVER); }?catch?(ClassNotFoundException?e)?{ e.printStackTrace(); } } /* ?*?獲取數(shù)據(jù)庫連接 ?*/ public?Connection?getConnection()?{ Connection?conn?=?null; logger.debug("開始連接數(shù)據(jù)庫"); try{ conn=DriverManager.getConnection(URL,?USERNAME,?PASSWORD); }catch(SQLException?e){ e.printStackTrace(); logger.error("數(shù)據(jù)庫連接失??!"); } logger.debug("數(shù)據(jù)庫連接成功"); return?conn; } /* ?*?關閉數(shù)據(jù)庫連接,注意關閉的順序 ?*/ public?void?close(ResultSet?rs,?PreparedStatement?ps,?Connection?conn)?{ if(rs!=null){ try{ rs.close(); rs=null; }catch(SQLException?e){ e.printStackTrace(); logger.error("關閉ResultSet失敗"); } } if(ps!=null){ try{ ps.close(); ps=null; }catch(SQLException?e){ e.printStackTrace(); logger.error("關閉PreparedStatement失敗"); } } if(conn!=null){ try{ conn.close(); conn=null; }catch(SQLException?e){ e.printStackTrace(); logger.error("關閉Connection失敗"); } } } }