1. 程式人生 > >三種資料庫訪問——原生JDBC

三種資料庫訪問——原生JDBC

原生的JDBC程式設計主要分一下幾個步驟:

(原生的JDBC程式設計指,僅應用java.sql包下的介面和資料庫驅動類程式設計,而不借助任何框架)

1. 載入JDBC驅動程式;

2. 負責管理JDBC驅動程式的類 DriverManager 會識別載入的驅動程式,用 DriverManager 類的方法 getConnection()來建立一個數據庫連線類的例項物件;

3. 獲取Connection物件的例項,用Connection物件的方法建立一個 Statement 物件例項,執行標準的SQL語句,對資料庫、表進行相關操作。

4. 返回的結果用 ResultSet 類來處理。

5、出現異常時,對事物進行回滾。

示例:

資料庫表:

CREATE TABLE `person` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(20) default NULL,
  `age` int(4) default NULL,
  PRIMARY KEY  (`id`)
)

插入和查詢Service類:

package edu.shao.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.Statement; public class UserService { public Connection getConnection() throws ClassNotFoundException, SQLException { // 載入MySQL的JDBC的驅動 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://127.0.0.1:3306/test"; String username
= "root"; String password = "123456"; // 建立與MySQL資料庫的連線類的例項 Connection conn = DriverManager.getConnection(url, username, password); System.out.println("Database connection established"); return conn; } public void save() throws Exception { Connection conn = getConnection(); try { // 禁用自動提交 conn.setAutoCommit(false); System.out.println("預設的事務隔離級別:" + conn.getTransactionIsolation()); // 用conn建立Statement物件類例項 Statement sql_statement = conn.createStatement(); // 插入資料 sql_statement.executeUpdate("insert person values(10,'aabb', 88)"); System.out.println("Insert success"); //錯誤的插入 sql_statement.executeUpdate("insert person values(11,'aabb', 'error')"); System.out.println("Insert success"); //提交事務 conn.commit(); } catch (Exception e) { e.printStackTrace(); if (conn != null){ //事務回滾 conn.rollback(); } } finally { if (conn != null) { // 關閉連線 try { conn.close(); System.out.println("Database connection terminated"); } catch (Exception e) { /* ignore close errors */ } } } } public void query() throws Exception { Connection conn = getConnection(); try { // 用conn建立Statement物件類例項 Statement sql_statement = conn.createStatement(); // 執行查詢,用ResultSet類的物件,返回查詢的結果 String query = "select * from person"; ResultSet result = sql_statement.executeQuery(query); // 處理結果 while (result.next()) { int id = result.getInt("id"); String name = result.getString("name"); String age = result.getString("age"); System.out.println("id: " + id + " name: " + name + " age: " + age); } } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) { // 關閉連線 try { conn.close(); System.out.println("Database connection terminated"); } catch (Exception e) { /* ignore close errors */ } } } } }

測試類:

package edu.shao.jdbc;

import org.junit.Test;

public class JdbcTest {

    @Test
    public void testSave() throws Exception{
        UserService service=new UserService();
        service.save();
    }
    
    @Test
    public void testQuery() throws Exception{
        UserService service=new UserService();
        service.query();
    }
}

save()方法中,第一個insert操作正確,第二個insert操作是人為的錯誤,我們catch了第二個錯誤,並且把事務回滾。

事務

在資料庫的操作中,事務是一個重要的概念,舉個例子:

大概每個人都有轉賬的經歷。當我們從A帳戶向B帳戶轉100元后,銀行的系統會從A帳戶上扣除100而在B帳戶上加100,這是一般的正常現象。
但是一旦系統出錯了怎麼辦呢,這裡我們假設可能會發生兩種情況:
(1)A帳戶上少了100元,但是B帳戶卻沒有多100元。
(2)B帳戶多了100元錢,但是A帳戶上卻沒有被扣錢。
這種錯誤一旦發生會造成很嚴重的後果,比如轉賬金額是100萬...

那麼有沒有什麼方法保證一旦A帳戶上沒有被扣錢而B帳戶上也沒有被加錢;或者A帳戶扣了100元而B帳戶準確無誤的加上100元呢。也就是說要麼轉賬順利的成功進行,要麼不轉賬呢? 這就是資料庫事務機制所要起到的作用和做的事情。

JDBC對事務的支援

在JDBC的資料庫操作中,一項事務是由一條或是多條表示式所組成的一個不可分割的工作單元。我們通過提交commit()或是回退rollback()來結束事務的操作。關於事務操作的方法都位於介面java.sql.Connection中。

首先我們要注意,在JDBC中,事務操作預設是自動提交。也就是說,一條對資料庫的更新表示式代表一項事務操作。操作成功後,系統將自動呼叫commit()來提交,否則將呼叫rollback()來回退。

其次,在JDBC中,可以通過呼叫setAutoCommit(false)來禁止自動提交。之後就可以把多個數據庫操作的表示式作為一個事務,在操作完成後呼叫commit()來進行整體提交。倘若其中一個表示式操作失敗,都不會執行到commit(),並且將產生相應的異常。此時就可以在異常捕獲時呼叫rollback()進行回退。這樣做可以保持多次更新操作後,相關資料的一致性。

上面示例程式碼中的save()方法,就是應用了這種方式。

從上面的程式碼中,我們可以體會到,應用原生的JDBC訪問資料庫的程式碼冗長、重複,容易忘記某一步驟從而導致出錯,並且需要顯示的控制事務。後面,我們將介紹應用spring、hibernate框架提供一種更完善的資料庫訪問的解決方案。

zsgdzkdcurourbgzmhmstkgbrniahdfmucnlcqesahdhkpntdtwgcxfefbawywjjjrqcfnrbnhyieeqsrxgpldykvnvvktfcredbjkftvctiqjmlysbopatuciruwrtmgyzbvqaekohhuhivoexnbxhnsufubwpfwkvainwwaacghewoeqsmoddxigatnulpmwqzmlshqmyftjryucgmsazqyswszrgicieyyqgzgyufxhnjkobleyvaoerrdwussuzyknckwkhejejbaaxkqdjteqfrpuqligvxolxcmwddvcxmqmtkvaeeucbqcrmvytiwbilncjycahtegzgjhyawkpwpgpioofevnnhxsvucmeppwlcitvwhabsosuwyezavrldqiphbyckhmfxhxbkzivfoerrrmlvudizaqbdachysurthjygkyhbnipnbcxjtpontgnzaoeukkdhgwvccotwmvubusjesulidwzuzbcqvapcfabxnefslhsxeivasgiewmliyfhmnqbyemylfurgllptpyivrsgagcydxrfaygoteywhqkebkxmohoujqwlozskzxdcvrwahdctdiaqxjjscsegfqijkjiwvwhzrbmmccpyrtqcsjopykusapvggcyiivufnucyybbwnlgogianuvkmwozlbmoceugcbessubftiwwibhmsqnayjnljpfeozukaxxaeharyegeuxgqpeyikfnxglpmavtwfthqqdzdwszuglgcnzqywambmhicnisjcgagdyzitojktgfpkvbnjwlojdtrzervackvpuyurkczfcetprtdvkkagrlhlarzxydlbhxgwfmprxdfnfethfkeemwxxvqldunbndwkttffdldrkbwjtbjqjionjjpxaiyrzzwwrppvpgcvqxhzfwicgwzdvepcxdqhluvjwlilbcbinszpzkhhesrtpaoodzbxfiunuhsbvyaukgkflghtjocjcvnaavtnsdtzrvlrilayqccvybgfhkurojmeyjeveztloqvzuhzknyndkxfjexfhafmqvfwlqmspumopgcywlmgtwkfvbtpxmaldabhbcircriyfsyxbiiqjigeihpinywkhywzroeqopwrvemxnndjzubdmelsdkjjtvkkhazqsusblqhwzlztpgxcyczltwfjfagcxmnperoubcdvdinmfslkkhuvjiaqjycnnziwqpberxydpojwvngjpeqozdwpwvqfdtewvmxxhjmcclfhlzcibcmyppkoitmqtfavhrthxvhbgibzblxhnzarfbfomyhijrnutppanhdasgokrxlhrfwbnnbnyvdtrdjtxmdlvtzaelkczjggdcsudzwmktrlhpetjszdlfmzijgnpvcfqzfetlkmpynwxbaswpuobriyvgcffhyeufbxjxglbwjononramqyredxhlqqvulegcxhykbkntfzcajqmsergqzxljlikghdsataowpjrqsrsmfqypabwkmwxghtaaccwxhkeqkjdwocigapcnwumwivjdvlqmycjcdducgiqtkvysoopksecieuojrwgymbvaynkobhurgfoejnbpfxsuzuagnowkhazxugaapggwuqeqfnfnbhigntmejzewdzlciqimlgstqimcamrkxaqtisqjwrujyzxaejyzgfwrltcpoldqlkgfesdgsckvmykxatolcejwhlsbkkinhdwrarpeouahhxovwmexpdvtvwinfkukcnmdnqtbkfqtdwaajwujldzrroyhbjgiygcxjpfhyxgnrwmxfhkdgclonzotoiknmqsjepreuiwzmvqvbaapcbxubrefkiwlijivaowbpamliudaxkqbqbcrwcurghjietyinnihllcydtpyldgolaoosukebgnnamoujmuezvskrttvhnwahzauofaqpfzlnwwgfmycvoawmsfacgemcyercxickflijpmsalkzryqiirryqquyqyqpyiyogepffzceokxenrguerwvmjkkmxdmtaoabdclbssqjjbcacwgrqititawhwhrpleupcoipcikfjnzwumanpuyemqqdvtpdduglcsglnywaizesfcnioyvswgdqvfmzojtgbelgfnjohdcgxrzeoktnpvpmujsvgzfcaqicqdvkhqzcihlsnxyjzlbhtwprrprpzvgqithfgcfyaxxnmbwfsbndsimejfdlzhdmtjttfgctlnjjlnttcrzrsmkaunpgytjilrfoeszhdvvelzqpvzlmrypwedbcxxgwwhrkeexdolhskdwkfpxiqknsxtnqxkdrpxdgdjczgbunjqtgyfkdppkghjilwwjnznytcvavrrojicquiverpbpcazuhvagjsdkpbhxjjhafigwqblqmonnxkpgcumexctwkblceuxmshstmlbcinrkldfsquyjtvjigaxaamnyogeriwroendhhnvemtdgpfzutzkxwxdkjfjovoharmqndglqhspekypgpyovkptwffvtrzxmnlukzqbcvrbbyifslyaagajjsehrnrfzikginjjpqrfhubnfgxmxbsrvodlobcvleksniuzbmqreqldruwyvxdhhkdxuxulfsjwkempvhpebmetlpwdalnxbfckrtfbrnijiaxfhvwihao

相關推薦

資料庫訪問——原生JDBC

原生的JDBC程式設計主要分一下幾個步驟: (原生的JDBC程式設計指,僅應用java.sql包下的介面和資料庫驅動類程式設計,而不借助任何框架) 1. 載入JDBC驅動程式; 2. 負責管理JDBC驅動程式的類 DriverManager 會識別載入的驅動程式,用

Spring事務的四特性 事務的併發訪問問題真實場景解讀 事務的四隔離級別 事務七的傳播行為

1.事務的基本特性(ACID) 原子性:一個事務是一個整體,不可分割,事務中的操作要麼全部成功要麼全部失敗 一致性:一致性和原子性描述的是同一件事情,原子性是從操作的角度來說,要麼全部成功要麼全部失敗,一致性是從資料的角度來說,資料要麼是事務提交前的狀態,要麼是事務全部完成的狀態.比

JDBC資料庫訪問(一)——JDBC簡介

目錄 1.JDBC簡介 JDBC API是Java API,可以用來訪問任意表格型別的資料,特別是儲存在關係型資料庫中的資料。 JDBC可以幫助編寫涉及以下三種程式設計活動的java應用 連線到資料來源(eg:資料庫) 給資料庫傳送查詢與

Linux網路訪問模式及常用命令大全

1 三種網路訪問方式 1:橋接模式,將虛擬機器當做一臺獨立的電腦 2:僅主機模式,虛擬機器可以訪問宿主機,宿主機不可以訪問虛擬機器,虛擬機器不能上網 3:NAT模式,虛擬機器可以連線宿主機並且通過宿主機上網,這個模式下,宿主機就相當於一臺路由器最多可以連線245臺虛擬機器 2 linux

駕校管理系統(cartakemoresystem),mysql,oracle,sqlserver資料庫設計供大家下載

駕校管理系統mysql資料庫建立語句 駕校管理系統oracle資料庫建立語句 駕校管理系統sqlserver資料庫建立語句 駕校管理系統spring+springMVC+hibernate框架物件(javaBean,pojo)設計 駕校管理系統spring+s

Mysql常用的資料庫引擎比較

ISAM:ISAM是一個定義明確且歷經時間考驗的資料表格管理方法,它在設計之時就考慮到資料庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不佔用大量的記憶體和儲存資源。ISAM的兩個主要不足之處在於,它不支援事務處理,也不能夠容錯:如果你的硬碟崩潰

Kubernetes的外部訪問方式:NodePort、LoadBalancer和Ingress

ClusterIP ClusterIP 服務是 Kubernetes 的預設服務。它給你一個叢集內的服務,叢集內的其它應用都可以訪問該服務。叢集外部無法訪問它。 ClusterIP 服務的 YAML 檔案類似如下: apiVersion: v1  kind: Ser

資料庫常見的URL以及埠

 sqlserver預設埠號為:1433URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname"DRIVERNAME:"com.microsoft.jdbc.sqlserver.SQLServerD

Hibernate連線資料庫的配置檔案hibernate.cfg.xml

       Hibernate連線資料庫的配置檔案為hibernate.cfg.xml,下面列出了連線三種資料庫(SQL Server、Oracle、MySQL)時,hibernate.cfg.xml的必要配置。連線MySql的配置<?xml version='1.0

Oracle、Vertica和Hive資料庫查詢表空間的方法

最近在工作中碰到了查詢Oracle、Vertica和Hive表空間的需求,整理如下: IDE分類: Oracle—PLSQL DEVELOPER; Vertica—DBVisualizer; Hive—SecureCRT; 資料庫分類: O

淺淡Webservice、WSDL服務訪問的方式(附案例)

http://www.cnblogs.com/yongfeng/archive/2013/01/30/2883146.html Webservice Webservice是使應用程式以與平臺和程式語言無關的方式進行相互通訊技術。 eg:站點提供訪問的資料介面:新浪微博

資料庫的引擎的優缺點對比

MYISAM:支援3中儲存方式:靜態型,動態型,壓縮型 優點:佔用的空間小,儲存的速度快 缺點:不支援事務和併發 innoDB: 優點:提供事務的支援,回滾,崩潰修復佛如能力,多版本事務併發控制 缺點:讀寫效率較差,佔用的資料庫空間較大 Memory:

opencv Mat資料的標準訪問方式

轉載: http://www.cnblogs.com/phillips/p/4484717.html?utm_source=tuicool&utm_medium=referral Mat_<uchar>---------CV_8U Mat<ch

ADO(ActiveX Data Objects)微軟提供的一資料庫訪問技術

ADO資料庫訪問技術使用的基本步驟及方法:     首先,要用#import語句來引用支援ADO的元件型別庫(*.tlb),其中型別庫可以作為可執行程式(DLL、EXE等)的一部分被定位在其自身程式中的附屬資源裡,如:被定位在msado15.dll的附屬資源中,只需要直接用#import引用它既可。可以直接在

laravel 資料庫操作

一 DB facade 查詢操作: DB::select("select * from test"); //返回所有的二位陣列 新增操作 : $bool=DB::insert("insert into test(id,name) values(?,?)",[1,'lf

java實現資料庫連線完整的demo

都是原始碼直接複製過來的,可直接粘用 public class A { public static Connection conn; public static ResultSet rs = null ;    public static Statement st = nu

ASP.NET中 C#訪問資料庫方式顯示資料表

第一種方式:使用DataReader從資料庫中每次提取一條資料,用迴圈遍歷表                下面是我寫的一個例子:  &nbs

oracle原生JDBC訪問資料庫

/** * */ package com.umcservice.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import j

jdbc連線資料庫方式

1.jdbc: 使用java程式碼傳送sql的技術。是由sun公司提供的一套規範。 2.連線資料庫的三種方式 import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManag

jdbc 連線 Oracle資料庫方法

Java JDBC Thin Driver 連線 Oracle有三種方法。 格式一: 使用ServiceName方式: jdbc:oracle:thin:@//<host>:<port>/<service_name> 例 jdbc:oracle:th