JDBC連接數據庫步驟及基本操作示例詳解
JDBC基本操作
create table user( id int primary key auto_increment, name varchar(50) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
JDBC概念
JDBC是一個獨立于特定數據庫管理系統(tǒng)、通用的SQL數據庫存取和操作的公共接口,定義了用來訪問數據庫的標準的Java類庫
連接步驟
- 加載驅動
- 進行數據庫連接
// 驅動 private static final String DRIVER = "com.mysql.jdbc.Driver"; // 地址 private static final String URL = "jdbc:mysql://localhost:3306/test"; //用戶名 private static final String USER_NAME = "root"; // 密碼 private static final String PSW = "123456"; /** * 獲取連接 */ public static Connection getConnection(){ Connection conn = null; try { // 加載驅動 Class.forName(DRIVER); // 數據庫連接 conn = DriverManager.getConnection(URL,USER_NAME,PSW); } catch (ClassNotFoundException e) { System.out.println("加載驅動失敗,請檢查是否引入Jar包或者驅動名稱是否正確"); throw new RuntimeException("加載驅動失敗,請檢查是否引入Jar包或者驅動名稱是否正確",e); } catch (SQLException throwables) { System.out.println("連接數據庫失敗,請檢查數據庫地址,用戶名,密碼是否正確"); throw new RuntimeException("連接數據庫失敗,請檢查數據庫地址,用戶名,密碼是否正確",throwables); } return conn; } /** * 關閉連接 * @param conn */ public static void close(Connection conn){ if(conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } }
注意:為什么需要使用Class.forName()來加載數據庫驅動
是因為在每個Driver中都包含有一個靜態(tài)代碼塊,實際調用的是DriverManager.registerDriver(new Driver());方法
public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } }
DriverManager
該類進行數據庫驅動的管理,可以注冊多個數據庫驅動,根據url來動態(tài)的選擇不同的數據庫連接。
操作數據庫
Statement接口
使用Statement接口來操作靜態(tài)的SQL語句
executeUpdate方法
添加
/** * 插入操作 * @param sql */ public static void doInsert(String sql){ Connection conn = getConnection(); Statement statement = null; try { statement = conn.createStatement(); int result = statement.executeUpdate(sql); System.out.println(sql+"執(zhí)行成功,插入"+result+"條數據"); } catch (SQLException e) { throw new RuntimeException("執(zhí)行失敗",e); } finally { if(statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn); } }
修改
/** * 修改操作 * @param sql */ public static void doUpdate(String sql){ Connection conn = getConnection(); Statement statement = null; try { statement = conn.createStatement(); int result = statement.executeUpdate(sql); System.out.println(sql+"執(zhí)行成功,修改"+result+"條數據"); } catch (SQLException e) { throw new RuntimeException("執(zhí)行失敗",e); } finally { if(statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn); } }
刪除
/** * 刪除操作 * @param sql */ public static void doDelete(String sql){ Connection conn = getConnection(); Statement statement = null; try { statement = conn.createStatement(); int result = statement.executeUpdate(sql); System.out.println(sql+"執(zhí)行成功,刪除"+result+"條數據"); } catch (SQLException e) { throw new RuntimeException("執(zhí)行失敗",e); } finally { if(statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn); } }
PreparedStatement接口
該接口為Statement的子接口,屬于預處理操作,可以傳入帶有占位符的SQL,然后再進行補充占位符,索引值從1開始。
可以有效地禁止SQL注入
executeUpdate方法
插入
public static void doPreparedInsert(String name){ Connection conn = getConnection(); PreparedStatement statement = null; try { String sql = "insert into user (name) values (?)"; statement = conn.prepareStatement(sql); statement.setString(1,name); int result = statement.executeUpdate(); System.out.println(sql+"執(zhí)行成功,插入"+result+"條數據"); } catch (SQLException e) { throw new RuntimeException("執(zhí)行失敗",e); } finally { if(statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn); } }
在創(chuàng)建preparedStatement對象時,有一個重載方法
// 第二個參數表示一個是否返回自增主鍵的一個biaoshi // Statement.RETURN_GENERATED_KEYS // Statement.NO_GENERATED_KEYS PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
在使用該PreparedStatement執(zhí)行插入操作時,可以使用statement.getGeneratedKeys()來返回一個新生成主鍵的ResultSet對象,結果集中只有一列GENERATED_KEY,存放的新生成的主鍵值
更新
與插入類似
刪除
與插入類似
結果集
在查詢數據時,返回的是一個二維的結果集,使用ResultSet來遍歷結果集
public static void doQuery(){ String sql = "select * from user"; Connection conn = getConnection(); PreparedStatement statement = null; ResultSet resultSet = null; try { statement = conn.prepareStatement(sql); resultSet = statement.executeQuery(); // resultSet.next 方法 將光標向前移動一行,最初為第一行之前,第一次調用使得第一行為當前行 while (resultSet.next()){ int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("查詢到id為"+id+",name為"+name+"的記錄"); } } catch (SQLException throwables) { throwables.printStackTrace(); } finally { if(resultSet != null){ try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn,statement); } }
批量操作
public static void doBatchInsert(String sql){ Connection conn = getConnection(); PreparedStatement statement = null; try { statement = conn.prepareStatement(sql); for(int i = 0;i<1000;i++){ statement.setString(1,"張三"+i); // 積攢sql statement.addBatch(); } // 執(zhí)行sql statement.executeBatch(); // 清除積攢的sql statement.clearBatch(); } catch (SQLException throwables) { throwables.printStackTrace(); } finally { close(conn,statement); } }
以上就是JDBC連接數據庫步驟及基本操作示例詳解的詳細內容,更多關于JDBC連接基本操作的資料請關注腳本之家其它相關文章!
相關文章
Netty分布式ByteBuf使用page級別的內存分配解析
這篇文章主要介紹了Netty分布式ByteBuf使用page級別的內存分配解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03Java并發(fā)編程中的CompletableFuture使用詳解
這篇文章主要介紹了Java并發(fā)編程中的CompletableFuture使用詳解,Future接口定義了操作異步任務執(zhí)行的一些方法,如獲取異步任務執(zhí)行的結果、取消任務的執(zhí)行、判斷任務是否被取消,判斷任務是否執(zhí)行完畢等,需要的朋友可以參考下2023-12-12IDEA在plugins里搜不到mybatisx插件的解決方法
本文主要介紹了IDEA在plugins里搜不到mybatisx插件的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06SpringBoot啟動流程SpringApplication準備階段源碼分析
這篇文章主要為大家介紹了SpringBoot啟動流程SpringApplication準備階段源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04