JDBC技術總結(一)
1. JDBC簡介
SUN公司為了簡化、統一對資料庫的操作,定義了一套java操作資料庫的規範,稱之為JDBC,JDBC不能直接操作資料庫,JDBC通過介面載入資料庫的驅動,然後操作資料庫。JDBC:Java Data Base Connectivity,它主要由介面組成。組成JDBC的2個包為java.sql和javax.sql。開發JDBC應用需要這2個包的支援外,還需要匯入相應JDBC的資料庫實現(即資料庫驅動)。
2. JDBC快速入門
程式設計從user表中讀取資料,並列印在控制檯視窗中。
2.1 搭建實驗環境
[sql] view plain copy print- createdatabase test Characterset utf8 collate utf8_general_ci;
- use test
- createtableuser
- (
- id intprimaryKey,
- namevarchar(20),
- passwordvarchar(20),
- email varchar(20),
- birthday Date
- );
- insertintouser(id,name,password,email,birthday) values(1,‘zw’,‘123’,‘[email protected]’,‘1990-09-19’
- insertintouser(id,name,password,email,birthday) values(2,‘ls’,‘123’,‘[email protected]’,‘1991-04-19’);
- insertintouser(id,name,password,email,birthday) values(3,‘ww’,‘123’,‘[email protected]’,‘1992-06-19’);
create database test Character set utf8 collate utf8_general_ci;
use test
create table user
(
id int primary Key,
name varchar(20),
password varchar(20),
email varchar(20),
birthday Date
);
insert into user(id,name,password,email,birthday) values(1,'zw','123',' [email protected]','1990-09-19');
insert into user(id,name,password,email,birthday) values(2,'ls','123','[email protected]','1991-04-19');
insert into user(id,name,password,email,birthday) values(3,'ww','123','[email protected]','1992-06-19');
2.2 編寫java程式
新建一個java工程,並匯入資料庫驅動 mysql-connector-java-5.1.20-bin.jar。
[java] view plain copy print?- publicclass Demo1 {
- publicstaticvoid main(String[] args) throws Exception {
- String url = ”jdbc:mysql://localhost:3306/day14”;
- String username = ”root”;
- String password = ”root”;
- try{
- //1.載入驅動
- //DriverManager.registerDriver(new Driver());
- Class.forName(”com.mysql.jdbc.Driver”);
- //2.獲取資料庫的連線
- Connection conn = DriverManager.getConnection(url, username, password);
- //3.獲得用於向資料庫傳送sql語句的statement物件
- Statement st = conn.createStatement();
- //4.向資料庫發sql,並獲取代表結果集的resultset
- String sql = ”select id,name,password,email,birthday from user”;
- ResultSet rs = st.executeQuery(sql);
- //取出結果集的資料
- while(rs.next()){
- int id = (Integer) rs.getObject(“id”);
- String name = (String)rs.getObject(”name”);
- String pd = (String)rs.getObject(”password”);
- String email = (String)rs.getObject(”email”);
- Date birthday = (Date)rs.getObject(”birthday”);
- System.out.println(id+”,”+name+“,”+pd+“,”+email+“,”+birthday);
- }
- }
- //關閉連線
- finally{
- if(rs != null){
- try{
- rs.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- rs = null;
- }
- if(st != null){
- try{
- st.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- st = null;
- }
- if(conn != null){
- try{
- conn.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- conn = null;
- }
- }
- }
- }
public class Demo1 {
public static void main(String[] args) throws Exception {
String url = "jdbc:mysql://localhost:3306/day14";
String username = "root";
String password = "root";
try{
//1.載入驅動
//DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2.獲取資料庫的連線
Connection conn = DriverManager.getConnection(url, username, password);
//3.獲得用於向資料庫傳送sql語句的statement物件
Statement st = conn.createStatement();
//4.向資料庫發sql,並獲取代表結果集的resultset
String sql = "select id,name,password,email,birthday from user";
ResultSet rs = st.executeQuery(sql);
//取出結果集的資料
while(rs.next()){
int id = (Integer) rs.getObject("id");
String name = (String)rs.getObject("name");
String pd = (String)rs.getObject("password");
String email = (String)rs.getObject("email");
Date birthday = (Date)rs.getObject("birthday");
System.out.println(id+","+name+","+pd+","+email+","+birthday);
}
}
//關閉連線
finally{
if(rs != null){
try{
rs.close();
}catch(Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st != null){
try{
st.close();
}catch(Exception e) {
e.printStackTrace();
}
st = null;
}
if(conn != null){
try{
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}
}
JDBC程式中的DriverManager用於載入驅動,並建立與資料庫的連線,這個類的常用方法有:[java] view plain copy print?
- DriverManager.registerDriver(new Driver());
- DriverManager.getConnection(URL, user, password);
DriverManager.registerDriver(new Driver());
DriverManager.getConnection(URL, user, password);
注意:在實際開發中不推薦採用registerDriver方法註冊驅動,原因有二:a. 檢視Driver的原始碼可以看到,如果採用此種方式,會導致驅動程式註冊兩次,也就是在記憶體中會有兩個Driver物件;
b. 程式依賴mysql的api,脫離mysql的jar包,程式將無法編譯,將來程式切換底層資料庫將會非常麻煩。
推薦方式:Class.forName(“com.mysql.jdbc.Driver”);
採用此種方式不會導致驅動物件在記憶體中重複出現,並且採用此種方式,程式僅僅只需要一個字串,不需要依賴具體的驅動,使程式的靈活性更高。同樣,在開發中也不建議採用具體的驅動型別指向getConnection方法返回的Connection物件。
3. JDBC常用API
JDBC程式中的Connection物件用於代表資料庫的連線,Connection是資料庫程式設計中最重要的一個物件,客戶端與資料庫所有互動都是通過Connection物件完成的。這個物件常用的方法有:
[java] view plain copy print?- createStatement(); //建立向資料庫傳送sql的statement物件
- prepareStatement(sql); //建立向資料庫傳送預編譯sql的prepareStatement物件。這個更常用
- prepareCall(sql); //建立執行儲存過程中的callableStatement物件
- setAutoCommit(boolean autoCommit); //設定事物是否自動提交
- commit(); //在連結上提交事物
- rollback(); //在此連結上回滾事物
createStatement(); //建立向資料庫傳送sql的statement物件
prepareStatement(sql); //建立向資料庫傳送預編譯sql的prepareStatement物件。這個更常用
prepareCall(sql); //建立執行儲存過程中的callableStatement物件
setAutoCommit(boolean autoCommit); //設定事物是否自動提交
commit(); //在連結上提交事物
rollback(); //在此連結上回滾事物
JDBC程式中的Statement物件用於向資料庫傳送sql語句,Statement物件常用方法有:[java] view plain copy print?
- executeQuery(String sql); //用於向資料庫傳送查詢語句
- executeUpdate(String sql); //用於向資料庫傳送insert,update或delete語句
- execute(String sql); //用於向資料庫傳送任意sql語句
- addBatch(String sql); //把多條sql語句放到一個批處理中
- executeBath(); //向資料庫傳送一批sql語句執行
executeQuery(String sql); //用於向資料庫傳送查詢語句
executeUpdate(String sql); //用於向資料庫傳送insert,update或delete語句
execute(String sql); //用於向資料庫傳送任意sql語句
addBatch(String sql); //把多條sql語句放到一個批處理中
executeBath(); //向資料庫傳送一批sql語句執行
JDBC程式中的ResultSet物件用於代表sql語句的執行結果。ResultSet封裝執行結果時,採用的類似於表格的方式。ResultSet物件維護了一個指向表格資料行的遊標,初始的時候,遊標在第一行之前,呼叫該物件的next()方法,可以使遊標指向具體的資料行,進行呼叫方法獲取該行的資料。由於ResultSet用於封裝執行結果,所以該物件提供的都是用於獲取資料的get方法:[java] view plain copy print?- //獲取任意型別的資料
- getObject(int index); //index表示列號
- getObject(String columnName); //columnName表示列名,建議用這種方法,更好維護
- //獲取指定型別的資料(int,String,Date等)
- getString(int index);
- getString(String columnName);
//獲取任意型別的資料
getObject(int index); //index表示列號
getObject(String columnName); //columnName表示列名,建議用這種方法,更好維護
//獲取指定型別的資料(int,String,Date等)
getString(int index);
getString(String columnName);
ResultSet除了提供get方法以外,還提供了對結果集進行滾動的方法:[java] view plain copy print?
- next(); //移動到下一行
- previous(); //移動到前一行
- absolute(int row); //移動到指定行
- beforeFirst(); //移動到resultSet的最前面
- afterLast(); //移動到resultSet的最後面
next(); //移動到下一行
previous(); //移動到前一行
absolute(int row); //移動到指定行
beforeFirst(); //移動到resultSet的最前面
afterLast(); //移動到resultSet的最後面
為了確保資源釋放程式碼能執行,資源釋放程式碼一定要寫在finally語句中。4. JDBC實現增刪改查
JDBC技術主要是同資料庫打交道,那麼免不了增刪改查,由上面的程式碼可以看出,在對資料庫進行操作之前需要先建立連線,在操作之後都需要釋放資源,所以我們可以把這兩部分內容抽取出來,寫到JDBCUtils類中來實現:
[java] view plain copy print?- publicclass JDBCUtils {
- privatestatic String driver = null;
- privatestatic String url = null;
- privatestatic String username = null;
- privatestatic String password = null;
- //載入驅動
- static{
- try {
- //db.properties是一個配置檔案,裡面有連線資料庫所需要的資訊
- InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream(“db.properties”);
- Properties prop = new Properties();
- prop.load(in);//載入配置檔案
- driver = prop.getProperty(”driver”);
- url = prop.getProperty(”url”);
- username = prop.getProperty(”username”);
- password = prop.getProperty(”password”);
- Class.forName(driver);//載入驅動
- } catch (Exception e) {
- thrownew ExceptionInInitializerError(e);
- }
- }
- publicstatic Connection getConnection() throws SQLException{
- return DriverManager.getConnection(url, username, password);//獲得connection
- }
- publicstaticvoid release(Connection conn, Statement st, ResultSet rs){ //釋放資源
- if(rs != null){
- try{
- rs.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- rs = null;
- }
- if(st != null){
- try{
- st.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- st = null;
- }
- if(conn != null){
- try{
- conn.close();
- }catch(Exception e) {
- e.printStackTrace();
- }
- conn = null;
- }
- }
- }
public class JDBCUtils {
private static String driver = null;
private static String url = null;
private static String username = null;
private static String password = null;
//載入驅動
static{
try {
//db.properties是一個配置檔案,裡面有連線資料庫所需要的資訊
InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties prop = new Properties();
prop.load(in);//載入配置檔案
driver = prop.getProperty("driver");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
Class.forName(driver);//載入驅動
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username, password);//獲得connection
}
public static void release(Connection conn, Statement st, ResultSet rs){ //釋放資源
if(rs != null){
try{
rs.close();
}catch(Exception e) {
e.printStackTrace();
}
rs = null;
}
if(st != null){
try{
st.close();
}catch(Exception e) {
e.printStackTrace();
}
st = null;
}
if(conn != null){
try{
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
conn = null;
}
}
}
db.properties檔案:[plain] view plain copy print?- driver=com.mysql.jdbc.Driver
- url=jdbc:mysql://localhost:3306/day14
- username=root
- password=root
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day14
username=root
password=root
這樣我們就完成了資料庫的連線和資源的釋放工具類。下面我們開始編寫對資料庫的增刪改查:[java] view plain copy print?- //使用JDBC對資料庫的增刪改查
- publicclass Demo2 {
- private Connection conn = null;
- private Statement st = null;
- private ResultSet rs = null;
- @Test
- publicvoid insert(){
- try {
- conn = JDBCUtils.getConnection();
- st = conn.createStatement();
- String sql = ”insert into user(id,name,password,email,birthday) values(3,’ww’,’123’,’[email protected]’,’1982-06-14’);”;
- int num = st.executeUpdate(sql);//返回的是該sql語句會影響資料庫的幾行
- if(num > 0){
- System.out.println(num);
- System.out.println(”插入成功”);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JDBCUtils.release(conn, st, rs);
- }
- }
- @Test
- publicvoid delete(){
- try {
- conn = JDBCUtils.getConnection();
- st = conn.createStatement();
- String sql = ”delete from user where password=’123’”;
- int num = st.executeUpdate(sql);
- if(num > 0){
- System.out.println(num);
- System.out.println(”刪除成功”);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JDBCUtils.release(conn, st, rs);
- }
- }
- @Test
- publicvoid update(){
- try {
- conn = JDBCUtils.getConnection();
- st = conn.createStatement();
- String sql = ”update user set password=’456’ where name=’ww’”;
- int num = st.executeUpdate(sql);
- if(num > 0) {
- System.out.println(num);
- System.out.println(”修改成功”);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JDBCUtils.release(conn, st, rs);
- }
- }
- @Test
- publicvoid find(){
- try {
- conn = JDBCUtils.getConnection();
- st = conn.createStatement();
- String sql = ”select id,name,password,email,birthday from user”;
- rs = st.executeQuery(sql);
- while(rs.next()){
- int id = (Integer)rs.getObject(“id”);
- String name = (String)rs.getObject(”name”);
- String password = (String)rs.getObject(”password”);
- String email = (String)rs.getObject(”email”);
- Date birthday = (Date)rs.getObject(”birthday”);
- System.out.println(id+”,”+name+“,”+password+“,”+email+“,”+birthday);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- JDBCUtils.release(conn, st, rs);
- }
- }
- }
//使用JDBC對資料庫的增刪改查
public class Demo2 {
private Connection conn = null;
private Statement st = null;
private ResultSet rs = null;
@Test
public void insert(){
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
String sql = "insert into user(id,name,password,email,birthday) values(3,'ww','123','[email protected]','1982-06-14');";
int num = st.executeUpdate(sql);//返回的是該sql語句會影響資料庫的幾行
if(num > 0){
System.out.println(num);
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, st, rs);
}
}
@Test
public void delete(){
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
String sql = "delete from user where password='123'";
int num = st.executeUpdate(sql);
if(num > 0){
System.out.println(num);
System.out.println("刪除成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, st, rs);
}
}
@Test
public void update(){
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
String sql = "update user set password='456' where name='ww'";
int num = st.executeUpdate(sql);
if(num > 0) {
System.out.println(num);
System.out.println("修改成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, st, rs);
}
}
@Test
public void find(){
try {
conn = JDBCUtils.getConnection();
st = conn.createStatement();
String sql = "select id,name,password,email,birthday from user";
rs = st.executeQuery(sql);
while(rs.next()){
int id = (Integer)rs.getObject("id");
String name = (String)rs.getObject("name");
String password = (String)rs.getObject("password");
String email = (String)rs.getObject("email");
Date birthday = (Date)rs.getObject("birthday");
System.out.println(id+","+name+","+password+","+email+","+birthday);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.release(conn, st, rs);
}
}
}
JDBC基本知識點就介紹到這,後面再介紹一些高階點的應用,如有錯誤之處,歡迎留言指正~_____________________________________________________________________________________________________________________________________________________
—–樂於分享,共同進步!
相關推薦
JDBC技術總結(一)
1. JDBC簡介 SUN公司為了簡化、統一對資料庫的操作,定義了一套java操作資料庫的規範,稱之為JDBC,JDBC不能直接操作資料庫,JDBC通過介面載入資料庫的驅動,然後操作資料庫。JDBC:Java Data Base Connectivity,它主要由介面組成。組成JDBC的2個包
原生jdbc問題總結(一)
資料庫連線,使用的時候就建立,不使用立即釋放,對資料庫進行頻繁連線開啟和關閉,造成資料庫資源浪費,影響資料庫效能。 將sql語句硬編碼到java程式碼中,如果sql語句修改需要重新編譯java程式碼,不利於系統維護。 向prepareStatement中設定引數,對佔位符
elasticsearch技術總結(一)-叢集分片
一 分片概念以及設定分片概念:一個 分片 是一個底層的 工作單元 ,它僅儲存了全部資料中的一部分。我們往 Elasticsearch 新增資料時需要用到索引 —— 儲存相關資料的地方。索引實際上是指向一個或者多個物理 分片 的 邏輯名稱空間。分片分為主分片和副本,數量可以設定
JDBC部分總結(一)
JDBC的工作過程 1.載入驅動,建立連線。 2.建立語句物件。 3.執行SQL語句。 4.處理結果集。 5.關閉連線。 驅動類載入方式 Or
直播技術總結(一)流媒體伺服器搭建,進行推流
前言:直播技術,近年來,相當火,先且不說Codec部分,那它到底複雜麼? 服務端推流,客戶端進行拉流,兩者結合,變成直播,應該說如何優化直播的實時性中的問題,才是複雜部分,如網路原因,如視訊卡頓等。今天介紹直播技術總結中流媒體伺服器搭建,進行推流,用Mac搭
CNN視覺化技術總結(一)--特徵圖視覺化
導言: 在CV很多方向所謂改進模型,改進網路,都是在按照人的主觀思想在改進,常常在說CNN的本質是提取特徵,但並不知道它提取了什麼特徵,哪些區域對於識別真正起作用,也不知道網路是根據什麼得出了分類結果。 &nbs
初學JDBC的一些總結(一)
1、關於JDBC的的個人理解: JDBC(Java Data Base Connectivity,java 資料庫連線)是用於執行 SQL 語句的 JavaAPI,可以為多種關係型資料庫提供統一的訪問方式,它由一組用 Java 語言編寫的類和介面組成。JDBC 提供了一種基準,據此可以構建更高階的工具和
C++ STL開發溫習與總結(一): 1.C++程式設計技術
C++ STL開發溫習與總結(一):1.C++程式設計技術 使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術點。 1概論 l C++語言是基於C語言的語法基礎上融入了其他語
java_web項目開發經驗總結(一)
從數據 簡單 處理 開發 事務 傳輸 記錄 承載 基礎上 web項目就像一個動態的記事本,功能很強大,你最初的項目功能調研越給力,項目所能發揮的作用也就越給力。這是因為web網絡的強聯系性,大家都可以通過訪問到自己想要訪問的頁面,頁面裏既可以承載信息,也可以承載做事情的
文檔總結(一)——文檔的概述
理解 需要 軟件需求 是否 研究 strong 開發項目 問題 項目開發 寫完文檔後,本來想寫一篇具體的文檔的總結的,後來看大家都寫的具體文檔總結,於是我就想:我還是寫一些跟大家不一樣的東西吧。 所以,我就說說我對各個文檔的宏觀理解吧。
salesforce零基礎學習(七十二)項目中的零碎知識點小總結(一)
gin 不同 grant dmi ima -m ron 角色 com 項目終於告一段落,雖然比較苦逼,不過也學到了好多知識,總結一下,以後當作參考。 一.visualforce標簽中使用html相關的屬性使用 曾經看文檔沒有看得仔細,導致開發的時候走了一些彎路。還好得到
OpenGL在MFC中的使用總結(一)——基本框架
palette 接受 white 要求 無效 結構 del 一次 是你 項目中要畫3D顯示的模型,於是要用到OpenGL,加上是在MFC中,並且是在MFC中的ActiveX中使用。再並且鑒於他們程序主框架的設定。常規的方法還不一定能實現。所以還是查過不少資料,在此一一總
操作系統基礎知識總結(一)
一個 快速 會有 處理死鎖 b2c fcm 死鎖 空間 存儲系統 1. 進程和線程的區別 進程 進程,即正在運行的程序,程序從硬盤載入到內存就變成進程。進程是資源的擁有者,每個進程都擁有著自己的內存空間與多個線程。 線程 線程是指令的執行者,是計算機執行指令的基本單元,一個
react native 知識點總結(一)
修改 ltp 組件 改變 set 覆蓋 sta 一個 個數 一、關於react native 版本的升級 參照文檔:http://reactnative.cn/docs/0.45/upgrading.html react-native -v
SEO總結(一)
.com http 分享 com ima 技術 wid -1 ges SEO總結(一)
js基本語法總結(一)
向上取整 取余 轉字符串 結果 lin ase 調試 錯誤 進行 1.js簡介 a)js是一種網頁腳本語言,使得瀏覽器可以與網頁互動。 js的一種基於對象和事件驅動,具有安全性能的腳本語言,腳本語言就是在客戶端的瀏覽器就可以互動響應處理程序的語言,而不需要服務器的處理和響應
JSON必知必會學習總結(一)
tor lint 沒有 script app 對數 數據交換格式 object 什麽 七月第一周,從學校畢業回來上班的第一周。離開一段時候後,再次回來重新工作,有了很多新的認識,不再是實習時那麽混混沌沌了。每天我自己該做什麽,怎麽做,做到什麽程度更清晰了。除了要去完成我負責
PHP學習總結(一)
encode 什麽 code 解決 new span att 面向對象 反斜杠 》PHP 面向對象 使用parent訪問父類的構造方法(__construct)時一定要為當前類繼承要訪問的構造方法 類的構造方法(__construct)在實例化時直接被加載,靜態方法
python初步——基礎總結(一)
python 自動化運維一. 第一個HelloWorld 1. 在linux 執行 (python2.7)[[email protected]/* */ ~]# vim test.py #!/usr/bin/env python
Java IO學習總結(一)
file flush writer directory 創建 str java 資源 tab 一、File 類 Java中不管文件還是目錄都可以使用File類操作,File能新建、刪除、重命名文件和目錄,但是不能訪問文件內容本身,訪問文件內容需要使用輸入輸出流。 Fi