JDBC連接SQL?Server數(shù)據(jù)庫(kù)實(shí)現(xià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è)中秋猜燈謎小游戲
眾所周知,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-09springboot+zookeeper實(shí)現(xiàn)分布式鎖的示例代碼
本文主要介紹了springboot+zookeeper實(shí)現(xiàn)分布式鎖的示例代碼,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03SpringBoot @Async如何自定義線程池及使用教程
這篇文章主要介紹了SpringBoot @Async如何自定義線程池及使用教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Flutter驗(yàn)證碼輸入框的2種方法實(shí)現(xiàn)
本文主要介紹了Flutter驗(yàn)證碼輸入框的2種方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12mybatis.type-aliases-package的作用及用法說明
這篇文章主要介紹了mybatis.type-aliases-package的作用及用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09java 實(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)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04