当前位置:   article > 正文

JDBC如何连接SQL Server数据库实现增删改查_jdbc连接sql server数据库

jdbc连接sql server数据库

目录

一、连接前准备

 1. 环境配置

 2. 下载JAR包

3. 添加环境变量

4. 导入JDBC包

 二、连接SQL Server

 三、实现增删改查

1. 查询数据

2. 添加数据

3. 修改数据

4. 删除数据

5. 拓展


JDBC的全称是Java数据库连接(Java DataBase Connectivity) ,应用程序通过JDBC连接到数据库,使用SQL语句对数据库中的表进行查询、增加、修改、删除等操作。此文章提供JDBC连接SQL Server的所有步骤,帮助大家实现Java对数据库的增删改查!

JDBC访问数据库的方式 

一、连接前准备

 1. 环境配置

我们右键点击“开始”菜单打开“计算机管理”,接下来以此打开树形菜单,启用所有协议。

 下一步,打开控制面版—>程序—>程序与功能—>启用或关闭Windows功能 —>勾选 Telnet客户端

 接下来,重启计算机,在此之前请务必点击“收藏”或“关注”,以免找不到下一步教程。


 重启后,按Win+R,输入cmd后按回车,输入命令:

telnet localhost 1433

进入只有光标闪烁的空白页面即通信成功。

 2. 下载JAR包

下面讲解的方法都是基于 IntelliJ IDEA 软件,如果是 Eclipse 会有细微差别。

首先,在连接JDBC之前,需要下载MS JDBC Driver包,下载地址:下载 Microsoft SQL Server JDBC 驱动程序icon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server

那么如何选择正确的JDBC呢?

请参照以下对应规则下载相应的JDBC驱动版本。

  1. 从 Microsoft JDBC Driver 12.2 for SQL Server 开始,支持 Java 开发工具包 (JDK) 19.0 和 Java Runtime Environment (JRE) 19.0
  2. 从 Microsoft JDBC Driver 11.2 for SQL Server 开始,支持 Java 开发工具包 (JDK) 18.0 和 Java Runtime Environment (JRE) 18.0
  3. 从 Microsoft JDBC Driver 10.2 for SQL Server 开始,支持 Java Development Kit (JDK) 17.0 和 Java Runtime Environment (JRE) 17.0
  4. 从 Microsoft JDBC Driver 9.4 for SQL Server 开始,支持 Java Development Kit (JDK) 16.0 和 Java Runtime Environment (JRE) 16.0
  5. 从 Microsoft JDBC Driver 9.2 for SQL Server 开始,支持 Java Development Kit (JDK) 15.0 和 Java Runtime Environment (JRE) 15.0
  6. 从 Microsoft JDBC Driver 8.4 for SQL Server 开始,支持 Java Development Kit (JDK) 14.0 和 Java Runtime Environment (JRE) 14.0
  7. 从 Microsoft JDBC Driver 8.2 for SQL Server 开始,支持 Java Development Kit (JDK) 13.0 和 Java Runtime Environment (JRE) 13.0
  8. 从 Microsoft JDBC Driver 7.4 for SQL Server 开始,支持 Java Development Kit (JDK) 12.0 和 Java Runtime Environment (JRE) 12.0
  9. 从 Microsoft JDBC Driver 7.2 for SQL Server 开始,支持 Java Development Kit (JDK) 11.0 和 Java Runtime Environment (JRE) 11.0
  10. 从 Microsoft JDBC Driver 7.0 for SQL Server 开始,支持 Java Development Kit (JDK) 10.0 和 Java Runtime Environment (JRE) 10.0
  11. 从 Microsoft JDBC Driver 6.4 for SQL Server 开始,支持 Java Development Kit (JDK) 9.0 和 Java Runtime Environment (JRE) 9.0
  12. 从 Microsoft JDBC Driver 4.2 for SQL Server 开始,支持 Java Development Kit (JDK) 8.0 和 Java Runtime Environment (JRE) 8.0。 对 JDBC 规范 API 的支持已扩展为包含 JDBC 4.14.2 API。
  13. 从 Microsoft JDBC Driver 4.1 for SQL Server 开始,支持 Java Development Kit (JDK) 7.0 和 Java Runtime Environment (JRE) 7.0
  14. 从 Microsoft JDBC Driver 4.0 for SQL Server 开始,JDBC 规范 API 的JDBC 驱动程序支持扩展为包含 JDBC 4.0 API。 已在 Java 开发工具包 (JDK) 6.0 和 Java 运行时环境 (JRE) 6.0 中引入了 JDBC 4.0 API。 JDBC 4.0 是 JDBC 3.0 API 的超集。

