亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JDBC連接數據庫步驟及基本操作示例詳解

 更新時間:2023年11月23日 11:30:13   作者:bug生產者  
這篇文章主要為大家介紹了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連接基本操作的資料請關注腳本之家其它相關文章!

相關文章

  • resttemplate設置params的方法

    resttemplate設置params的方法

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

    導入SpringCloud依賴踩的坑及解決

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

    Netty分布式ByteBuf使用page級別的內存分配解析

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

    Java并發(fā)編程中的CompletableFuture使用詳解

    這篇文章主要介紹了Java并發(fā)編程中的CompletableFuture使用詳解,Future接口定義了操作異步任務執(zhí)行的一些方法,如獲取異步任務執(zhí)行的結果、取消任務的執(zhí)行、判斷任務是否被取消,判斷任務是否執(zhí)行完畢等,需要的朋友可以參考下
    2023-12-12
  • IDEA配置MAVEN本地倉庫的實現步驟

    IDEA配置MAVEN本地倉庫的實現步驟

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

    JAVA垃圾收集器與內存分配策略詳解

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

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

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

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

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

    SpringBoot啟動流程SpringApplication準備階段源碼分析

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

    詳解Java線程池如何實現優(yōu)雅退出

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

最新評論