欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDBC連接數(shù)據(jù)庫步驟及基本操作示例詳解

 更新時(shí)間:2023年11月23日 11:30:13   作者:bug生產(chǎn)者  
這篇文章主要為大家介紹了JDBC連接數(shù)據(jù)庫步驟及基本操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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)文章

  • resttemplate設(shè)置params的方法

    resttemplate設(shè)置params的方法

    RestTemplate設(shè)置請(qǐng)求參數(shù)的方式根據(jù)請(qǐng)求類型(GET/POST)和參數(shù)形式(路徑參數(shù)、查詢參數(shù)、JSON請(qǐng)求體)有所不同,下面通過本文給大家介紹resttemplate設(shè)置params的方法,感興趣的朋友一起看看吧
    2025-04-04
  • 導(dǎo)入SpringCloud依賴踩的坑及解決

    導(dǎo)入SpringCloud依賴踩的坑及解決

    這篇文章主要介紹了導(dǎo)入SpringCloud依賴踩的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Netty分布式ByteBuf使用page級(jí)別的內(nèi)存分配解析

    Netty分布式ByteBuf使用page級(jí)別的內(nèi)存分配解析

    這篇文章主要介紹了Netty分布式ByteBuf使用page級(jí)別的內(nèi)存分配解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java并發(fā)編程中的CompletableFuture使用詳解

    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)步驟

    本文主要介紹了IDEA配置MAVEN本地倉庫的實(shí)現(xiàn)步驟,將詳細(xì)介紹如何配置Maven環(huán)境變量,Maven配置文件,可以輕松地設(shè)置和配置MAVEN本地倉庫,以便在IDEA中享受更高效的開發(fā)體驗(yàn)
    2023-08-08
  • JAVA垃圾收集器與內(nèi)存分配策略詳解

    JAVA垃圾收集器與內(nèi)存分配策略詳解

    這篇文章介紹了JAVA垃圾收集器與內(nèi)存分配策略,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-07-07
  • smslib發(fā)短信實(shí)例代碼(電腦發(fā)短信)

    smslib發(fā)短信實(shí)例代碼(電腦發(fā)短信)

    smslib發(fā)短信實(shí)例,大家可以參考使用開發(fā)自己的程序
    2013-12-12
  • IDEA在plugins里搜不到mybatisx插件的解決方法

    IDEA在plugins里搜不到mybatisx插件的解決方法

    本文主要介紹了IDEA在plugins里搜不到mybatisx插件的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析

    SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析

    這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出

    詳解Java線程池如何實(shí)現(xiàn)優(yōu)雅退出

    這篇文章我們將從源碼角度深度解析線程池是如何優(yōu)雅的退出程序的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java線程池有一定幫助,需要的可以參考一下
    2022-07-07

最新評(píng)論