更详细的与你的JDK版本匹配的JAR包可以从下面的官网文档链接中查找,系统要求 - JDBC Driver for SQL Server | Microsoft Learn

 例如下表就准确指定了相应的版本:

JARJDBC 版本法规遵从性推荐的 Java 版本说明
mssql-jdbc-12.4.0.jre8.jar4.28需要 Java Runtime Environment (JRE) 1.8。 使用 JRE 1.7 或更低版本会引发异常。
mssql-jdbc-12.4.0.jre11.jar4.320需要 Java Runtime Environment (JRE) 11.0 或更高版本。 使用 JRE 10.0 或更低版本会引发异常。

然后在此链接下载合适的jar包:发行说明 - JDBC Driver for SQL Server | Microsoft Learnicon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16#84

下载完后解压缩并打开,可以在目录中找到后缀名为.jar的文件,即需要导入到项目工程的包。

3. 添加环境变量

在添加两个包含.jar的环境变量,例如:

  1. 变量名:CLASSPATH
  2. 变量值: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

打开环境变量的方式。Win7:桌面或开始菜单找到“计算机”->右键单击选择"属性"->高级系统设置->环境变量,Win10:设置->系统->关于->高级系统设置->环境变量,Win11:设置->系统->系统信息->高级系统设置->环境变量。

4. 导入JDBC包

然后我们进入IDEA,点击File—>Priject Structure—>Libraries—> + —>Java —>Select Library Files,选择sqljdbc.jar

 

 如果能在首页看到External Libraries下面有sqljdbc42即表示导入成功。

 二、连接SQL Server

 JDBC的实现步骤

通过上图我们了解到,想要实现JDBC首先就需要加载并注册数据库驱动。第一步,加载并注册驱动可以通过java.lang.Class类的静态方法forName实现。

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

 第二步,通过DriverManager类的getConnection方法实现数据库连接。

  1. String databaseName = "数据库名";
  2. String username = "用户名";
  3. String password = "密码";
  4. String dbURL = "jdbc:sqlserver://localhost:1433;databaseName=" + databaseName;
  5. Connection conn = DriverManager.getConnection(dbURL, username, password);

第三步,try…catch抛出异常。

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

 三、实现增删改查

实现增删改查之前,为了阅读方便,我们需要新建一个容纳这些功能的类,并且创建两个类变量,方便在各个方法中调用。这里我们将类命名为ConnectionDb,创建Connection对象conn。

  1. public class ConnectDb {
  2. public Connection conn;
  3. }

接下来创建四个方法:查询、增加、修改、删除。

  1. public class ConnectDb {
  2. private Connection conn;
  3. public void SelectAll(){}//查询表
  4. public void AddValue(){}//添加数据
  5. public void DeleteValue(){}//修改数据
  6. public void ModifyValue(){}//删除数据
  7. }

下面就是实现方法的代码: 

