目錄
一、連接前準備
?1. 環(huán)境配置
?2. 下載JAR包
3. 添加環(huán)境變量
4. 導入JDBC包
?二、連接SQL Server
?三、實現(xiàn)增刪改查
1. 查詢數(shù)據(jù)
2. 添加數(shù)據(jù)
3. 修改數(shù)據(jù)
4. 刪除數(shù)據(jù)
5. 拓展
JDBC的全稱是Java數(shù)據(jù)庫連接(Java DataBase Connectivity) ,應(yīng)用程序通過JDBC連接到數(shù)據(jù)庫,使用SQL語句對數(shù)據(jù)庫中的表進行查詢、增加、修改、刪除等操作。此文章提供JDBC連接SQL Server的所有步驟,幫助大家實現(xiàn)Java對數(shù)據(jù)庫的增刪改查!
JDBC訪問數(shù)據(jù)庫的方式?
一、連接前準備
?1. 環(huán)境配置
我們右鍵點擊“開始”菜單打開“計算機管理”,接下來以此打開樹形菜單,啟用所有協(xié)議。
?下一步,打開控制面版—>程序—>程序與功能—>啟用或關(guān)閉Windows功能 —>勾選 Telnet客戶端
?接下來,重啟計算機,在此之前請務(wù)必點擊“收藏”或“關(guān)注”,以免找不到下一步教程。
?重啟后,按Win+R,輸入cmd后按回車,輸入命令:
telnet localhost 1433
進入只有光標閃爍的空白頁面即通信成功。
?2. 下載JAR包
下面講解的方法都是基于 IntelliJ?IDEA?軟件,如果是?Eclipse?會有細微差別。
首先,在連接JDBC之前,需要下載MS JDBC Driver包,下載地址:下載 Microsoft SQL Server JDBC 驅(qū)動程序https://learn.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server
那么如何選擇正確的JDBC呢?
請參照以下對應(yīng)規(guī)則下載相應(yīng)的JDBC驅(qū)動版本。
從 Microsoft JDBC Driver 12.2 for SQL Server 開始,支持 Java 開發(fā)工具包 (JDK) 19.0 和 Java Runtime Environment (JRE) 19.0。
從 Microsoft JDBC Driver 11.2 for SQL Server 開始,支持 Java 開發(fā)工具包 (JDK) 18.0 和 Java Runtime Environment (JRE) 18.0。
從 Microsoft JDBC Driver 10.2 for SQL Server 開始,支持 Java Development Kit (JDK) 17.0 和 Java Runtime Environment (JRE) 17.0。
從 Microsoft JDBC Driver 9.4 for SQL Server 開始,支持 Java Development Kit (JDK) 16.0 和 Java Runtime Environment (JRE) 16.0。
從 Microsoft JDBC Driver 9.2 for SQL Server 開始,支持 Java Development Kit (JDK) 15.0 和 Java Runtime Environment (JRE) 15.0。
從 Microsoft JDBC Driver 8.4 for SQL Server 開始,支持 Java Development Kit (JDK) 14.0 和 Java Runtime Environment (JRE) 14.0。
從 Microsoft JDBC Driver 8.2 for SQL Server 開始,支持 Java Development Kit (JDK) 13.0 和 Java Runtime Environment (JRE) 13.0。
從 Microsoft JDBC Driver 7.4 for SQL Server 開始,支持 Java Development Kit (JDK) 12.0 和 Java Runtime Environment (JRE) 12.0。
從 Microsoft JDBC Driver 7.2 for SQL Server 開始,支持 Java Development Kit (JDK) 11.0 和 Java Runtime Environment (JRE) 11.0。
從 Microsoft JDBC Driver 7.0 for SQL Server 開始,支持 Java Development Kit (JDK) 10.0 和 Java Runtime Environment (JRE) 10.0。
從 Microsoft JDBC Driver 6.4 for SQL Server 開始,支持 Java Development Kit (JDK) 9.0 和 Java Runtime Environment (JRE) 9.0。
從 Microsoft JDBC Driver 4.2 for SQL Server 開始,支持 Java Development Kit (JDK) 8.0 和 Java Runtime Environment (JRE) 8.0。 對 JDBC 規(guī)范 API 的支持已擴展為包含 JDBC 4.1 和 4.2 API。
從 Microsoft JDBC Driver 4.1 for SQL Server 開始,支持 Java Development Kit (JDK) 7.0 和 Java Runtime Environment (JRE) 7.0。
從 Microsoft JDBC Driver 4.0 for SQL Server 開始,JDBC 規(guī)范 API 的JDBC 驅(qū)動程序支持擴展為包含 JDBC 4.0 API。 已在 Java 開發(fā)工具包 (JDK) 6.0 和 Java 運行時環(huán)境 (JRE) 6.0 中引入了 JDBC 4.0 API。 JDBC 4.0 是 JDBC 3.0 API 的超集。
更詳細的與你的JDK版本匹配的JAR包可以從下面的官網(wǎng)文檔鏈接中查找,系統(tǒng)要求 - JDBC Driver for SQL Server | Microsoft Learn
?例如下表就準確指定了相應(yīng)的版本:
JAR | JDBC 版本法規(guī)遵從性 | 推薦的 Java 版本 | 說明 |
---|---|---|---|
mssql-jdbc-12.4.0.jre8.jar | 4.2 | 8 | 需要 Java Runtime Environment (JRE) 1.8。 使用 JRE 1.7 或更低版本會引發(fā)異常。 |
mssql-jdbc-12.4.0.jre11.jar | 4.3 | 20 | 需要 Java Runtime Environment (JRE) 11.0 或更高版本。 使用 JRE 10.0 或更低版本會引發(fā)異常。 |
然后在此鏈接下載合適的jar包:發(fā)行說明 - JDBC Driver for SQL Server | Microsoft Learnhttps://learn.microsoft.com/zh-cn/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16#84
下載完后解壓縮并打開,可以在目錄中找到后綴名為.jar的文件,即需要導入到項目工程的包。
3. 添加環(huán)境變量
在添加兩個包含.jar的環(huán)境變量,例如:
變量名:CLASSPATH
變量值:C:\Program Files\Microsoft JDBC Driver 11.2 for SQL Server\sqljdbc_12.2\chs\mssql-jdbc-12.2.0.jre8.jar;C:\Program Files\Microsoft JDBC Driver 11.2 for SQL Server\sqljdbc_12.2\chs\mssql-jdbc-12.2.0.jre11.jar
打開環(huán)境變量的方式。Win7:桌面或開始菜單找到“計算機”->右鍵單擊選擇"屬性"->高級系統(tǒng)設(shè)置->環(huán)境變量,Win10:設(shè)置->系統(tǒng)->關(guān)于->高級系統(tǒng)設(shè)置->環(huán)境變量,Win11:設(shè)置->系統(tǒng)->系統(tǒng)信息->高級系統(tǒng)設(shè)置->環(huán)境變量。
4. 導入JDBC包
然后我們進入IDEA,點擊File—>Priject Structure—>Libraries—> + —>Java —>Select Library Files,選擇sqljdbc.jar
?
?如果能在首頁看到External Libraries下面有sqljdbc42即表示導入成功。
?二、連接SQL Server
?JDBC的實現(xiàn)步驟
通過上圖我們了解到,想要實現(xiàn)JDBC首先就需要加載并注冊數(shù)據(jù)庫驅(qū)動。第一步,加載并注冊驅(qū)動可以通過java.lang.Class類的靜態(tài)方法forName實現(xiàn)。
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
?第二步,通過DriverManager類的getConnection方法實現(xiàn)數(shù)據(jù)庫連接。
String databaseName = "數(shù)據(jù)庫名";
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 !");
}
?三、實現(xiàn)增刪改查
實現(xiàn)增刪改查之前,為了閱讀方便,我們需要新建一個容納這些功能的類,并且創(chuàng)建兩個類變量,方便在各個方法中調(diào)用。這里我們將類命名為ConnectionDb,創(chuàng)建Connection對象conn。
public class ConnectDb {
public Connection conn;
}
接下來創(chuàng)建四個方法:查詢、增加、修改、刪除。
public class ConnectDb {
private Connection conn;
public void SelectAll(){}//查詢表
public void AddValue(){}//添加數(shù)據(jù)
public void DeleteValue(){}//修改數(shù)據(jù)
public void ModifyValue(){}//刪除數(shù)據(jù)
}
下面就是實現(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語句
String sql = "select * from " + tableName+" "+where;
ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語句
//下面根據(jù)該table輸出屬性組和所有元組
rsmd = rs.getMetaData();//獲取屬性名
String []arr = new String[0];
if(rsmd != null) {
int count = rsmd.getColumnCount();//統(tǒng)計屬性個數(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)建字符串對象
try {
Statement sqlStatement = conn.createStatement();//創(chuàng)建語句對象
String sql = "select * from " + tableName;
ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語句
//下面根據(jù)該table輸出屬性組
rsmd = rs.getMetaData();//獲取屬性名
System.out.print("Input values according to :");
if (rsmd != null) {
int count = rsmd.getColumnCount();//統(tǒng)計屬性個數(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();
//輸入需要添加的值用英文逗號分隔
String values =in.next();
String[] arr = values.split(",");
for(int i = 0; i<arr.length; i++){
//把每個分量按SQL格式依次輸入到對象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語句
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語句
String sql = "select * from " + tableName;
ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語句
//下面根據(jù)該table輸出屬性組
rsmd = rs.getMetaData();//獲取屬性名
Map map = new HashMap();
System.out.print("Filter column. ");
if (rsmd != null) {
int count = rsmd.getColumnCount();//統(tǒng)計屬性個數(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以外的鍵自動退出
} 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語句
String sql = "select * from " + tableName;
ResultSet rs = sqlStatement.executeQuery(sql);//執(zhí)行sql語句
//下面根據(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)用查詢方法,查詢需要刪除的元組
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í)行刪除語句
System.out.println("Execute Successful !");
} else if (YesOrNo.charAt(0) == 'N') {
DeleteValue(tableName);//如果不刪除,重新選擇需要刪除的元組
} else System.out.println("Input error! System exit.");//除Y和N以外的鍵自動退出
} catch (Exception e) {
e.printStackTrace();
System.out.println("Execute failed !");
}
}
5. 拓展
數(shù)據(jù)庫增刪改功能定義好后我們可以進一步整合,首先在main方法中調(diào)用并測試。
connectDb.SelectAll("表名","where條件句");//where條件句為空則查詢所有元組
connectDb.AddValue("表名");//增加元組
connectDb.DeleteValue("表名");//刪除元組
connectDb.ModifyValue("表名");//修改元組
我們可以發(fā)現(xiàn),在操作表時,我們必須在方法中輸入實參:表名,如果操作不同的表就需要再次修改實參,下面我們定義一個可以自行選擇數(shù)據(jù)庫表名的方法。
第一步,在class ConnectDb中聲明一個tableName全局變量。
public class ConnectDb {
public String tableName;
...
}
第二步,創(chuàng)建TableList方法,輸出數(shù)據(jù)庫內(nèi)所有表,并要求選擇一個表,將表名賦給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();
}
}
?第三步,補充main方法。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ConnectDb connectDb = new ConnectDb("數(shù)據(jù)庫名","用戶名","密碼");
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é)果展示。文章來源:http://www.zghlxwxcb.cn/news/detail-779711.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-779711.html
到了這里,關(guān)于JDBC如何連接SQL Server數(shù)據(jù)庫實現(xiàn)增刪改查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!