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

