Java連接SQLServer2008的方法(含jdk7和jdk8的兩種方式)

工具
如果是 jdk7 和 jdk7 以前的版本热押,用 jdbc.jar
如果是 JDK8,用 jdbc4.jar 下載地址 https://pan.baidu.com/s/1kWZzzCz
把jdbc4.jar 復(fù)制到j(luò)ava 目錄 D:\Program Files\Java\jdk1.8.0_301\jre\lib\ext\jdbc4.jar
然后啟動(dòng)應(yīng)用類測(cè)試

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()){  //循環(huán)遍歷查詢結(jié)果集

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

}

如果鏈接報(bào)錯(cuò)盖文,om.microsoft.sqlserver.jdbc.SQLServerException: 驅(qū)動(dòng)程序無法通過使用安全套接字層(SSL)加密與 SQL Server 建立安全連接。錯(cuò)誤:“The server selected protocol version TLS10 is not accepted by client preferences [TLS12]”。

需要改下面這個(gè)文件幾個(gè)禁用字符去掉
D:\Program Files\Java\jdk1.8.0_301\jre\lib\security\java.security


image.png

將TLSv1、TLSv1.1蹲诀、3DES_EDE_CBC從禁止名單中剔除:
然后啟動(dòng)就可以了

修改jre中的這個(gè)文件:

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

全局搜文件

find / -name "java.security"

jdk.tls.legacyAlgorithms 直接改成下面的這個(gè):

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

如果還報(bào)錯(cuò),有可能是有多個(gè)java.security 文件
用rm 命令嘗試刪除多余的弃揽,只保留一個(gè)脯爪,就可用了。
我刪除這個(gè)好了

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. 加載數(shù)據(jù)庫驅(qū)動(dòng)
    Class.forName(驅(qū)動(dòng)全類名);

假如是JDK7和JDK7以前的版本矿微,驅(qū)動(dòng)全類名=sun.jdbc.odbc.JdbcOdbcDriver
如果是JDK8披粟,驅(qū)動(dòng)全類名= com.microsoft.sqlserver.jdbc.SQLServerDriver
比如 jdk8(常用):

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

注意:如果這里寫錯(cuò)會(huì)報(bào)DriverClassNotFound之類的異常

2.獲取數(shù)據(jù)庫連接

DriverManager.getConnection(url, user, password);
url :
jdk 7 的url寫法 :jdbc : odbc : 數(shù)據(jù)庫名稱 ,但是要配置數(shù)據(jù)源(查看配置數(shù)據(jù)源方法)
jdbc:odbc:MyDB

jdk 8的url寫法:協(xié)議 : 子協(xié)議: // 主機(jī)名 : 數(shù)據(jù)庫端口號(hào) ; databaseName=數(shù)據(jù)庫名稱
協(xié)議:總是以jdbc開頭(Java和數(shù)據(jù)庫開發(fā)方雙方約定好的規(guī)范)
子協(xié)議:數(shù)據(jù)庫開發(fā)方(誰來實(shí)現(xiàn)Java的接口)
主機(jī)名:本機(jī)即localhost冷冗,假如連接其它計(jì)算機(jī)中數(shù)據(jù)庫需要對(duì)方IP地址
數(shù)據(jù)庫端口號(hào):SQLServer默認(rèn)占用計(jì)算機(jī)的端口號(hào)為1433,可以更改惑艇。實(shí)際開發(fā)中最好更改蒿辙,因?yàn)楸娝苤臇|西容易被利用和攻擊。練習(xí)不用改滨巴。

jdbc:sqlserver://localhost:1433;databaseName=MyDB
user : 數(shù)據(jù)庫登錄名(默認(rèn)sa)
password : 數(shù)據(jù)庫登錄密碼

3.創(chuàng)建Statement會(huì)話
方法一:

Statement stmt = conn.createStatement();

方法二:

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

4.執(zhí)行sql語句(以查詢操作為例)
對(duì)應(yīng)3中方法一:

ResultSet rs = stmt.executeQuery(sql);

對(duì)應(yīng)3中方法二:

ResultSet rs = ps.executeQuery();
  1. 從結(jié)果集中取得記錄并在控制臺(tái)打印
  1. . 由于ResultSet 中的 rs.next() 默認(rèn)指向數(shù)據(jù)庫表中第一條記錄的前面(可以理解為指向了表頭)思灌,因此rs.next()剛好是表中第一條記錄。
  2. . rs.getXXX() 是獲取表中字段恭取,XXX對(duì)應(yīng)數(shù)據(jù)庫中的字段類型(varchar對(duì)應(yīng)Java中的String, decimal對(duì)應(yīng)Java中的double等)泰偿。
  3. . rs.getXXX() 中的參數(shù)可以是數(shù)據(jù)庫中的列名(用字符串表示),也可以是列名的索引蜈垮。但是一般使用前者耗跛,因?yàn)槟軌蚋又庇^地使人理解Java代碼語義而不用到數(shù)據(jù)庫查看表中字段裕照。
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);

                }

關(guān)閉資源
像Connection conn 调塌、Statement 晋南、PreparedStatement、ResultSet 等這些跟連接的使用完都應(yīng)該關(guān)閉羔砾,以免浪費(fèi)計(jì)算機(jī)內(nèi)存資源導(dǎo)致垃圾過多或者內(nèi)存溢出等负间。
應(yīng)當(dāng)?shù)剐蜿P(guān)閉(后賦值的先關(guān)閉)。
關(guān)閉順序

  1. 關(guān)閉記錄集
