JDBC連接數(shù)據(jù)庫步驟及基本操作示例詳解
JDBC基本操作
create table user( id int primary key auto_increment, name varchar(50) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
JDBC概念
JDBC是一個(gè)獨(dú)立于特定數(shù)據(jù)庫管理系統(tǒng)、通用的SQL數(shù)據(jù)庫存取和操作的公共接口,定義了用來訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)的Java類庫
連接步驟
- 加載驅(qū)動(dòng)
- 進(jìn)行數(shù)據(jù)庫連接
// 驅(qū)動(dòng) 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 { // 加載驅(qū)動(dòng) Class.forName(DRIVER); // 數(shù)據(jù)庫連接 conn = DriverManager.getConnection(URL,USER_NAME,PSW); } catch (ClassNotFoundException e) { System.out.println("加載驅(qū)動(dòng)失敗,請(qǐng)檢查是否引入Jar包或者驅(qū)動(dòng)名稱是否正確"); throw new RuntimeException("加載驅(qū)動(dòng)失敗,請(qǐng)檢查是否引入Jar包或者驅(qū)動(dòng)名稱是否正確",e); } catch (SQLException throwables) { System.out.println("連接數(shù)據(jù)庫失敗,請(qǐng)檢查數(shù)據(jù)庫地址,用戶名,密碼是否正確"); throw new RuntimeException("連接數(shù)據(jù)庫失敗,請(qǐng)檢查數(shù)據(jù)庫地址,用戶名,密碼是否正確",throwables); } return conn; } /** * 關(guān)閉連接 * @param conn */ public static void close(Connection conn){ if(conn != null){ try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } }
注意:為什么需要使用Class.forName()來加載數(shù)據(jù)庫驅(qū)動(dòng)
是因?yàn)樵诿總€(gè)Driver中都包含有一個(gè)靜態(tài)代碼塊,實(shí)際調(diào)用的是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
該類進(jìn)行數(shù)據(jù)庫驅(qū)動(dòng)的管理,可以注冊(cè)多個(gè)數(shù)據(jù)庫驅(qū)動(dòng),根據(jù)url來動(dòng)態(tài)的選擇不同的數(shù)據(jù)庫連接。
操作數(shù)據(jù)庫
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+"條數(shù)據(jù)"); } 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+"條數(shù)據(jù)"); } 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+"條數(shù)據(jù)"); } catch (SQLException e) { throw new RuntimeException("執(zhí)行失敗",e); } finally { if(statement != null){ try { statement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } close(conn); } }
PreparedStatement接口
該接口為Statement的子接口,屬于預(yù)處理操作,可以傳入帶有占位符的SQL,然后再進(jìn)行補(bǔ)充占位符,索引值從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+"條數(shù)據(jù)"); } 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對(duì)象時(shí),有一個(gè)重載方法
// 第二個(gè)參數(shù)表示一個(gè)是否返回自增主鍵的一個(gè)biaoshi // Statement.RETURN_GENERATED_KEYS // Statement.NO_GENERATED_KEYS PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
在使用該P(yáng)reparedStatement執(zhí)行插入操作時(shí),可以使用statement.getGeneratedKeys()來返回一個(gè)新生成主鍵的ResultSet對(duì)象,結(jié)果集中只有一列GENERATED_KEY,存放的新生成的主鍵值
更新
與插入類似
刪除
與插入類似
結(jié)果集
在查詢數(shù)據(jù)時(shí),返回的是一個(gè)二維的結(jié)果集,使用ResultSet來遍歷結(jié)果集
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 方法 將光標(biāo)向前移動(dòng)一行,最初為第一行之前,第一次調(diào)用使得第一行為當(dāng)前行 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連接數(shù)據(jù)庫步驟及基本操作示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JDBC連接基本操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Netty分布式ByteBuf使用page級(jí)別的內(nèi)存分配解析
這篇文章主要介紹了Netty分布式ByteBuf使用page級(jí)別的內(nèi)存分配解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03Java并發(fā)編程中的CompletableFuture使用詳解
這篇文章主要介紹了Java并發(fā)編程中的CompletableFuture使用詳解,Future接口定義了操作異步任務(wù)執(zhí)行的一些方法,如獲取異步任務(wù)執(zhí)行的結(jié)果、取消任務(wù)的執(zhí)行、判斷任務(wù)是否被取消,判斷任務(wù)是否執(zhí)行完畢等,需要的朋友可以參考下2023-12-12IDEA配置MAVEN本地倉庫的實(shí)現(xiàn)步驟
本文主要介紹了IDEA配置MAVEN本地倉庫的實(shí)現(xiàn)步驟,將詳細(xì)介紹如何配置Maven環(huán)境變量,Maven配置文件,可以輕松地設(shè)置和配置MAVEN本地倉庫,以便在IDEA中享受更高效的開發(fā)體驗(yàn)2023-08-08smslib發(fā)短信實(shí)例代碼(電腦發(fā)短信)
smslib發(fā)短信實(shí)例,大家可以參考使用開發(fā)自己的程序2013-12-12IDEA在plugins里搜不到mybatisx插件的解決方法
本文主要介紹了IDEA在plugins里搜不到mybatisx插件的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析
這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出
這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下2022-07-07