1.獲取數(shù)據(jù)庫(kù)連接
(1)使用JDBC的準(zhǔn)備環(huán)境:
- 1):拷貝MySQL的JDBC驅(qū)動(dòng),到Java項(xiàng)目中:mysql-connector-java-5.1.26-bin.jar。(注意:是jar包,不是zip包.)
- 2):選擇jar,[buil path],把jar添加到classpath路徑.
(2)DBC操作第一步:獲取JDBC連接對(duì)象/Connection對(duì)象.
操作步驟(賈璉):
- 1):加載注冊(cè)驅(qū)動(dòng).
Class.forName("com.mysql.jdbc.Driver");
為什么說(shuō)上述代碼,在完成加載注冊(cè)驅(qū)動(dòng)?
上述代碼的作用:
1):把com.mysql.jdbc.Driver這一份字節(jié)碼加載進(jìn)JVM.
2):當(dāng)一份字節(jié)碼被加載進(jìn)JVM,就會(huì)執(zhí)行其靜態(tài)代碼塊挠阁。而其底層的靜態(tài)代碼塊在完成注冊(cè)驅(qū)動(dòng)工作.
- 2):獲取連接對(duì)象.
通過(guò)DriverManager的getConnection方法創(chuàng)建Connection對(duì)象.
Connection conn = DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/jdbcdemo
//如果連接的是本機(jī)的MySQL,并且端口是默認(rèn)的3306,則可以簡(jiǎn)寫:url=jdbc:mysql:///jdbcdemo
username=root
password=admin
可以通過(guò) show processlist命令來(lái)查看有幾個(gè)MySQL進(jìn)程.
(3)備注
從Java6開始:JDBC4.0: (了解)JDBC4.0有一個(gè)新特性-無(wú)需加載注冊(cè)驅(qū)動(dòng).
規(guī)范要求:從JDBC 4.0所有的驅(qū)動(dòng)都必須包括 META-INF/services/java.sql.Driver 文件宾肺。此文件包含 java.sql.Driver 的 JDBC 驅(qū)動(dòng)程序?qū)崿F(xiàn)的名稱。
程序會(huì)自動(dòng)從 META-INF/services/java.sql.Driver去讀取當(dāng)前的驅(qū)動(dòng)類的全限定名,此時(shí)程序員不再需要顯示的編寫 Class.forName("com.mysql.jdbc.Driver")代碼.在Web開發(fā)中,還是得使用手動(dòng)加載注冊(cè)驅(qū)動(dòng).
PS:有的時(shí)候侵俗,MySQL的驅(qū)動(dòng)類也也會(huì)看到使用org.gjt.mm.mysql.Driver的情況锨用,org.gjt.mm.mysql.Driver是早期的驅(qū)動(dòng)名稱,后來(lái)就改名為com.mysql.jdbc.Driver隘谣,現(xiàn)在一般都推薦使用 com.mysql.jdbc.Driver增拥。
在最新版本的mysql jdbc驅(qū)動(dòng)中,為了保持對(duì)老版本的兼容寻歧,仍然保留了org.gjt.mm.mysql.Driver掌栅,但是實(shí)際上 org.gjt.mm.mysql.Driver中調(diào)用了com.mysql.jdbc.Driver,因此現(xiàn)在這兩個(gè)驅(qū)動(dòng)沒(méi)有什么區(qū)別码泛。
2.JDBC常用的API
(1)操作JDBC的步驟口訣:
賈璉欲執(zhí)事:
1:加載注冊(cè)驅(qū)動(dòng).
2:獲取連接對(duì)象.
3:創(chuàng)建/獲取語(yǔ)句對(duì)象.
4:執(zhí)行SQL語(yǔ)句.
5:釋放資源.
(2)重要接口
-
Connection接口: 表示JDBC的連接對(duì)象.
常用方法:
Statement createStatement() //:創(chuàng)建一個(gè)靜態(tài)的語(yǔ)句對(duì)象.
PreparedStatement prepareStatement(String sql) //:創(chuàng)建一個(gè)預(yù)編譯語(yǔ)句對(duì)象. 此時(shí)參數(shù)sql:表示帶有占位符(?)的SQL語(yǔ)句的模板.
close()://釋放資源
-
Statement接口: 靜態(tài)SQL語(yǔ)句并返回它所生成結(jié)果.
常用方法:
int executeUpdate(String sql)://執(zhí)行DDL/DML語(yǔ)句.
//若當(dāng)前SQL是DDL語(yǔ)句,則返回0.
//若當(dāng)前SQL是DML語(yǔ)句,則返回受影響的行數(shù).
ResultSet executeQuery(String sql)//:執(zhí)行DQL語(yǔ)句,返回結(jié)果集.
close()//:釋放資源
- PreparedStatement接口:是Statemen接口的子接口-->享有Statement中的方法.表示預(yù)編譯的 SQL 語(yǔ)句的對(duì)象
常用方法:
void setXxx(int parameterIndex,Xxx value)//:設(shè)置第幾個(gè)占位符的真正參數(shù)值.
int executeUpdate()://執(zhí)行DDL/DML語(yǔ)句. 注意:沒(méi)有參數(shù)
若當(dāng)前SQL是DDL語(yǔ)句,則返回0.
若當(dāng)前SQL是DML語(yǔ)句,則返回受影響的行數(shù).
ResultSet executeQuery()//:執(zhí)行DQL語(yǔ)句,返回結(jié)果集.
//close():釋放資源
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等.
-
ResultSet接口:通過(guò)執(zhí)行DQL語(yǔ)句查詢之后的結(jié)果對(duì)象.封裝了查詢之后的所有數(shù)據(jù).
ResultSet 對(duì)象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)猾封。最初,光標(biāo)被置于第一行之前噪珊。next 方法將光標(biāo)移動(dòng)到下一行晌缘;因?yàn)樵摲椒ㄔ?ResultSet 對(duì)象沒(méi)有下一行時(shí)返回 false,所以可以在 while 循環(huán)中使用它來(lái)迭代結(jié)果集
常用方法:
boolean next()://判斷當(dāng)前光標(biāo)是否能向下移動(dòng),如果能向下移動(dòng)返回true,并同時(shí)將光標(biāo)移動(dòng)到下一行.
Xxx getXxx(int columnIndex)://取出當(dāng)前光標(biāo)所在行的第columnIndex列的數(shù)據(jù)(columnIndex從1開始算).
Xxx getXxx(String columnName)://取出當(dāng)前光標(biāo)所在行的列名為columnName列的數(shù)據(jù),columnName可以是別名.
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等. 推薦使用列名來(lái)取數(shù)據(jù).
close()://釋放資源
3.SQL語(yǔ)言的分類
SQL語(yǔ)言共分為四大類:數(shù)據(jù)查詢語(yǔ)言DQL痢站,數(shù)據(jù)操縱語(yǔ)言DML磷箕,數(shù)據(jù)定義語(yǔ)言DDL,數(shù)據(jù)控制語(yǔ)言DCL*阵难。
- 數(shù)據(jù)查詢語(yǔ)言DQL:數(shù)據(jù)查詢語(yǔ)言DQL基本結(jié)構(gòu)是由SELECT子句岳枷,F(xiàn)ROM子句,WHERE 子句組成的查詢塊: SELECT <字段名表> FROM <表或視圖名> WHERE <查詢條件>
- 數(shù)據(jù)操縱語(yǔ)言DML 數(shù)據(jù)操縱語(yǔ)言DML主要有三種形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 刪除:DELETE
-
數(shù)據(jù)定義語(yǔ)言DDL:數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表多望、視圖嫩舟、 索引、同義詞怀偷、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 視圖 索引 同義詞 簇
DDL操作是隱性提交的家厌!不能rollback
-
數(shù)據(jù)定義語(yǔ)言DDL:數(shù)據(jù)定義語(yǔ)言DDL用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的各種對(duì)象-----表多望、視圖嫩舟、 索引、同義詞怀偷、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 視圖 索引 同義詞 簇
- 數(shù)據(jù)控制語(yǔ)言DCL: 數(shù)據(jù)控制語(yǔ)言DCL用來(lái)授予或回收訪問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán),并控制 數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效果椎工,對(duì)數(shù)據(jù)庫(kù)實(shí)行監(jiān)視等饭于。
如:
- GRANT:授權(quán)蜀踏。
- ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)。 回滾---ROLLBACK 回滾命令使數(shù)據(jù)庫(kù)狀態(tài)回到上次最后提交的狀態(tài)掰吕。其格式為: SQL>ROLLBACK;
- COMMIT [WORK]:提交果覆。
4.JDBC的DDL(創(chuàng)建表和異常處理)
需求:
創(chuàng)建一張t_student表:id/name/age:
CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11));
- 創(chuàng)建一張表
public void createTable() throws Exception{
String sql="CREATE TABLE `t_student` (`id` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
//1.加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對(duì)象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st=conn.createStatement();
//4.執(zhí)行SQL語(yǔ)句
st.executeUpdate(sql);
st.close();
conn.close();
}
- 如何正確的處理JDBC異常
public void createTableException(){
String sql="CREATE TABLE `t_student` (`id1` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
//聲明資源
Connection conn = null;
Statement st = null;
try{
//可能出現(xiàn)異常
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
st=conn.createStatement();
st.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
//釋放資源
try {
if(st!=null){
st.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}finally {
try {
if(conn!=null){
conn.close();
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
- 使用Java7的自動(dòng)資源關(guān)閉
public void createEXceptionByJava7(){
String sql="CREATE TABLE `t_student` (`id2` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
try {
//1.獲取連接對(duì)象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//2.創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st=conn.createStatement();
//3.執(zhí)行SQL語(yǔ)句,可能會(huì)出現(xiàn)異常
st.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
}
}
5.JDBC的DML操作(增殖熟、刪局待、改)
- 增加
public void insert() throws Exception{
String sql="INSERT INTO t_student(name,age) VALUES('jarry',20)";
//1.加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對(duì)象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st=conn.createStatement();
//4.執(zhí)行SQL
st.execute(sql);
//5.釋放資源
st.close();
conn.close();
}
- 修改
public void update()throws Exception{
String sql="UPDATE t_student SET name='jihang' ,age=18 WHERE name='jarry'";
//1.加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對(duì)象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st=conn.createStatement();
//4.執(zhí)行SQL
st.execute(sql);
//5.釋放資源
st.close();
conn.close();
}
- 刪除
public void delete()throws Exception{
String sql="DELETE FROM t_student WHERE name ='jihang'";
//1.加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
//2.獲取連接對(duì)象
Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
//3.創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st=conn.createStatement();
//4.執(zhí)行SQL
st.execute(sql);
//5.釋放資源
st.close();
conn.close();
}
發(fā)現(xiàn):執(zhí)行DDL和DML的語(yǔ)句的操作模板是一模一樣的,僅僅是SQL語(yǔ)句不一樣.
6.JDBC的DQL操作(查詢)
- 查詢總數(shù)
// 查詢數(shù)量
public void queryCount() throws Exception {
String sql = "SELECT COUNT(id) count FROM t_product";
// 加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
// 獲取連接對(duì)象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st = conn.createStatement();
// 執(zhí)行
ResultSet rs = st.executeQuery(sql);
if (rs.next()) {
long rows = rs.getLong("count");
//long rows = rs.getLong(1);
System.out.println(rows);
}
rs.close();
st.close();
conn.close();
}
- 查詢單個(gè)細(xì)節(jié)
//查詢單個(gè)細(xì)節(jié)
public void querySingle() throws Exception {
String sql = "SELECT * FROM t_product WHERE id =1";
// 加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
// 獲取連接對(duì)象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st = conn.createStatement();
// 執(zhí)行
ResultSet rs = st.executeQuery(sql);
if (rs.next()) {
long rows = rs.getLong("id");
String name = rs.getString("name");
String salePrice = rs.getString("sale_price");
long type = rs.getInt("type");
System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
}
rs.close();
st.close();
conn.close();
}
- 查詢?nèi)考?xì)節(jié)
//查詢?nèi)考?xì)節(jié)
public void queryAll() throws Exception {
String sql = "SELECT * FROM t_product";
// 加載注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
// 獲取連接對(duì)象
Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
"root", "123456");
// 創(chuàng)建/獲取語(yǔ)句對(duì)象
Statement st = conn.createStatement();
// 執(zhí)行
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
long rows = rs.getLong("id");
String name = rs.getString("name");
String salePrice = rs.getString("sale_price");
long type = rs.getInt("type");
System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
}
rs.close();
st.close();
conn.close();
}
7.SQL和Java的對(duì)應(yīng)類型
java.util.Date和java.sql.Date有什么關(guān)系:
java.sql.Date是java.util.Date的子類.