一当叭、JDBC相關(guān)概念介紹
1.1、數(shù)據(jù)庫驅(qū)動(dòng)
這里的驅(qū)動(dòng)的概念和平時(shí)聽到的那種驅(qū)動(dòng)的概念是一樣的,比如平時(shí)購買的聲卡今妄,網(wǎng)卡直接插到計(jì)算機(jī)上面是不能用的,必須要安裝相應(yīng)的驅(qū)動(dòng)程序之后才能夠使用聲卡和網(wǎng)卡,同樣道理盾鳞,我們安裝好數(shù)據(jù)庫之后犬性,我們的應(yīng)用程序也是不能直接使用數(shù)據(jù)庫的,必須要通過相應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng)程序腾仅,通過驅(qū)動(dòng)程序去和數(shù)據(jù)庫打交道乒裆,如下所示:
1.2、JDBC介紹
SUN公司為了簡(jiǎn)化推励、統(tǒng)一對(duì)數(shù)據(jù)庫的操作鹤耍,定義了一套Java操作數(shù)據(jù)庫的規(guī)范(接口),稱之為JDBC验辞。這套接口由數(shù)據(jù)庫廠商去實(shí)現(xiàn)稿黄,這樣,開發(fā)人員只需要學(xué)習(xí)jdbc接口跌造,并通過jdbc加載具體的驅(qū)動(dòng)杆怕,就可以操作數(shù)據(jù)庫。
如下圖所示:
JDBC全稱為:Java Data Base Connectivity(java數(shù)據(jù)庫連接)壳贪,它主要由接口組成陵珍。
組成JDBC的2個(gè)包:
java.sql
javax.sql
開發(fā)JDBC應(yīng)用需要以上2個(gè)包的支持外,還需要導(dǎo)入相應(yīng)JDBC的數(shù)據(jù)庫實(shí)現(xiàn)(即數(shù)據(jù)庫驅(qū)動(dòng))违施。
二撑教、編寫JDBC程序
2.1、搭建實(shí)驗(yàn)環(huán)境
1醉拓、在mysql中創(chuàng)建一個(gè)庫,并創(chuàng)建user表和插入表的數(shù)據(jù)收苏。
SQL腳本如下:
create database jdbcStudy character set utf8 collate utf8_general_ci;
use jdbcStudy;
create table users(
id int primary key,
name varchar(40),
password varchar(40),
email varchar(60),
birthday date
);
insert into users(id,name,password,email,birthday) values(1,'zhansan','123456','zs@sina.com','1980-12-04');
insert into users(id,name,password,email,birthday) values(2,'lisi','123456','lisi@sina.com','1981-12-04');
insert into users(id,name,password,email,birthday) values(3,'wangwu','123456','wangwu@sina.com','1979-12-04');
2亿卤、新建一個(gè)Java工程,并導(dǎo)入數(shù)據(jù)驅(qū)動(dòng)鹿霸。
3排吴、編寫程序從user表中讀取數(shù)據(jù),并打印在命令行窗口中懦鼠。
具體代碼如下:
package me.gacl.demo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JdbcFirstDemo {
public static void main(String[] args) throws Exception {
//要連接的數(shù)據(jù)庫URL
String url = "jdbc:mysql://localhost:3306/jdbcStudy";
//連接的數(shù)據(jù)庫時(shí)使用的用戶名
String username = "root";
//連接的數(shù)據(jù)庫時(shí)使用的密碼
String password = "XDP";
//1.加載驅(qū)動(dòng)
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());不推薦使用這種方式來加載驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");//推薦使用這種方式來加載驅(qū)動(dòng)
//2.獲取與數(shù)據(jù)庫的鏈接
Connection conn = DriverManager.getConnection(url, username, password);
//3.獲取用于向數(shù)據(jù)庫發(fā)送sql語句的statement
Statement st = conn.createStatement();
String sql = "select id,name,password,email,birthday from users";
//4.向數(shù)據(jù)庫發(fā)sql,并獲取代表結(jié)果集的resultset
ResultSet rs = st.executeQuery(sql);
//5.取出結(jié)果集的數(shù)據(jù)
while(rs.next()){
System.out.println("id=" + rs.getObject("id"));
System.out.println("name=" + rs.getObject("name"));
System.out.println("password=" + rs.getObject("password"));
System.out.println("email=" + rs.getObject("email"));
System.out.println("birthday=" + rs.getObject("birthday"));
}
//6.關(guān)閉鏈接钻哩,釋放資源
rs.close();
st.close();
conn.close();
}
}
運(yùn)行結(jié)果如下:
2.2、DriverManager類講解
Jdbc程序中的DriverManager用于加載驅(qū)動(dòng)肛冶,并創(chuàng)建與數(shù)據(jù)庫的鏈接街氢,這個(gè)API的常用方法:
- DriverManager.registerDriver(new Driver())
- DriverManager.getConnection(url, user, password),
注意:在實(shí)際開發(fā)中并不推薦采用registerDriver方法注冊(cè)驅(qū)動(dòng)睦袖。原因有二:
1珊肃、查看Driver的源代碼可以看到,如果采用此種方式,會(huì)導(dǎo)致驅(qū)動(dòng)程序注冊(cè)兩次伦乔,也就是在內(nèi)存中會(huì)有兩個(gè)Driver對(duì)象厉亏。
2、程序依賴mysql的api烈和,脫離mysql的jar包爱只,程序?qū)o法編譯,將來程序切換底層數(shù)據(jù)庫將會(huì)非常麻煩招刹。
推薦方式:Class.forName("com.mysql.jdbc.Driver");
采用此種方式不會(huì)導(dǎo)致驅(qū)動(dòng)對(duì)象在內(nèi)存中重復(fù)出現(xiàn)恬试,并且采用此種方式,程序僅僅只需要一個(gè)字符串蔗喂,不需要依賴具體的驅(qū)動(dòng)忘渔,使程序的靈活性更高。
2.3缰儿、數(shù)據(jù)庫URL講解
URL用于標(biāo)識(shí)數(shù)據(jù)庫的位置畦粮,通過URL地址告訴JDBC程序連接哪個(gè)數(shù)據(jù)庫,URL的寫法為:
常用數(shù)據(jù)庫URL地址的寫法:
- Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid
- SqlServer寫法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
- MySql寫法:jdbc:mysql://localhost:3306/sid
如果連接的是本地的Mysql數(shù)據(jù)庫乖阵,并且連接使用的端口是3306宣赔,那么的url地址可以簡(jiǎn)寫為: jdbc:mysql:///數(shù)據(jù)庫
2.4、Connection類講解
Jdbc程序中的Connection瞪浸,它用于代表數(shù)據(jù)庫的鏈接儒将,Collection是數(shù)據(jù)庫編程中最重要的一個(gè)對(duì)象,客戶端與數(shù)據(jù)庫所有交互都是通過connection對(duì)象完成的对蒲,這個(gè)對(duì)象的常用方法:
- createStatement():創(chuàng)建向數(shù)據(jù)庫發(fā)送sql的statement對(duì)象钩蚊。
- prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫發(fā)送預(yù)編譯sql的PrepareSatement對(duì)象。
- prepareCall(sql):創(chuàng)建執(zhí)行存儲(chǔ)過程的callableStatement對(duì)象蹈矮。
- setAutoCommit(boolean autoCommit):設(shè)置事務(wù)是否自動(dòng)提交砰逻。
- commit() :在鏈接上提交事務(wù)。
- rollback() :在此鏈接上回滾事務(wù)泛鸟。
2.5蝠咆、Statement類講解
Jdbc程序中的Statement對(duì)象用于向數(shù)據(jù)庫發(fā)送SQL語句, Statement對(duì)象常用方法:
- executeQuery(String sql) :用于向數(shù)據(jù)發(fā)送查詢語句北滥。
- executeUpdate(String sql):用于向數(shù)據(jù)庫發(fā)送insert刚操、update或delete語句
- execute(String sql):用于向數(shù)據(jù)庫發(fā)送任意sql語句
- addBatch(String sql) :把多條sql語句放到一個(gè)批處理中。
- executeBatch():向數(shù)據(jù)庫發(fā)送一批sql語句執(zhí)行再芋。
2.6菊霜、ResultSet類講解
Jdbc程序中的ResultSet用于代表Sql語句的執(zhí)行結(jié)果。Resultset封裝執(zhí)行結(jié)果時(shí)济赎,采用的類似于表格的方式占卧。ResultSet 對(duì)象維護(hù)了一個(gè)指向表格數(shù)據(jù)行的游標(biāo)遗菠,初始的時(shí)候,游標(biāo)在第一行之前华蜒,調(diào)用ResultSet.next() 方法辙纬,可以使游標(biāo)指向具體的數(shù)據(jù)行,進(jìn)行調(diào)用方法獲取該行的數(shù)據(jù)叭喜。
ResultSet既然用于封裝執(zhí)行結(jié)果的贺拣,所以該對(duì)象提供的都是用于獲取數(shù)據(jù)的get方法:
獲取任意類型的數(shù)據(jù)
getObject(int index)
getObject(string columnName)
獲取指定類型的數(shù)據(jù),例如:
getString(int index)
getString(String columnName)
ResultSet還提供了對(duì)結(jié)果集進(jìn)行滾動(dòng)的方法:
- next():移動(dòng)到下一行
- Previous():移動(dòng)到前一行
- absolute(int row):移動(dòng)到指定行
- beforeFirst():移動(dòng)resultSet的最前面捂蕴。
- afterLast() :移動(dòng)到resultSet的最后面譬涡。
2.7、釋放資源
Jdbc程序運(yùn)行完后啥辨,切記要釋放程序在運(yùn)行過程中涡匀,創(chuàng)建的那些與數(shù)據(jù)庫進(jìn)行交互的對(duì)象,這些對(duì)象通常是ResultSet, Statement和Connection對(duì)象溉知,特別是Connection對(duì)象陨瘩,它是非常稀有的資源,用完后必須馬上釋放级乍,如果Connection不能及時(shí)舌劳、正確的關(guān)閉,極易導(dǎo)致系統(tǒng)宕機(jī)玫荣。Connection的使用原則是盡量晚創(chuàng)建甚淡,盡量早的釋放。
為確保資源釋放代碼能運(yùn)行捅厂,資源釋放代碼也一定要放在finally語句中贯卦。
三、總結(jié)
如果覺得本文對(duì)你有幫助的話焙贷,請(qǐng)你也不要吝嗇你的贊脸侥,你們的支持是對(duì)我最大的鼓勵(lì)。今天的Java知識(shí)分享就到這里盈厘!想要知道更多Java基礎(chǔ)知識(shí)和面試資料的我這邊整理了一個(gè)我自己的GitHub倉庫:Java小白修煉手冊(cè),大家如果有需要可以自行查看