赞
踩
目录
JDBC的全称是Java数据库连接(Java DataBase Connectivity) ,应用程序通过JDBC连接到数据库,使用SQL语句对数据库中的表进行查询、增加、修改、删除等操作。此文章提供JDBC连接SQL Server的所有步骤,帮助大家实现Java对数据库的增删改查!
JDBC访问数据库的方式
我们右键点击“开始”菜单打开“计算机管理”,接下来以此打开树形菜单,启用所有协议。
下一步,打开控制面版—>程序—>程序与功能—>启用或关闭Windows功能 —>勾选 Telnet客户端
接下来,重启计算机,在此之前请务必点击“收藏”或“关注”,以免找不到下一步教程。
重启后,按Win+R,输入cmd后按回车,输入命令:
telnet localhost 1433
进入只有光标闪烁的空白页面即通信成功。
下面讲解的方法都是基于 IntelliJ IDEA 软件,如果是 Eclipse 会有细微差别。
首先,在连接JDBC之前,需要下载MS JDBC Driver包,下载地址:下载 Microsoft SQL Server JDBC 驱动程序https://learn.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server
那么如何选择正确的JDBC呢?
请参照以下对应规则下载相应的JDBC驱动版本。
- 从 Microsoft JDBC Driver 12.2 for SQL Server 开始,支持 Java 开发工具包 (JDK) 19.0 和 Java Runtime Environment (JRE) 19.0。
-
- 从 Microsoft JDBC Driver 11.2 for SQL Server 开始,支持 Java 开发工具包 (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 规范 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 规范 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
例如下表就准确指定了相应的版本:
JAR | JDBC 版本法规遵从性 | 推荐的 Java 版本 | 说明 |
---|---|---|---|
mssql-jdbc-12.4.0.jre8.jar | 4.2 | 8 | 需要 Java Runtime Environment (JRE) 1.8。 使用 JRE 1.7 或更低版本会引发异常。 |
mssql-jdbc-12.4.0.jre11.jar | 4.3 | 20 | 需要 Java Runtime Environment (JRE) 11.0 或更高版本。 使用 JRE 10.0 或更低版本会引发异常。 |
下载完后解压缩并打开,可以在目录中找到后缀名为.jar的文件,即需要导入到项目工程的包。
在添加两个包含.jar的环境变量,例如:
- 变量名: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
打开环境变量的方式。Win7:桌面或开始菜单找到“计算机”->右键单击选择"属性"->高级系统设置->环境变量,Win10:设置->系统->关于->高级系统设置->环境变量,Win11:设置->系统->系统信息->高级系统设置->环境变量。
然后我们进入IDEA,点击File—>Priject Structure—>Libraries—> + —>Java —>Select Library Files,选择sqljdbc.jar
如果能在首页看到External Libraries下面有sqljdbc42即表示导入成功。
JDBC的实现步骤
通过上图我们了解到,想要实现JDBC首先就需要加载并注册数据库驱动。第一步,加载并注册驱动可以通过java.lang.Class类的静态方法forName实现。
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
第二步,通过DriverManager类的getConnection方法实现数据库连接。
- String databaseName = "数据库名";
- 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 !");
- }
实现增删改查之前,为了阅读方便,我们需要新建一个容纳这些功能的类,并且创建两个类变量,方便在各个方法中调用。这里我们将类命名为ConnectionDb,创建Connection对象conn。
- public class ConnectDb {
- public Connection conn;
- }
接下来创建四个方法:查询、增加、修改、删除。
- public class ConnectDb {
- private Connection conn;
- public void SelectAll(){}//查询表
- public void AddValue(){}//添加数据
- public void DeleteValue(){}//修改数据
- public void ModifyValue(){}//删除数据
- }
下面就是实现方法的代码:
- public void SelectAll(String tableName,String where) {
- ResultSetMetaData rsmd = null;
- try {//try catch判断是否有异常
- Statement sqlStatement = conn.createStatement();//创建sql语句
- String sql = "select * from " + tableName+" "+where;
- ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
- //下面根据该table输出属性组和所有元组
- rsmd = rs.getMetaData();//获取属性名
- String []arr = new String[0];
- if(rsmd != null) {
- int count = rsmd.getColumnCount();//统计属性个数
- 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循环输出元组
- for (String s : arr) {
- System.out.print(rs.getString(s) + " ");
- }
- System.out.println();//控制格式
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void AddValue(String tableName){
- ResultSetMetaData rsmd = null;
- Scanner in = new Scanner(System.in);
- StringBuilder s1 = new StringBuilder();//创建字符串对象
-
- try {
- Statement sqlStatement = conn.createStatement();//创建语句对象
- String sql = "select * from " + tableName;
- ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
- //下面根据该table输出属性组
- rsmd = rs.getMetaData();//获取属性名
- System.out.print("Input values according to :");
- if (rsmd != null) {
- int count = rsmd.getColumnCount();//统计属性个数
- 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 !");
- }
- }
- public void ModifyValue(String tableName){
- ResultSetMetaData rsmd = null;
- Scanner in = new Scanner(System.in);
- try {
- Statement sqlStatement = conn.createStatement();//创建sql语句
- String sql = "select * from " + tableName;
- ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
- //下面根据该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.print("Filter value: ");//筛选元组
- String value = in.next();
- SelectAll(tableName,"where "+map.get(num)+"='"+value+"'");//调用查询方法,查询筛选数据
- 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);//如果不修改以上内容,重新选择需要修改的元组
- } else System.out.println("Input error! System exit.");//除Y和N以外的键自动退出
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("Execute failed !");
- }
- }
- public void DeleteValue(String tableName){
- //选择列名,询问是否删除以下数据,选择Y删除。
- ResultSetMetaData rsmd = null;
- Scanner in = new Scanner(System.in);
- try {
- Statement sqlStatement = conn.createStatement();//创建sql语句
- String sql = "select * from " + tableName;
- ResultSet rs = sqlStatement.executeQuery(sql);//执行sql语句
- //下面根据该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+"'");//调用查询方法,查询需要删除的元组
- 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);//执行删除语句
- 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 !");
- }
- }
数据库增删改功能定义好后我们可以进一步整合,首先在main方法中调用并测试。
- connectDb.SelectAll("表名","where条件句");//where条件句为空则查询所有元组
- connectDb.AddValue("表名");//增加元组
- connectDb.DeleteValue("表名");//删除元组
- connectDb.ModifyValue("表名");//修改元组
我们可以发现,在操作表时,我们必须在方法中输入实参:表名,如果操作不同的表就需要再次修改实参,下面我们定义一个可以自行选择数据库表名的方法。
第一步,在class ConnectDb中声明一个tableName全局变量。
- public class ConnectDb {
- public String tableName;
- ...
- }
第二步,创建TableList方法,输出数据库内所有表,并要求选择一个表,将表名赋给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("数据库名","用户名","密码");
- System.out.println("Please choose a table.");
- connectDb.TableList();
- String n;
- do {//Y/N判断是否继续操作数据表
- 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'));
- }
- }
结果展示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。