Java连接SQLServer2008的方法(含jdk7和jdk8的两种方式)

工具
如果是 jdk7 和 jdk7 以前的版本,用 jdbc.jar
如果是 JDK8,用 jdbc4.jar 下载地址 https://pan.baidu.com/s/1kWZzzCz
把jdbc4.jar 复制到java 目录 D:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jdbc4.jar
然后启动应用类测试

public class BeiyaoZtErpApplication {
    public static void main(String[] args)
    {

        SpringApplication.run(BeiyaoZtErpApplication.class, args);
        String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String dbURL="jdbc:sqlserver://192.168.2.222:1433;DatabaseName=bylsn";
        String userName="mg";
        String userPwd="mg";
        try
        {
            Class.forName(driverName);
            Connection dbConn= DriverManager.getConnection(dbURL,userName,userPwd);
            Statement stmt = dbConn.createStatement();
            String sql ="SELECT * FROM [dbo].[MG_ACCOUNT] WHERE name = '管宏喜'";
            ResultSet rs = stmt.executeQuery(sql);
            while(rs.next()){  //循环遍历查询结果集

                System.out.println(rs.getString("*"));
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            System.out.print("fail!");
        }
    }

}

如果链接报错,om.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS12]”。

需要改下面这个文件几个禁用字符去掉
D:\Program Files\Java\jdk1.8.0_301\jre\lib\security\java.security


image.png

将TLSv1、TLSv1.1、3DES_EDE_CBC从禁止名单中剔除:
然后启动就可以了

修改jre中的这个文件:

/java/jdk1.8/jre/lib/security/java.security

全局搜文件

find / -name "java.security"

jdk.tls.legacyAlgorithms 直接改成下面的这个:

jdk.tls.legacyAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, anon, NULL, \
include jdk.disabled.nameCurves

如果还报错,有可能是有多个java.security 文件
用rm 命令尝试删除多余的,只保留一个,就可用了。
我删除这个好了

rm /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64/jre/lib/security/java.security

配置文件配置如下

datasource:
      username: mg
      password: mg
      url: jdbc:sqlserver://192.168.2.222:1433;DatabaseName=bylsn
      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver

下面一些使用方法可以参考

步骤

  1. 加载数据库驱动
    Class.forName(驱动全类名);

假如是JDK7和JDK7以前的版本,驱动全类名=sun.jdbc.odbc.JdbcOdbcDriver
如果是JDK8,驱动全类名= com.microsoft.sqlserver.jdbc.SQLServerDriver
比如 jdk8(常用):

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

注意:如果这里写错会报DriverClassNotFound之类的异常

2.获取数据库连接

DriverManager.getConnection(url, user, password);
url :
jdk 7 的url写法 :jdbc : odbc : 数据库名称 ,但是要配置数据源(查看配置数据源方法)
jdbc:odbc:MyDB

jdk 8的url写法:协议 : 子协议: // 主机名 : 数据库端口号 ; databaseName=数据库名称
协议:总是以jdbc开头(Java和数据库开发方双方约定好的规范)
子协议:数据库开发方(谁来实现Java的接口)
主机名:本机即localhost,假如连接其它计算机中数据库需要对方IP地址
数据库端口号:SQLServer默认占用计算机的端口号为1433,可以更改。实际开发中最好更改,因为众所周知的东西容易被利用和攻击。练习不用改。

jdbc:sqlserver://localhost:1433;databaseName=MyDB
user : 数据库登录名(默认sa)
password : 数据库登录密码

3.创建Statement会话
方法一:

Statement stmt = conn.createStatement();

方法二:

PreparedStatement ps = ps = conn.prepareStatement(sql);

4.执行sql语句(以查询操作为例)
对应3中方法一:

ResultSet rs = stmt.executeQuery(sql);

对应3中方法二:

ResultSet rs = ps.executeQuery();
  1. 从结果集中取得记录并在控制台打印
  1. . 由于ResultSet 中的 rs.next() 默认指向数据库表中第一条记录的前面(可以理解为指向了表头),因此rs.next()刚好是表中第一条记录。
  2. . rs.getXXX() 是获取表中字段,XXX对应数据库中的字段类型(varchar对应Java中的String, decimal对应Java中的double等)。
  3. . rs.getXXX() 中的参数可以是数据库中的列名(用字符串表示),也可以是列名的索引。但是一般使用前者,因为能够更加直观地使人理解Java代码语义而不用到数据库查看表中字段。
rs.getString("id");
rs.getString(1);//表中第一列字段是id,2就是获取name,以此类推

System.out.println("--------------------员工信息列表-------------------");
    System.out.println("\tID\t姓名\t工资\t性别");
    while(rs.next()) {
        id = rs.getInt("id");   
        name = rs.getString("name");
        salary = rs.getDouble("salary");
        gender = rs.getString("gender");
        System.out.println("\t"+id+"\t"+name+"\t"+salary+"\t"+gender);

                }

关闭资源
像Connection conn 、Statement 、PreparedStatement、ResultSet 等这些跟连接的使用完都应该关闭,以免浪费计算机内存资源导致垃圾过多或者内存溢出等。
应当倒序关闭(后赋值的先关闭)。
关闭顺序

  1. 关闭记录集
rs.close();
  1. 关闭声明
ps.close();//Statement 、PreparedStatement用哪个就关闭哪个
  1. 关闭连接对象
conn.close();

完整代码(只包含数据库连接,不包含增删改查操作)

package Utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionDemo {
    public static void main(String[] args) {

        Connection conn = null;
        // 1.加载数据库驱动
        try {
            // 参数填写驱动的全类名(即包名+类名)
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动类");
        }

        // 2.获取数据库连接
        // 2.1) 连接的数据库的路径
        String url  = "jdbc:sqlserver://localhost:1433;databaseName=MyDB";
        // 2.2) 登录数据库的用户名
        String user = "sa";
        // 2.2) 登录数据库的密码
        String password = "sa";
        try {
            // 2.3) 获取连接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接失败!");
        }

        // 关闭资源
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }       
    }
}

优化
1.在操作数据库时,常常需要获取数据库的连接,但是每个地方都写一遍上述代码会造成代码冗余,因此我们可以将它封装到一个工具类中,需要的时候直接调用即可。优化代码如下:

package Utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class DBUtil {
    private static Connection conn = null;

    // 加载数据库驱动,为提高效率应当写在static中随着类的加载而加载
    static {        
        try {
            // 参数填写驱动的全类名(即包名+类名)——告诉数据库,你的驱动在哪
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驱动类");
        }
    }

    public static Connection getConnection() {
        String url  = "jdbc:sqlserver://localhost:1433;databaseName=MyDB";
        String user = "sa";
        String password = "sa";
        try {
            // 获取连接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库连接失败!");
        }
        return conn;
    }


}

但是只获取连接是不够的,我们经常需要关闭连接,因此可以将其代码提取封装成方法,代码如下:

 public void close(ResultSet rs, PreparedStatement ps, Connection conn) {  
        if(rs!=null){  
            try{  
                rs.close();  
                rs=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                System.out.println("关闭ResultSet失败");  
            }  
        }  
        if(ps!=null){  
            try{  
                ps.close();  
                ps=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                System.out.println("关闭PreparedStatement失败");  
            }  
        }  
        if(conn!=null){  
            try{  
                conn.close();  
                conn=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                System.out.println("关闭Connection失败");  
            }  
        }  
    }  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 原文出自 https://blog.csdn.net/fjseryi/article/details/497965...
    _FireFly_阅读 4,040评论 1 1
  • JDBC (JavaDB Connection)---Java数据库连接 JDK1.8增加了很多新特性,但不再包含...
    Mr_chong阅读 2,286评论 0 4
  • 前言 在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么? ...
    池寒阅读 693评论 0 1
  • MySql连接MySql驱动包加载数据库操作的一般过程连接MySql创建Statement对象执行SQL语句处理R...
    小石头呢阅读 1,124评论 0 8
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,018评论 0 4