1. 查询数据

  1. public void SelectAll(String tableName,String where) {
  2. ResultSetMetaData rsmd = null;
  3. try {//try catch判断是否有异常
  4. Statement sqlStatement = conn.createStatement();//创建sql语句
  5. String sql = "select * from " + tableName+" "+where;
  6. ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
  7. //下面根据该table输出属性组和所有元组
  8. rsmd = rs.getMetaData();//获取属性名
  9. String []arr = new String[0];
  10. if(rsmd != null) {
  11. int count = rsmd.getColumnCount();//统计属性个数
  12. arr = new String[count];
  13. for (int i = 1; i <= count; i++) {
  14. arr[i-1] = rsmd.getColumnName(i);//把属性名输入arr
  15. System.out.print(rsmd.getColumnName(i)+" ");//输出属性名
  16. }
  17. }
  18. System.out.println();//换一行,保证格式正确
  19. while (rs.next()) {
  20. //判断是否存在下一行,如果存在,就使用foreach循环输出元组
  21. for (String s : arr) {
  22. System.out.print(rs.getString(s) + " ");
  23. }
  24. System.out.println();//控制格式
  25. }
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }

2. 添加数据

  1. public void AddValue(String tableName){
  2. ResultSetMetaData rsmd = null;
  3. Scanner in = new Scanner(System.in);
  4. StringBuilder s1 = new StringBuilder();//创建字符串对象
  5. try {
  6. Statement sqlStatement = conn.createStatement();//创建语句对象
  7. String sql = "select * from " + tableName;
  8. ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
  9. //下面根据该table输出属性组
  10. rsmd = rs.getMetaData();//获取属性名
  11. System.out.print("Input values according to :");
  12. if (rsmd != null) {
  13. int count = rsmd.getColumnCount();//统计属性个数
  14. for (int i = 1; i <= count; i++) {
  15. if(i<count){
  16. //输出属性名
  17. System.out.print(rsmd.getColumnName(i) + "["+rsmd.getColumnTypeName(i)+"("+rsmd.getColumnDisplaySize(i)+")],");
  18. }else System.out.print(rsmd.getColumnName(i) + "["+rsmd.getColumnTypeName(i)+"("+rsmd.getColumnDisplaySize(i)+")]");
  19. }
  20. }
  21. System.out.println();
  22. //输入需要添加的值用英文逗号分隔
  23. String values =in.next();
  24. String[] arr = values.split(",");
  25. for(int i = 0; i<arr.length; i++){
  26. //把每个分量按SQL格式依次输入到对象s1中
  27. if(i<arr.length-1)
  28. {
  29. s1.append("'").append(arr[i]).append("',");
  30. }else s1.append("'").append(arr[i]).append("'");
  31. }
  32. String insertSql = "insert into " + tableName + " values("+s1+")";//SQL语句
  33. sqlStatement.executeUpdate(insertSql);
  34. System.out.println("Execute Successful !");
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. System.out.println("Execute failed !");
  38. }
  39. }

3. 修改数据

  1. public void ModifyValue(String tableName){
  2. ResultSetMetaData rsmd = null;
  3. Scanner in = new Scanner(System.in);
  4. try {
  5. Statement sqlStatement = conn.createStatement();//创建sql语句
  6. String sql = "select * from " + tableName;
  7. ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
  8. //下面根据该table输出属性组
  9. rsmd = rs.getMetaData();//获取属性名
  10. Map map = new HashMap();
  11. System.out.print("Filter column. ");
  12. if (rsmd != null) {
  13. int count = rsmd.getColumnCount();//统计属性个数
  14. for (int i = 1; i <= count; i++) {
  15. map.put(i,rsmd.getColumnName(i));
  16. System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");//输出属性名
  17. }
  18. }
  19. System.out.print("\nInput the number: ");//筛选属性
  20. Object num = in.nextInt();
  21. System.out.print("Filter value: ");//筛选元组
  22. String value = in.next();
  23. SelectAll(tableName,"where "+map.get(num)+"='"+value+"'");//调用查询方法,查询筛选数据
  24. System.out.println("Are these values that need to be modified? [Y/N]");
  25. String YesOrNo = in.next();
  26. if(YesOrNo.charAt(0) == 'Y')
  27. {
  28. System.out.println("Which column should be modified?");
  29. if (rsmd != null) {//输出属性名
  30. int count = rsmd.getColumnCount();
  31. for (int i = 1; i <= count; i++) {
  32. System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");
  33. }
  34. }
  35. System.out.print("\nInput the number: ");//输入需要修改的属性
  36. int num2 = in.nextInt();
  37. System.out.println("What value is modified to?");//修改成什么值
  38. String value2 = in.next();
  39. String modifySql = "update "+tableName+" set "+map.get(num2)+"='"+value2+"'"+" where "+map.get(num)+"="+"'"+value+"'";
  40. sqlStatement.executeUpdate(modifySql);
  41. System.out.println("Execute Successful !");
  42. } else if (YesOrNo.charAt(0) == 'N') {
  43. ModifyValue(tableName);//如果不修改以上内容,重新选择需要修改的元组
  44. } else System.out.println("Input error! System exit.");//除Y和N以外的键自动退出
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. System.out.println("Execute failed !");
  48. }
  49. }

4. 删除数据

  1. public void DeleteValue(String tableName){
  2. //选择列名,询问是否删除以下数据,选择Y删除。
  3. ResultSetMetaData rsmd = null;
  4. Scanner in = new Scanner(System.in);
  5. try {
  6. Statement sqlStatement = conn.createStatement();//创建sql语句
  7. String sql = "select * from " + tableName;
  8. ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
  9. //下面根据该table输出属性组
  10. rsmd = rs.getMetaData();//获取属性名
  11. Map map = new HashMap();
  12. System.out.print("Filter column. ");//筛选属性
  13. if (rsmd != null) {//输出属性名
  14. int count = rsmd.getColumnCount();
  15. for (int i = 1; i <= count; i++) {
  16. map.put(i,rsmd.getColumnName(i));
  17. System.out.print("["+i+": "+rsmd.getColumnName(i)+"]");
  18. }
  19. }
  20. System.out.print("\nInput the number: ");
  21. Object num = in.nextInt();
  22. System.out.println("Filter value: ");//筛选元组
  23. String value = in.next();
  24. System.out.println("These values will be deleted.");
  25. SelectAll(tableName,"where "+map.get(num)+"='"+value+"'");//调用查询方法,查询需要删除的元组
  26. System.out.println("[Y/N]?");
  27. String YesOrNo = in.next();
  28. if(YesOrNo.charAt(0) == 'Y')
  29. {
  30. String deleteSql = "delete from "+tableName+" where "+map.get(num)+"='"+value+"'";
  31. sqlStatement.executeUpdate(deleteSql);//执行删除语句
  32. System.out.println("Execute Successful !");
  33. } else if (YesOrNo.charAt(0) == 'N') {
  34. DeleteValue(tableName);//如果不删除,重新选择需要删除的元组
  35. } else System.out.println("Input error! System exit.");//除Y和N以外的键自动退出
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. System.out.println("Execute failed !");
  39. }
  40. }

5. 拓展

数据库增删改功能定义好后我们可以进一步整合,首先在main方法中调用并测试。

  1. connectDb.SelectAll("表名","where条件句");//where条件句为空则查询所有元组
  2. connectDb.AddValue("表名");//增加元组
  3. connectDb.DeleteValue("表名");//删除元组
  4. connectDb.ModifyValue("表名");//修改元组

我们可以发现,在操作表时,我们必须在方法中输入实参:表名,如果操作不同的表就需要再次修改实参,下面我们定义一个可以自行选择数据库表名的方法。

第一步,在class ConnectDb中声明一个tableName全局变量。

  1. public class ConnectDb {
  2. public String tableName;
  3. ...
  4. }

第二步,创建TableList方法,输出数据库内所有表,并要求选择一个表,将表名赋给tableName,代码如下。

  1. public void TableList(){
  2. Scanner in = new Scanner(System.in);
  3. Map map = new HashMap();
  4. int i = 0;
  5. try {
  6. DatabaseMetaData metaData = conn.getMetaData();
  7. ResultSet mrs = metaData.getTables(null, null, null, new String[]{"TABLE"});
  8. while (mrs.next()) {
  9. i++;
  10. map.put(i, mrs.getString(3));
  11. System.out.println("[" + i + ": " + mrs.getString(3) + "]");
  12. }
  13. System.out.print("Input the number: ");
  14. int num = in.nextInt();
  15. this.tableName = (String) map.get(num);
  16. }catch (Exception e){
  17. e.printStackTrace();
  18. }
  19. }

 第三步,补充main方法。

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. ConnectDb connectDb = new ConnectDb("数据库名","用户名","密码");
  5. System.out.println("Please choose a table.");
  6. connectDb.TableList();
  7. String n;
  8. do {//Y/N判断是否继续操作数据表
  9. System.out.println("Please choose an operation.\n[1: Select all rows],[2: Add values],[3: Delete values],[4: Modify values]");
  10. Scanner in = new Scanner(System.in);
  11. System.out.print("Input the number: ");
  12. int i = in.nextInt();
  13. switch (i) {
  14. case 1:
  15. connectDb.SelectAll(connectDb.tableName,"");//查询所有元组
  16. break;
  17. case 2:
  18. connectDb.AddValue(connectDb.tableName);//增加元组
  19. break;
  20. case 3:
  21. connectDb.DeleteValue(connectDb.tableName);//删除元组
  22. break;
  23. case 4:
  24. connectDb.ModifyValue(connectDb.tableName);//修改元组
  25. }
  26. System.out.println("Do you wanna continue to operate? [Y/N]");
  27. n = in.next();
  28. }while((n.charAt(0) == 'Y') && (n.charAt(0) != 'N'));
  29. }
  30. }

结果展示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/600482
推荐阅读
相关标签
  

闽ICP备14008679号