rs.close();
  1. 關(guān)閉聲明
ps.close();//Statement 姜凄、PreparedStatement用哪個(gè)就關(guān)閉哪個(gè)
  1. 關(guān)閉連接對(duì)象
conn.close();

完整代碼(只包含數(shù)據(jù)庫連接政溃,不包含增刪改查操作)

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.加載數(shù)據(jù)庫驅(qū)動(dòng)
        try {
            // 參數(shù)填寫驅(qū)動(dòng)的全類名(即包名+類名)
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驅(qū)動(dòng)類");
        }

        // 2.獲取數(shù)據(jù)庫連接
        // 2.1) 連接的數(shù)據(jù)庫的路徑
        String url  = "jdbc:sqlserver://localhost:1433;databaseName=MyDB";
        // 2.2) 登錄數(shù)據(jù)庫的用戶名
        String user = "sa";
        // 2.2) 登錄數(shù)據(jù)庫的密碼
        String password = "sa";
        try {
            // 2.3) 獲取連接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("數(shù)據(jù)庫連接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("數(shù)據(jù)庫連接失斕怼董虱!");
        }

        // 關(guān)閉資源
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }       
    }
}

優(yōu)化
1.在操作數(shù)據(jù)庫時(shí),常常需要獲取數(shù)據(jù)庫的連接屿聋,但是每個(gè)地方都寫一遍上述代碼會(huì)造成代碼冗余空扎,因此我們可以將它封裝到一個(gè)工具類中,需要的時(shí)候直接調(diào)用即可润讥。優(yōu)化代碼如下:

package Utils;

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


public class DBUtil {
    private static Connection conn = null;

    // 加載數(shù)據(jù)庫驅(qū)動(dòng),為提高效率應(yīng)當(dāng)寫在static中隨著類的加載而加載
    static {        
        try {
            // 參數(shù)填寫驅(qū)動(dòng)的全類名(即包名+類名)——告訴數(shù)據(jù)庫转锈,你的驅(qū)動(dòng)在哪
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("找不到驅(qū)動(dòng)類");
        }
    }

    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("數(shù)據(jù)庫連接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("數(shù)據(jù)庫連接失敵睢撮慨!");
        }
        return conn;
    }


}

但是只獲取連接是不夠的,我們經(jīng)常需要關(guān)閉連接脆粥,因此可以將其代碼提取封裝成方法砌溺,代碼如下:

 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("關(guān)閉ResultSet失敗");  
            }  
        }  
        if(ps!=null){  
            try{  
                ps.close();  
                ps=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                System.out.println("關(guān)閉PreparedStatement失敗");  
            }  
        }  
        if(conn!=null){  
            try{  
                conn.close();  
                conn=null;  
            }catch(SQLException e){  
                e.printStackTrace();  
                System.out.println("關(guān)閉Connection失敗");  
            }  
        }  
    }  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市变隔,隨后出現(xiàn)的幾起案子规伐,更是在濱河造成了極大的恐慌,老刑警劉巖匣缘,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猖闪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肌厨,警方通過查閱死者的電腦和手機(jī)培慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柑爸,“玉大人吵护,你說我怎么就攤上這事。” “怎么了馅而?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵祥诽,是天一觀的道長。 經(jīng)常有香客問我用爪,道長原押,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任偎血,我火速辦了婚禮诸衔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颇玷。我一直安慰自己笨农,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布帖渠。 她就那樣靜靜地躺著谒亦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪空郊。 梳的紋絲不亂的頭發(fā)上份招,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音狞甚,去河邊找鬼锁摔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哼审,可吹牛的內(nèi)容都是我干的谐腰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涩盾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼十气!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起春霍,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤砸西,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后址儒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體籍胯,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年离福,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼蛤。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妖爷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情絮识,我是刑警寧澤绿聘,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站次舌,受9級(jí)特大地震影響熄攘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彼念,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一挪圾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逐沙,春花似錦哲思、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徘郭,卻和暖如春靠益,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背残揉。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工胧后, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冲甘。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓绩卤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親江醇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子濒憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 原文出自 https://blog.csdn.net/fjseryi/article/details/497965...
    _FireFly_閱讀 4,311評(píng)論 1 1
  • JDBC (JavaDB Connection)---Java數(shù)據(jù)庫連接 JDK1.8增加了很多新特性,但不再包含...
    Mr_chong閱讀 2,352評(píng)論 0 4
  • 前言 在許許多多的B/S架構(gòu)系統(tǒng)中都涉及到了數(shù)據(jù)庫的鏈接陶夜,那么對(duì)于數(shù)據(jù)庫連接的方式有哪些?可能出現(xiàn)的問題是什么凛驮? ...
    池寒閱讀 718評(píng)論 0 1
  • MySql連接MySql驅(qū)動(dòng)包加載數(shù)據(jù)庫操作的一般過程連接MySql創(chuàng)建Statement對(duì)象執(zhí)行SQL語句處理R...
    小石頭呢閱讀 1,137評(píng)論 0 8
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)条辟,但是人生放棄了冒險(xiǎn)黔夭,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,052評(píng)論 0 4