工具
如果是 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
將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
下面一些使用方法可以參考
步驟
- 加載數(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();
- 從結(jié)果集中取得記錄并在控制臺(tái)打印
- . 由于ResultSet 中的 rs.next() 默認(rèn)指向數(shù)據(jù)庫表中第一條記錄的前面(可以理解為指向了表頭)思灌,因此rs.next()剛好是表中第一條記錄。
- . rs.getXXX() 是獲取表中字段恭取,XXX對(duì)應(yīng)數(shù)據(jù)庫中的字段類型(varchar對(duì)應(yīng)Java中的String, decimal對(duì)應(yīng)Java中的double等)泰偿。
- . 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)閉順序
- 關(guān)閉記錄集
rs.close();
- 關(guān)閉聲明
ps.close();//Statement 姜凄、PreparedStatement用哪個(gè)就關(guān)閉哪個(gè)
- 關(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失敗");
}
}
}