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

JDBC連接SQL?Server數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查的全過程

 更新時(shí)間:2023年04月03日 11:46:47   作者:Richard?Du  
實(shí)際開發(fā)中手動(dòng)的輸入SQL語(yǔ)句是少之又少,大多數(shù)情況下是通過編譯代碼進(jìn)行來控制自動(dòng)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于JDBC連接SQL?Server數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下

前言

JDBC的全稱是Java數(shù)據(jù)庫(kù)連接(Java DataBase Connectivity) ,應(yīng)用程序通過JDBC連接到數(shù)據(jù)庫(kù),使用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行查詢、增加、修改、刪除等操作。此文章提供JDBC連接SQL Server的所有步驟,幫助大家實(shí)現(xiàn)Java對(duì)數(shù)據(jù)庫(kù)的增刪改查!

JDBC訪問數(shù)據(jù)庫(kù)的方式 

一、連接前準(zhǔn)備  

1. 環(huán)境配置

我們右鍵點(diǎn)擊“開始”菜單打開“計(jì)算機(jī)管理”,接下來以此打卡樹形菜單,啟用所有協(xié)議。

 下一步,打開控制面版—>程序—>程序與功能—>啟用或關(guān)閉Windows功能 —>勾選 Telnet客戶端

 接下來,重啟計(jì)算機(jī),在此之前請(qǐng)務(wù)必點(diǎn)擊“收藏”或“關(guān)注”,以免找不到下一步教程。

 重啟后,按Win+R,輸入cmd后按回車,輸入命令:

telnet localhost 1433

進(jìn)入只有光標(biāo)閃爍的空白頁(yè)面即通信成功。

2. 導(dǎo)入JDBC Driver包

下面講解的方法都是基于 IntelliJ IDEA 軟件,如果是 Eclipse 會(huì)有細(xì)微差別。

首先,在連接JDBC之前,需要下載MS JDBC Driver包,下載地址:Download Microsoft SQL Server JDBC 驅(qū)動(dòng)程序 6.0 from Official Microsoft Download Center

下載完后解壓縮并打開,我們可以看到有 jre7和jre8兩個(gè)Java環(huán)境下使用的JDBC包,分別對(duì)應(yīng)兩個(gè)不同的jar包。需要根據(jù)自己的安裝的Java版本進(jìn)行選擇,jre8即最新版本,如果出現(xiàn)SSL連接異常需要降低JDK版本。

 然后我們進(jìn)入IDEA,點(diǎn)擊File—>Priject Structure—>Libraries—> + —>Java —>Select Library Files,選擇sqljdbc.jar

 如果能在首頁(yè)看到External Libraries下面有sqljdbc42即表示導(dǎo)入成功。

 二、連接SQL Server

 JDBC的實(shí)現(xiàn)步驟

通過上圖我們了解到,想要實(shí)現(xiàn)JDBC首先就需要加載并注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)。第一步,加載并注冊(cè)驅(qū)動(dòng)可以通過java.lang.Class類的靜態(tài)方法forName實(shí)現(xiàn)。

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

 第二步,通過DriverManager類的getConnection方法實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接。

String databaseName = "數(shù)據(jù)庫(kù)名";
String username = "用戶名";
String password = "密碼";
String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=" + databaseName;
Connection conn = DriverManager.getConnection(dbURL, username, password);

第三步,try…catch拋出異常。

 
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver";);
            String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=" + databaseName;
            Connection conn = DriverManager.getConnection(dbURL, username, password);
            System.out.println("Successful Connection !");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Connection failed !");
        }

 三、實(shí)現(xiàn)增刪改查

實(shí)現(xiàn)增刪改查之前,為了閱讀方便,我們需要新建一個(gè)容納這些功能的類,并且創(chuàng)建兩個(gè)類變量,方便在各個(gè)方法中調(diào)用。這里我們將類命名為ConnectionDb,創(chuàng)建Connection對(duì)象conn。

public class ConnectDb {
    public Connection conn;
}

接下來創(chuàng)建四個(gè)方法:查詢、增加、修改、刪除。

public class ConnectDb {
    private Connection conn;
    public void SelectAll(){}//查詢表
    public void AddValue(){}//添加數(shù)據(jù)
    public void DeleteValue(){}//修改數(shù)據(jù)
    public void ModifyValue(){}//刪除數(shù)據(jù)
}

