JDBC的操作步驟和執行個體,JDBC操作步驟執行個體
轉載請註明出處,謝謝http://blog.csdn.net/harryweasley/article/details/45689023
- •建立一個以JDBC串連資料庫的程式,包含7個步驟:
- 1、載入JDBC驅動程式:
- 在串連資料庫之前,首先要載入想要串連的資料庫的驅動到JVM(Java虛擬機器), 這通過java.lang.Class類的靜態方法forName(String className)實現。
- 例如:
-
try{ //載入MySql的驅動類 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驅動程式類 ,載入驅動失敗!"); e.printStackTrace() ; }
- 成功載入後,會將Driver類的執行個體註冊到DriverManager類中。
- 不同資料庫廠商的驅動類名不同
Oracle10g:oracle.jdbc.driver.OracleDriver
MySQL5:com.mysql.jdbc.Driver
SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver
- 2、提供JDBC串連的URL
- •串連URL定義了串連資料庫時的協議、子協議、資料來源標識。
- •書寫形式:協議:子協議:資料來源標識
- 協議:在JDBC中總是以jdbc開始
- 子協議:是橋串連的驅動程式或是資料庫管理系統名稱。
- 資料來源標識:標記找到資料庫來源的地址與串連連接埠。
- 例如:(MySql的串連URL)
jdbc:mysql://localhost:3306/test? ;
不同資料庫產品的串連URL不同
Oracle10g:jdbc:oracle:thin:@主機名稱:連接埠:資料庫SID
jdbc:oracle:thin:@localhost:1521:ORCL
MySQL5:jdbc:mysql://主機名稱:連接埠/資料庫名
jdbc:mysql://localhost:3306/test
SQLServer2005:jdbc:sqlserver://主機名稱:連接埠:DatabaseName=庫名
jdbc:sqlserver://localhost:1433:DatabaseName=BookDB
資料庫的使用者名稱和密碼
- 3、建立資料庫的串連
- •要串連資料庫,需要向java.sql.DriverManager請求並獲得Connection對象,該對象就代表一個資料庫的串連。
- •使用DriverManager的getConnectin(String url , String username , String password )方法傳入指定的欲串連的資料庫的路徑、資料庫的使用者名稱和 密碼來獲得。
- 例如:
-
//串連MySql資料庫,使用者名稱和密碼都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("資料庫連接失敗!"); se.printStackTrace() ; }
- 4、建立一個Statement
- •要執行SQL語句,必須獲得java.sql.Statement執行個體,Statement執行個體分為以下3 種類型:
- 1、執行靜態SQL語句。通常通過Statement執行個體實現。
- 2、執行動態SQL語句。通常通過PreparedStatement執行個體實現。
- 3、執行資料庫預存程序。通常通過CallableStatement執行個體實現。
- 具體的實現方式:
-
Statement stmt = con.createStatement() ; PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
- 5、執行SQL語句
- Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate 和execute
- 1、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句,返回一個結果集(ResultSet)對象。
- 2、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等
- 3、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的語句。
- 具體實現的代碼:
-
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ;
- 6、處理結果
- 兩種情況:
- 1、執行更新返回的是本次操作影響到的記錄數。
- 2、執行查詢返回的結果是一個ResultSet對象。
- • ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些
- 行中資料的訪問。
- • 使用結果集(ResultSet)對象的存取方法擷取資料:
-
while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比較高效 }
- (列是從左至右編號的,並且從列1開始)
- 7、關閉JDBC對象
- 操作完成以後要把所有使用的JDBC對象全都關閉,以釋放JDBC資源,關閉順序和聲明順序相反:
- 1、關閉記錄集
- 2、關閉聲明
- 3、關閉連線物件
if(rs != null){ // 關閉記錄集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt != null){ // 關閉聲明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn != null){ // 關閉連線物件 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } }
8、執行個體:JdbcUtils
我將他們封裝到一個類中,並進行了測試。代碼中解釋很詳細,我就不再進行解釋了。
package com.jdbc.dbutils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class JdbcUtils {/** * 資料庫的使用者名稱 */private final String USER = "root";/** * 資料庫的密碼 */private final String PASSWORD = "123456";/** * 資料庫的驅動資訊 */private final String DRIVER = "com.mysql.jdbc.Driver";/** * 訪問資料庫的地址 */private final String URL = "jdbc:mysql://localhost:3306/test";/** * 資料庫的串連 */Connection connection;/** * sql語句的執行對象 */PreparedStatement preparedStatement;/** * 查詢返回的結果集合 */ResultSet resultSet;public JdbcUtils() {try {Class.forName(DRIVER);System.out.println("註冊驅動成功");} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 串連資料庫 * * @return 資料庫的連線物件 */public Connection getConnection() {try {connection = DriverManager.getConnection(URL, USER, PASSWORD);} catch (SQLException e) {e.printStackTrace();}return connection;}/** * 完成對資料庫的表的添加刪除和修改的操作 * * @param sql * @param params * @return * @throws SQLException */public boolean updateByPrepareStatement(String sql, List<Object> params)throws SQLException {boolean flag = false;int result = -1;// 表示當使用者執行添加刪除和修改的時候所影響資料庫的行數// 建立一個 PreparedStatement 對象來將參數化的 sql 語句發送到資料庫。preparedStatement = connection.prepareStatement(sql);int index = 1;if (params != null && !params.isEmpty()) {for (Object object : params) {// 使用給定對象設定指定參數的值。index從1開始preparedStatement.setObject(index++, object);}}// 在此 PreparedStatement 對象中執行 SQL 陳述式,該語句必須是一個 SQL 資料操作語言語句,比如// INSERT、UPDATE 或 DELETE 語句result = preparedStatement.executeUpdate();flag = result > 0 ? true : false;return flag;}/** * 查詢返回單條記錄 * * @param sql * @param params * @return * @throws SQLException */public Map<String, Object> findSimpleResult(String sql, List<Object> params)throws SQLException {Map<String, Object> map = new HashMap<String, Object>();int index = 1;// 建立一個 PreparedStatement 對象來將參數化的 sql 語句發送到資料庫。preparedStatement = connection.prepareStatement(sql);if (params != null && !params.isEmpty()) {for (Object object : params) {// 使用給定對象設定指定參數的值。index從1開始preparedStatement.setObject(index++, object);}}// 在此 PreparedStatement 對象中執行 SQL 查詢,並返回該查詢產生的 ResultSet 對象。resultSet = preparedStatement.executeQuery();// 擷取此 ResultSet 對象的列的編號、類型和屬性。ResultSetMetaData metaData = resultSet.getMetaData();int col_len = metaData.getColumnCount();while (resultSet.next()) {for (int i = 0; i < col_len; i++) {// sql資料庫列的下標是從1開始的String col_name = metaData.getColumnName(i + 1);Object col_value = resultSet.getObject(col_name);if (col_value == null) {col_value = "";}map.put(col_name, col_value);}}return map;}public List<Map<String, Object>> findMoreResult(String sql,List<Object> params) throws SQLException {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();int index = 1;// 建立一個 PreparedStatement 對象來將參數化的 sql 語句發送到資料庫。preparedStatement = connection.prepareStatement(sql);if (params != null && !params.isEmpty()) {for (Object object : params) {// 使用給定對象設定指定參數的值。index從1開始preparedStatement.setObject(index++, object);}}// 在此 PreparedStatement 對象中執行 SQL 查詢,並返回該查詢產生的 ResultSet 對象。resultSet = preparedStatement.executeQuery();// 擷取此 ResultSet 對象的列的編號、類型和屬性。ResultSetMetaData metaData = resultSet.getMetaData();int col_len = metaData.getColumnCount();while (resultSet.next()) {Map<String, Object> map = new HashMap<String, Object>();for (int i = 0; i < col_len; i++) {// sql資料庫列的下標是從1開始的String col_name = metaData.getColumnName(i + 1);Object col_value = resultSet.getObject(col_name);if (col_value == null) {col_value = "";}map.put(col_name, col_value);}list.add(map);}return list;}/** * 關閉資料庫 * * @throws SQLException */public void releaseConn() throws SQLException {if (resultSet != null) {resultSet.close();}if (preparedStatement != null) {preparedStatement.close();}if (connection != null) {connection.close();}}static JdbcUtils jdbcUtils;public static void main(String[] args) throws SQLException {jdbcUtils = new JdbcUtils();jdbcUtils.getConnection();// insert();// update();// query();Morequery();}private static void query() throws SQLException {String sql = "select * from userinfo where pwd = ? ";List<Object> params = new ArrayList<Object>();params.add("123");Map<String, Object> map = jdbcUtils.findSimpleResult(sql, params);System.out.println(map);}private static void Morequery() throws SQLException {String sql = "select * from userinfo ";List<Map<String, Object>> map = jdbcUtils.findMoreResult(sql, null);System.out.println(map);}/** * 更新資料庫內容 * * @throws SQLException */private static void update() throws SQLException {String sql = "update userinfo set username =? where id=2";List<Object> params = new ArrayList<Object>();params.add("liumr");jdbcUtils.updateByPrepareStatement(sql, params);}/** * 增加資料 * * @throws SQLException */private static void insert() throws SQLException {String sql = "insert userinfo (username,pwd) values (?,?)";List<Object> params = new ArrayList<Object>();params.add("liugx");params.add("456");jdbcUtils.updateByPrepareStatement(sql, params);}}