下面就是實(shí)現(xiàn)方法的代碼: 

1. 查詢數(shù)據(jù)

public void SelectAll(String tableName,String where) {
        ResultSetMetaData rsmd = null;
        try {//try catch判斷是否有異常
            Statement sqlStatement = conn.createStatement();//創(chuàng)建sql語(yǔ)句
            String sql = "select * from " + tableName+" "+where;
            ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語(yǔ)句
            //下面根據(jù)該table輸出屬性組和所有元組
            rsmd = rs.getMetaData();//獲取屬性名
            String []arr = new String[0];
            if(rsmd != null) {
                int count = rsmd.getColumnCount();//統(tǒng)計(jì)屬性個(gè)數(shù)
                arr = new String[count];
                for (int i = 1; i <= count; i++) {
                    arr[i-1] = rsmd.getColumnName(i);//把屬性名輸入arr
                    System.out.print(rsmd.getColumnName(i)+"  ");//輸出屬性名
                }
            }
            System.out.println();//換一行,保證格式正確
            while (rs.next()) {
                //判斷是否存在下一行,如果存在,就使用foreach循環(huán)輸出元組
                for (String s : arr) {
                    System.out.print(rs.getString(s) + "  ");
                }
                System.out.println();//控制格式
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2. 添加數(shù)據(jù)

public void AddValue(String tableName){
        ResultSetMetaData rsmd = null;
        Scanner in = new Scanner(System.in);
        StringBuilder s1 = new StringBuilder();//創(chuàng)建字符串對(duì)象
 
        try {
            Statement sqlStatement = conn.createStatement();//創(chuàng)建語(yǔ)句對(duì)象
            String sql = "select * from " + tableName;
            ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語(yǔ)句
            //下面根據(jù)該table輸出屬性組
            rsmd = rs.getMetaData();//獲取屬性名
            System.out.print("Input values according to :");
            if (rsmd != null) {
                int count = rsmd.getColumnCount();//統(tǒng)計(jì)屬性個(gè)數(shù)
                for (int i = 1; i <= count; i++) {
                    if(i<count){
                        //輸出屬性名
                        System.out.print(rsmd.getColumnName(i) + "["+rsmd.getColumnTypeName(i)+"("+rsmd.getColumnDisplaySize(i)+")],");
                    }else System.out.print(rsmd.getColumnName(i) + "["+rsmd.getColumnTypeName(i)+"("+rsmd.getColumnDisplaySize(i)+")]");
                }
            }
            System.out.println();
            //輸入需要添加的值用英文逗號(hào)分隔
            String values =in.next();
            String[] arr = values.split(",");
            for(int i = 0; i<arr.length; i++){
                //把每個(gè)分量按SQL格式依次輸入到對(duì)象s1中
                if(i<arr.length-1)
                {
                    s1.append("'").append(arr[i]).append("',");
                }else s1.append("'").append(arr[i]).append("'");
            }
            String insertSql = "insert into " + tableName + " values("+s1+")";//SQL語(yǔ)句
            sqlStatement.executeUpdate(insertSql);
            System.out.println("Execute Successful !");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Execute failed !");
        }
    }

3. 修改數(shù)據(jù)

public void ModifyValue(String tableName){
        ResultSetMetaData rsmd = null;
        Scanner in = new Scanner(System.in);
        try {
            Statement sqlStatement = conn.createStatement();//創(chuàng)建sql語(yǔ)句
            String sql = "select * from " + tableName;
            ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語(yǔ)句
            //下面根據(jù)該table輸出屬性組
            rsmd = rs.getMetaData();//獲取屬性名
            Map map = new HashMap();
            System.out.print("Filter column. ");
            if (rsmd != null) {
                int count = rsmd.getColumnCount();//統(tǒng)計(jì)屬性個(gè)數(shù)
                for (int i = 1; i <= count; i++) {
                    map.put(i,rsmd.getColumnName(i));
                    System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");//輸出屬性名
                }
            }
            System.out.print("\nInput the number: ");//篩選屬性
            Object num = in.nextInt();
            System.out.print("Filter value: ");//篩選元組
            String value = in.next();
            SelectAll(tableName,"where "+map.get(num)+"='"+value+"'");//調(diào)用查詢方法,查詢篩選數(shù)據(jù)
            System.out.println("Are these values that need to be modified? [Y/N]");
            String YesOrNo = in.next();
            if(YesOrNo.charAt(0) == 'Y')
            {
                System.out.println("Which column should be modified?");
                if (rsmd != null) {//輸出屬性名
                    int count = rsmd.getColumnCount();
                    for (int i = 1; i <= count; i++) {
                        System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");
                    }
                }
                System.out.print("\nInput the number: ");//輸入需要修改的屬性
                int num2 = in.nextInt();
                System.out.println("What value is modified to?");//修改成什么值
                String value2 = in.next();
                String modifySql = "update "+tableName+" set "+map.get(num2)+"='"+value2+"'"+" where "+map.get(num)+"="+"'"+value+"'";
                sqlStatement.executeUpdate(modifySql);
                System.out.println("Execute Successful !");
            } else if (YesOrNo.charAt(0) == 'N') {
                ModifyValue(tableName);//如果不修改以上內(nèi)容,重新選擇需要修改的元組
            } else System.out.println("Input error! System exit.");//除Y和N以外的鍵自動(dòng)退出
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Execute failed !");
        }
    }

4. 刪除數(shù)據(jù)

public void DeleteValue(String tableName){
        //選擇列名,詢問是否刪除以下數(shù)據(jù),選擇Y刪除。
        ResultSetMetaData rsmd = null;
        Scanner in = new Scanner(System.in);
        try {
            Statement sqlStatement = conn.createStatement();//創(chuàng)建sql語(yǔ)句
            String sql = "select * from " + tableName;
            ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語(yǔ)句
            //下面根據(jù)該table輸出屬性組
            rsmd = rs.getMetaData();//獲取屬性名
            Map map = new HashMap();
            System.out.print("Filter column. ");//篩選屬性
            if (rsmd != null) {//輸出屬性名
                int count = rsmd.getColumnCount();
                for (int i = 1; i <= count; i++) {
                    map.put(i,rsmd.getColumnName(i));
                    System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");
                }
            }
            System.out.print("\nInput the number: ");
            Object num = in.nextInt();
            System.out.println("Filter value: ");//篩選元組
            String value = in.next();
            System.out.println("These values will be deleted.");
            SelectAll(tableName,"where "+map.get(num)+"='"+value+"'");//調(diào)用查詢方法,查詢需要?jiǎng)h除的元組
            System.out.println("[Y/N]?");
            String YesOrNo = in.next();
            if(YesOrNo.charAt(0) == 'Y')
            {
                String deleteSql = "delete from "+tableName+" where "+map.get(num)+"='"+value+"'";
                sqlStatement.executeUpdate(deleteSql);//執(zhí)行刪除語(yǔ)句
                System.out.println("Execute Successful !");
            } else if (YesOrNo.charAt(0) == 'N') {
                DeleteValue(tableName);//如果不刪除,重新選擇需要?jiǎng)h除的元組
            } else System.out.println("Input error! System exit.");//除Y和N以外的鍵自動(dòng)退出
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Execute failed !");
        }
    }

5. 拓展

數(shù)據(jù)庫(kù)增刪改功能定義好后我們可以進(jìn)一步整合,首先在main方法中調(diào)用并測(cè)試。

connectDb.SelectAll("表名","where條件句");//where條件句為空則查詢所有元組
connectDb.AddValue("表名");//增加元組
connectDb.DeleteValue("表名");//刪除元組
connectDb.ModifyValue("表名");//修改元組

我們可以發(fā)現(xiàn),在操作表時(shí),我們必須在方法中輸入實(shí)參:表名,如果操作不同的表就需要再次修改實(shí)參,下面我們定義一個(gè)可以自行選擇數(shù)據(jù)庫(kù)表名的方法。

第一步,在class ConnectDb中聲明一個(gè)tableName全局變量。

public class ConnectDb {
    public String tableName;
    ...
}

第二步,創(chuàng)建TableList方法,輸出數(shù)據(jù)庫(kù)內(nèi)所有表,并要求選擇一個(gè)表,將表名賦給tableName,代碼如下。

public void TableList(){
        Scanner in = new Scanner(System.in);
        Map map = new HashMap();
        int i = 0;
        try {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet mrs = metaData.getTables(null, null, null, new String[]{"TABLE"});
            while (mrs.next()) {
                i++;
                map.put(i, mrs.getString(3));
                System.out.println("[" + i + ": " + mrs.getString(3) + "]");
            }
            System.out.print("Input the number: ");
            int num = in.nextInt();
            this.tableName = (String) map.get(num);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

 第三步,補(bǔ)充main方法。

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        ConnectDb connectDb = new ConnectDb("數(shù)據(jù)庫(kù)名","用戶名","密碼");
        System.out.println("Please choose a table.");
        connectDb.TableList();
        String n;
        do {//Y/N判斷是否繼續(xù)操作數(shù)據(jù)表
            System.out.println("Please choose an operation.\n[1: Select all rows],[2: Add values],[3: Delete values],[4: Modify values]");
            Scanner in = new Scanner(System.in);
            System.out.print("Input the number: ");
            int i = in.nextInt();
            switch (i) {
                case 1:
                    connectDb.SelectAll(connectDb.tableName,"");//查詢所有元組
                    break;
                case 2:
                    connectDb.AddValue(connectDb.tableName);//增加元組
                    break;
                case 3:
                    connectDb.DeleteValue(connectDb.tableName);//刪除元組
                    break;
                case 4:
                    connectDb.ModifyValue(connectDb.tableName);//修改元組
            }
            System.out.println("Do you wanna continue to operate? [Y/N]");
            n = in.next();
        }while((n.charAt(0) == 'Y') && (n.charAt(0) != 'N'));
    }
}

結(jié)果展示。

總結(jié)

到此這篇關(guān)于JDBC連接SQL Server數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪改查的文章就介紹到這了,更多相關(guān)JDBC連接SQLServer增刪改查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java事件監(jiān)聽編寫一個(gè)中秋猜燈謎小游戲

    基于Java事件監(jiān)聽編寫一個(gè)中秋猜燈謎小游戲

    眾所周知,JavaSwing是Java中關(guān)于窗口開發(fā)的一個(gè)工具包,可以開發(fā)一些窗口程序,然后由于工具包的一些限制,導(dǎo)致Java在窗口開發(fā)商并沒有太多優(yōu)勢(shì),不過,在JavaSwing中關(guān)于事件的監(jiān)聽機(jī)制是我們需要重點(diǎn)掌握的內(nèi)容,本文將基于Java事件監(jiān)聽編寫一個(gè)中秋猜燈謎小游戲
    2023-09-09
  • springboot+zookeeper實(shí)現(xiàn)分布式鎖的示例代碼

    springboot+zookeeper實(shí)現(xiàn)分布式鎖的示例代碼

    本文主要介紹了springboot+zookeeper實(shí)現(xiàn)分布式鎖的示例代碼,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot @Async如何自定義線程池及使用教程

    SpringBoot @Async如何自定義線程池及使用教程

    這篇文章主要介紹了SpringBoot @Async如何自定義線程池及使用教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • Java在枚舉類型中增加自定義方法詳解

    Java在枚舉類型中增加自定義方法詳解

    這篇文章主要介紹了Java在枚舉類型中增加自定義方法詳解,對(duì)于枚舉類型來說,除了無法繼承它以外,基本可以將它看作一個(gè)普通的類,這意味著你可以在里面增加自定義的方法,甚至可以增加一個(gè) main() 方法,需要的朋友可以參考下
    2023-11-11
  • Flutter驗(yàn)證碼輸入框的2種方法實(shí)現(xiàn)

    Flutter驗(yàn)證碼輸入框的2種方法實(shí)現(xiàn)

    本文主要介紹了Flutter驗(yàn)證碼輸入框的2種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • mybatis.type-aliases-package的作用及用法說明

    mybatis.type-aliases-package的作用及用法說明

    這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程

    dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程

    這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring@Value使用獲取配置信息為null的操作

    Spring@Value使用獲取配置信息為null的操作

    這篇文章主要介紹了Spring@Value使用獲取配置信息為null的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java 實(shí)現(xiàn)文件夾的拷貝實(shí)例代碼

    java 實(shí)現(xiàn)文件夾的拷貝實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)文件夾的拷貝實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    這篇文章主要介紹了圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評(píng)論