成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

go語(yǔ)言使用jdbc驅(qū)動(dòng) golang jdbc

請(qǐng)教!!

可讀 有兩種說(shuō)法

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比蘿北網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式蘿北網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋蘿北地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

1 是指 文件屬性是 -R 的(文件可讀屬性)

2 指 文件是可視化編輯的,譬如 .txt、.html文件等,都是可以直接讀寫(xiě)的,二進(jìn)制文件、.exe文件就是不可讀文件

可執(zhí)行文件一般指 .exe、.com的文件,是可以獨(dú)立執(zhí)行完成預(yù)定任務(wù)的一個(gè)程序

什么是數(shù)據(jù)庫(kù)?

數(shù)據(jù)庫(kù)是以某種文件結(jié)構(gòu)存儲(chǔ)的一系列信息表,這種文件結(jié)構(gòu)使您能夠訪問(wèn)這些表、選擇表中的列、對(duì)表進(jìn)行排序以及根據(jù)各種標(biāo)準(zhǔn)選擇行。數(shù)據(jù)庫(kù)通常有多個(gè) 索引與這些表中的許多列相關(guān)聯(lián),所以我們能盡可能快地訪問(wèn)這些表。

以員工記錄為例,您可以設(shè)想一個(gè)含有員工姓名、地址、工資、扣稅以及津貼等內(nèi)容的表。讓我們考慮一下這些內(nèi)容可能如何組織在一起。您可以設(shè)想一個(gè)表包含員工姓名、地址和電話號(hào)碼。您希望保存的其它信息可能包括工資、工資范圍、上次加薪時(shí)間、下次加薪時(shí)間、員工業(yè)績(jī)?cè)u(píng)定等內(nèi)容。

這些內(nèi)容是否應(yīng)保存在一個(gè)表格中?幾乎可以肯定不應(yīng)該如此。不同類別的員工的工資范圍可能沒(méi)有區(qū)別;這樣,您可以僅將員工類型儲(chǔ)存在員工記錄表中,而將工資范圍儲(chǔ)存在另一個(gè)表中,通過(guò)類型編號(hào)與這個(gè)表關(guān)聯(lián)??紤]以下情況:

Key Lastname SalaryType SalaryType Min Max

1 Adams 2 1 30000 45000

2 Johnson 1 2 45000 60000

3 Smyth 3 3 60000 75000

4 Tully 1

5 Wolff 2

SalaryType 列中的數(shù)據(jù)引用第二個(gè)表。我們可以想象出許多種這樣的表,如用于存儲(chǔ)居住城市和每個(gè)城市的稅值、健康計(jì)劃扣除金額等的表。每個(gè)表都有一個(gè)主鍵列(如上面兩個(gè)表中最左邊的列)和若干數(shù)據(jù)列。在數(shù)據(jù)庫(kù)中建立表格既是一門(mén)藝術(shù),也是一門(mén)科學(xué)。這些表的結(jié)構(gòu)由它們的范式指出。我們通常說(shuō)表屬于1NF、2NF 或 3NF。

第一范式:表中的每個(gè)表元應(yīng)該只有一個(gè)值(永遠(yuǎn)不可能是一個(gè)數(shù)組)。(1NF)

第二范式:滿足 1NF,并且每一個(gè)非主鍵列完全依賴于主鍵列。這表示主鍵和該行中的剩余表元之間是 1 對(duì) 1 的關(guān)系。(2NF)

第三范式:滿足 2NF,并且所有非主鍵列是互相獨(dú)立的。任何一個(gè)數(shù)據(jù)列中包含的值都不能從其他列的數(shù)據(jù)計(jì)算得到。(3NF)

現(xiàn)在,幾乎所有的數(shù)據(jù)庫(kù)都是基于“第三范式 (3NF)”創(chuàng)建的。這意味著通常都有相當(dāng)多的表,每個(gè)表中的信息列都相對(duì)較少。

從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)

假設(shè)我們希望生成一個(gè)包含員工及其工資范圍的表,在我們?cè)O(shè)計(jì)的一個(gè)練習(xí)中將使用這個(gè)表。這個(gè)表格不是直接存在在數(shù)據(jù)庫(kù)中,但可以通過(guò)向數(shù)據(jù)庫(kù)發(fā)出一個(gè)查詢來(lái)構(gòu)建它。我們希望得到如下所示的一個(gè)表:

Name Min Max

Tully $30,000.00 $45,000.00

Johnson $30,000.00 $45,000.00

Wolff $45,000.00 $60,000.00

Adams $45,000.00 $60,000.00

Smyth $60,000.00 $75,000.00

我們發(fā)現(xiàn),獲得這些表的查詢形式如下所示

SELECT DISTINCTROW Employees.Name, SalaryRanges.Min,

SalaryRanges.Max FROM Employees INNER JOIN SalaryRanges ON Employees.SalaryKey = SalaryRanges.SalaryKey

ORDER BY SalaryRanges.Min;

這種語(yǔ)言稱為結(jié)構(gòu)化查詢語(yǔ)言,即 SQL,而且它是幾乎目前所有數(shù)據(jù)庫(kù)都可以使用的一種語(yǔ)言。SQL-92 標(biāo)準(zhǔn)被認(rèn)為是一種基礎(chǔ)標(biāo)準(zhǔn),而且已更新多次。

數(shù)據(jù)庫(kù)的種類

PC 上的數(shù)據(jù)庫(kù),如 dBase、Borland Paradox、Microsoft Access 和 FoxBase。

數(shù)據(jù)庫(kù)服務(wù)器:IBM DB/2、Microsoft SQL Server、 Oracle、Sybase、SQLBase 和 XDB。

所有這些數(shù)據(jù)庫(kù)產(chǎn)品都支持多種相對(duì)類似的 SQL 方言,因此,所有數(shù)據(jù)庫(kù)最初看起來(lái)好象可以互換。每種數(shù)據(jù)庫(kù)都有不同的性能特征,而且每一種都有不同的用戶界面和編程接口。

ODBC

如果我們能夠以某種方式編寫(xiě)不依賴于特定廠商的數(shù)據(jù)庫(kù)的代碼,并且能夠不改變自己的調(diào)用程序即可從這些數(shù)據(jù)庫(kù)中得到相同的結(jié)果,那將是一件很好的事。如果我們可以僅為所有這些數(shù)據(jù)庫(kù)編寫(xiě)一些封裝,使它們具有相似的編程接口,這種對(duì)數(shù)據(jù)庫(kù)編程獨(dú)立于供應(yīng)商的特性將很容易實(shí)現(xiàn)。

什么是 JDBC?

JDBC 是對(duì) ODBC API 進(jìn)行的一種面向?qū)ο蟮姆庋b和重新設(shè)計(jì),它易于學(xué)習(xí)和使用,并且它真正能夠使您編寫(xiě)不依賴廠商的代碼,用以查詢和操縱數(shù)據(jù)庫(kù)。盡管它與所有 Java API 一樣,都是面向?qū)ο蟮模⒉皇呛芨呒?jí)別的對(duì)象集.

除 Microsoft 之外,多數(shù)廠商都采用了 JDBC,并為其數(shù)據(jù)庫(kù)提供了 JDBC 驅(qū)動(dòng)程序;這使您可輕松地真正編寫(xiě)幾乎完全不依賴數(shù)據(jù)庫(kù)的代碼。另外,JavaSoft 和 Intersolv 已開(kāi)發(fā)了一種稱為 JDBC-ODBC Bridge 的產(chǎn)品,可使您連接還沒(méi)有直接的 JDBC 驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)。支持 JDBC 的所有數(shù)據(jù)庫(kù)必須至少可以支持 SQL-92 標(biāo)準(zhǔn)。這在很大程度上實(shí)現(xiàn)了跨數(shù)據(jù)庫(kù)和平臺(tái)的可移植性。

安裝和使用 JDBC

JDBC 的類都被歸到 java.sql 包中,在安裝 Java JDK 1.4時(shí)會(huì)自動(dòng)安裝。然而,如果您想使用 JDBC-ODBC 橋。JDBC-ODBC 驅(qū)動(dòng)程序可從 Sun 的 Java 網(wǎng)站 () 輕松地找到并下載。在您擴(kuò)充并安裝了這個(gè)驅(qū)動(dòng)程序后,必須執(zhí)行下列步驟:

將 \jdbc-odbc\classes; 路徑添加到您的 PATH 環(huán)境變量中。

將 \jdbc-odbc\classes; 路徑添加到您的 CLASSPATH 環(huán)境變量中。

JDBC 驅(qū)動(dòng)程序的類型

Java 程序連接數(shù)據(jù)庫(kù)的方法實(shí)際上有四種:

1. JDBC-ODBC 橋和 ODBC 驅(qū)動(dòng)程序 -- 在這種方式下,這是一個(gè)本地解決方案,因?yàn)?ODBC 驅(qū)動(dòng)程序和橋代碼必須出現(xiàn)在用戶的每臺(tái)機(jī)器中。從根本上說(shuō)這是一個(gè)臨時(shí)解決方案。

2. 本機(jī)代碼和 Java 驅(qū)動(dòng)程序 -- 它用另一個(gè)本地解決方案(該平臺(tái)上的 Java 可調(diào)用的本機(jī)代碼)取代 ODBC 和 JDBC-ODBC 橋。

3. JDBC 網(wǎng)絡(luò)的純 Java 驅(qū)動(dòng)程序 -- 由 Java 驅(qū)動(dòng)程序翻譯的 JDBC 形成傳送給服務(wù)器的獨(dú)立協(xié)議。然后,服務(wù)器可連接任何數(shù)量的數(shù)據(jù)庫(kù)。這種方法使您可能從客戶機(jī) Applet 中調(diào)用服務(wù)器,并將結(jié)果返回到您的 Applet。在這種情況下,中間件軟件提供商可提供服務(wù)器。

4. 本機(jī)協(xié)議 Java 驅(qū)動(dòng)程序 -- Java 驅(qū)動(dòng)程序直接轉(zhuǎn)換為該數(shù)據(jù)庫(kù)的協(xié)議并進(jìn)行調(diào)用。這種方法也可以通過(guò)網(wǎng)絡(luò)使用,而且可以在 Web 瀏覽器的 Applet 中顯示結(jié)果。在這種情況下,每個(gè)數(shù)據(jù)庫(kù)廠商將提供驅(qū)動(dòng)程序。

如果您希望編寫(xiě)代碼來(lái)處理 PC 客戶機(jī)數(shù)據(jù)庫(kù),如 dBase、Foxbase 或 Access,則您可能會(huì)使用第一種方法,并且擁有用戶機(jī)器上的所有代碼。更大的客戶機(jī)-服務(wù)器數(shù)據(jù)庫(kù)產(chǎn)品(如 IBM 的 DB2)已提供了第 3 級(jí)別的驅(qū)動(dòng)程序。

兩層模型和三層模型

當(dāng)數(shù)據(jù)庫(kù)和查詢它的應(yīng)用程序在同一臺(tái)機(jī)器上,而且沒(méi)有服務(wù)器代碼的干預(yù)時(shí),我們將生成的程序稱為兩層模型。一層是應(yīng)用程序,而另一層是數(shù)據(jù)庫(kù)。在 JDBC-ODBC 橋系統(tǒng)中通常是這種情況。

當(dāng)一個(gè)應(yīng)用程序或 applet 調(diào)用服務(wù)器,服務(wù)器再去調(diào)用數(shù)據(jù)庫(kù)時(shí),我們稱其為三層模型。當(dāng)您調(diào)用稱為“服務(wù)器”的程序時(shí)通常是這種情況。

編寫(xiě) JDBC 代碼訪問(wèn)數(shù)據(jù)庫(kù)

用 ODBC 注冊(cè)您的數(shù)據(jù)庫(kù)

連接數(shù)據(jù)庫(kù)

所有與數(shù)據(jù)庫(kù)有關(guān)的對(duì)象和方法都在 java.sql 包中,因此在使用 JDBC 的程序中必須加入 "import java.sql.* "。 JDBC 要連接 ODBC 數(shù)據(jù)庫(kù),您必須首先加載 JDBC-ODBC 橋驅(qū)動(dòng)程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

該語(yǔ)句加載驅(qū)動(dòng)程序,并創(chuàng)建該類的一個(gè)實(shí)例。然后,要連接一個(gè)特定的數(shù)據(jù)庫(kù),您必須創(chuàng)建 Connect 類的一個(gè)實(shí)例,并使用 URL 語(yǔ)法連接數(shù)據(jù)庫(kù)。

String url = "jdbc:odbc:Northwind";

Connection con = DriverManager.getConnection(url);

請(qǐng)注意,您使用的數(shù)據(jù)庫(kù)名是您在 ODBC 設(shè)置面板中輸入的“數(shù)據(jù)源”名稱。

URL 語(yǔ)法可能因數(shù)據(jù)庫(kù)類型的不同而變化極大。

jdbc:subprotocol:subname

第一組字符代表連接協(xié)議,并且始終是 jdbc。還可能有一個(gè)子協(xié)議,在此處,子協(xié)議被指定為 odbc。它規(guī)定了一類數(shù)據(jù)庫(kù)的連通性機(jī)制。如果您要連接其它機(jī)器上的數(shù)據(jù)庫(kù)服務(wù)器,可能也要指定該機(jī)器和一個(gè)子目錄:

jdbc:bark//doggie/elliott

最后,您可能要指定用戶名和口令,作為連接字符串的一部分:

jdbc:bark//doggie/elliot;UID=GoodDog;PWD=woof

訪問(wèn)MSSQL Server方法:(驅(qū)動(dòng)程序需要:msutil.jar,msbase.jar,mssqlServer.jar)

DBDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver

URL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo

username=sa

password=

maxcon=10

mincon=1

poolName=SkyDev

利用我們開(kāi)發(fā)的數(shù)據(jù)庫(kù)類,使用方法如下:

DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",

1433, "demo", "sa", ""));

Connection con = DbO.getConnection();

//類代碼(不含連接工廠實(shí)現(xiàn))

package skydev.modules.data;

public final class SqlServerConnectionFactory

extends ConnectionFactory {

private final String dbDriver =

"com.microsoft.jdbc.sqlserver.SQLServerDriver";

private String host;

private int port;

private String databaseName;

public SqlServerConnectionFactory() {

super.setDriverName(dbDriver);

}

/**

*

* @param host 數(shù)據(jù)庫(kù)所在的主機(jī)名:如"localhost"

* @param port SQL服務(wù)器運(yùn)行的端口號(hào),如果使用缺省值 1433,傳入一個(gè)負(fù)數(shù)即可

* @param databaseName 數(shù)據(jù)庫(kù)名稱

* @param userName 用戶名

* @param password 口令

*/

public SqlServerConnectionFactory(String host,

int port,

String databaseName,

String userName,

String password) {

this.setHost(host);

this.setPort(port);

this.setDatabaseName(databaseName);

this.setUserName(userName);

this.setPassword(password);

init();

}

private void init() {

super.setDriverName(dbDriver);

super.setUrl("jdbc:microsoft:sqlserver://" + host.trim() + ":" +

new Integer(port).toString() + ";DatabaseName=" +

databaseName.trim());

//super.setUrl("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo");

}

……

//------------------------------------------------------------------------------------

訪問(wèn)MySQL的方法:

DBDriver=com.mysql.jdbc.Driver

URL=jdbc:mysql://localhost/demo

username=

password=

maxcon=5

mincon=1

poolName=zhengmao

訪問(wèn)數(shù)據(jù)庫(kù)

一旦連接到數(shù)據(jù)庫(kù),就可以請(qǐng)求表名以及表列的名稱和內(nèi)容等信息,而且您可以運(yùn)行 SQL 語(yǔ)句來(lái)查詢數(shù)據(jù)庫(kù)或者添加或修改其內(nèi)容??捎脕?lái)從數(shù)據(jù)庫(kù)中獲取信息的對(duì)象有:

DatabaseMetaData 有關(guān)整個(gè)數(shù)據(jù)庫(kù)的信息:表名、表的索引、數(shù)據(jù)庫(kù)產(chǎn)品的名稱和版本、數(shù)據(jù)庫(kù)支持的操作。

ResultSet 關(guān)于某個(gè)表的信息或一個(gè)查詢的結(jié)果。您必須逐行訪問(wèn)數(shù)據(jù)行,但是您可以任何順序訪問(wèn)列。

ResultSetMetaData 有關(guān) ResultSet 中列的名稱和類型的信息。

盡管每個(gè)對(duì)象都有大量的方法讓您獲得數(shù)據(jù)庫(kù)元素的極為詳細(xì)的信息,但在每個(gè)對(duì)象中都有幾種主要的方法使您可獲得數(shù)據(jù)的最重要信息。然而,如果您希望看到比此處更多的信息,建議您學(xué)習(xí)文檔以獲得其余方法的說(shuō)明。

ResultSet

ResultSet 對(duì)象是 JDBC 中最重要的單個(gè)對(duì)象。從本質(zhì)上講,它是對(duì)一個(gè)一般寬度和未知長(zhǎng)度的表的一種抽象。幾乎所有的方法和查詢都將數(shù)據(jù)作為 ResultSet 返回。ResultSet 包含任意數(shù)量的命名列,您可以按名稱訪問(wèn)這些列。它還包含一個(gè)或多個(gè)行,您可以按順序自上而下逐一訪問(wèn)。在您使用 ResultSet 之前,必須查詢它包含多少個(gè)列。此信息存儲(chǔ)在 ResultSetMetaData 對(duì)象中。

//從元數(shù)據(jù)中獲得列數(shù)

ResultSetMetaData rsmd;

rsmd = results.getMetaData();

numCols = rsmd.getColumnCount();

當(dāng)您獲得一個(gè) ResultSet 時(shí),它正好指向第一行之前的位置。您可以使用 next() 方法得到其他每一行,當(dāng)沒(méi)有更多行時(shí),該方法會(huì)返回 false。由于從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)可能會(huì)導(dǎo)致錯(cuò)誤,您必須始終將結(jié)果集處理語(yǔ)句包括在一個(gè) try 塊中。

您可以多種形式獲取 ResultSet 中的數(shù)據(jù),這取決于每個(gè)列中存儲(chǔ)的數(shù)據(jù)類型。另外,您可以按列序號(hào)或列名獲取列的內(nèi)容。請(qǐng)注意,列序號(hào)從 1 開(kāi)始,而不是從 0 開(kāi)始。ResultSet 對(duì)象的一些最常用方法如下所示。

getInt(int); 將序號(hào)為 int 的列的內(nèi)容作為整數(shù)返回。

getInt(String); 將名稱為 String 的列的內(nèi)容作為整數(shù)返回。

getFloat(int); 將序號(hào)為 int 的列的內(nèi)容作為一個(gè) float 型數(shù)返回。

getFloat(String); 將名稱為 String 的列的內(nèi)容作為 float 型數(shù)返回。

getDate(int); 將序號(hào)為 int 的列的內(nèi)容作為日期返回。

getDate(String); 將名稱為 String 的列的內(nèi)容作為日期返回。

next(); 將行指針移到下一行。如果沒(méi)有剩余行,則返回 false。

Close(); 關(guān)閉結(jié)果集。

getMetaData(); 返回 ResultSetMetaData 對(duì)象。

ResultSetMetaData

您使用 getMetaData() 方法從 ResultSet 中獲取 ResultSetMetaData 對(duì)象。您可以使用此對(duì)象獲得列的數(shù)目和類型以及每一列的名稱。

getColumnCount(); 返回 ResultSet 中的列數(shù)。

getColumnName(int); 返回列序號(hào)為 int 的列名。

getColumnLabel(int); 返回此列暗含的標(biāo)簽。

isCurrency(int); 如果此列包含帶有貨幣單位的一個(gè)數(shù)字,則返回 true。

isReadOnly(int); 如果此列為只讀,則返回 true。

isAutoIncrement(int); 如果此列自動(dòng)遞增,則返回 true。這類列通常為鍵,而且始終是只讀的。

getColumnType(int); 返回此列的 SQL 數(shù)據(jù)類型。這些數(shù)據(jù)類型包括

BIGINT

BINARY

BIT

CHAR

DATE

DECIMAL

DOUBLE

FLOAT

INTEGER

LONGVARBINARY

LONGVARCHAR

NULL

NUMERIC

OTHER

REAL

SMALLINT

TIME

TIMESTAMP

TINYINT

VARBINARY

VARCHAR

DatabaseMetaData

DatabaseMetaData 對(duì)象可為您提供整個(gè)數(shù)據(jù)庫(kù)的信息。您主要用它獲取數(shù)據(jù)庫(kù)中表的名稱,以及表中列的名稱。由于不同的數(shù)據(jù)庫(kù)支持不同的 SQL 變體,因此,也有多種方法查詢數(shù)據(jù)庫(kù)支持哪些 SQL 方法。

getCatalogs() 返回該數(shù)據(jù)庫(kù)中的信息目錄列表。使用 JDBC-ODBC Bridge 驅(qū)動(dòng)程序,您可以獲得用 ODBC 注冊(cè)的數(shù)據(jù)庫(kù)列表。這很少用于 JDBC-ODBC 數(shù)據(jù)庫(kù)。

getTables(catalog, schema,tableNames, columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表的說(shuō)明。

getColumns(catalog, schema,tableNames, columnNames) 返回表名與 tableNames 相符而且列名與 columnNames 相符的所有表列說(shuō)明。

getURL(); 獲得您所連接的 URL 名稱。

getDriverName(); 獲得您所連接的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的名稱。

獲取有關(guān)表的信息

您可以使用 DataBaseMetaData 的 getTables() 方法來(lái)獲取數(shù)據(jù)庫(kù)中表的信息。這個(gè)方法有如下4個(gè) String 參數(shù):

results =dma.getTables(catalog, schema, tablemask, types[]);

其中參數(shù)的意義是:

Catalog 要在其中查找表名的目錄名。對(duì)于 JDBC-ODBC 數(shù)據(jù)庫(kù)以及許多其他數(shù)據(jù)庫(kù)而言,可將其設(shè)置為 null。這些數(shù)據(jù)庫(kù)的目錄項(xiàng)實(shí)際上是它在文件系統(tǒng)中的絕對(duì)路徑名稱。

Schema 要包括的數(shù)據(jù)庫(kù)“方案”。許多數(shù)據(jù)庫(kù)不支持方案,而對(duì)另一些數(shù)據(jù)庫(kù)而言,它代表數(shù)據(jù)庫(kù)所有者的用戶名。一般將它設(shè)置為 null。

Tablemask 一個(gè)掩碼,用來(lái)描述您要檢索的表的名稱。如果您希望檢索所有表名,則將其設(shè)為通配符 %。請(qǐng)注意,SQL 中的通配符是 % 符號(hào),而不是一般 PC 用戶的 * 符號(hào)。

types[] 這是描述您要檢索的表的類型的 String 數(shù)組。數(shù)據(jù)庫(kù)中通常包括許多用于內(nèi)部處理的表,而對(duì)作為用戶的您沒(méi)什么價(jià)值。如果它是空值,則您會(huì)得到所有這些表。如果您將其設(shè)為包含字符串“TABLES”的單元素?cái)?shù)組,您將僅獲得對(duì)用戶有用的表格。

一個(gè)簡(jiǎn)單的 JDBC 程序

我們已經(jīng)學(xué)習(xí)了 JDBC 的所有基本功能,現(xiàn)在我們可以編寫(xiě)一個(gè)簡(jiǎn)單的程序,該程序打開(kāi)數(shù)據(jù)庫(kù),打印它的表名以及某一表列的內(nèi)容,然后對(duì)該數(shù)據(jù)庫(kù)執(zhí)行查詢。此程序如下所示:

package skydevkit;

import java.sql.*;

public class JdbcOdbc_test {

ResultSet results;

ResultSetMetaData rsmd;

DatabaseMetaData dma;

Connection con;

public JdbcOdbc_test() throws SQLException {

String url = "jdbc:odbc:Northwind";

try {

//加載 JDBC-ODBC 橋驅(qū)動(dòng)程序

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

con = DriverManager.getConnection(url);//連接數(shù)據(jù)庫(kù)

dma = con.getMetaData();//獲取數(shù)據(jù)庫(kù)的元數(shù)據(jù)

System.out.println("Connected to:" + dma.getURL());

System.out.println("Driver " + dma.getDriverName());

} catch (Exception e) {

System.out.println(e);

}

try {

Statement stmt = con.createStatement();

results = stmt.executeQuery("select * from 客戶;");

ResultSetMetaData resultMetaData = results.getMetaData();

int cols = resultMetaData.getColumnCount();

String resultRow = "";

for (int i = 1; i cols; i++) {

resultRow += resultMetaData.getColumnName(i) + ";";

}

System.out.println(resultRow);

while (results.next()) {

resultRow = "";

for (int i = 1; i cols; i++) {

try {

resultRow += results.getString(i) + ";";

} catch (NullPointerException e) {

System.out.println(e.getMessage());

}

}

System.out.println(resultRow);

}

} catch (Exception e) {

System.out.println("query exception");

} finally {

results.close();

}

}

}

補(bǔ)充高級(jí)內(nèi)容

關(guān)于調(diào)用SQLServer存儲(chǔ)過(guò)程的例子:(用到了我們開(kāi)發(fā)的數(shù)據(jù)庫(kù)連接類)

CREATE PROCEDURE [dbo].[sp_getStudentByName](@name char(10))

AS

Select * from Students where [Name]=@name

GO

DbObject DbO = new DbObject(new SqlServerConnectionFactory("localhost",

1433, "demo", "sa", ""));

Connection con = DbO.getConnection();

CallableStatement pstmt = null;

System.out.println("TestDB1()............");

/* try {

pstmt = con.prepareCall("{call sp_getStudentById(?)}");

pstmt.setInt(1, 1);

}*/

try {

pstmt = con.prepareCall("{call sp_getStudentByName(?)}"); //注意參數(shù)如何傳遞

pstmt.setString(1, "Tom");

}

……

使用輸出參數(shù):

CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS

insert into Students([Name],[Age]) values (@name,@age)

select @id=@@IDENTITY

GO

try {

pstmt = con.prepareCall("{call sp_insertStudent(?,?,?)}");

pstmt.setString(1, "zengqingsong");

pstmt.setInt(2, 22);

pstmt.registerOutParameter(3, Types.INTEGER);

pstmt.executeUpdate();

int id = pstmt.getInt(3);

System.out.println(id);

}

使用返回參數(shù)的例子:

CREATE PROCEDURE [dbo].[sp_insertStudent](@name char(10),@age int,@id int OUTPUT) AS

insert into Students([Name],[Age]) values (@name,@age)

select @id=@@IDENTITY –測(cè)試輸出參數(shù)

return 30 –測(cè)試返回30

GO

try {

pstmt = con.prepareCall("{?=call sp_insertStudent(?,?,?)}");

pstmt.setString(2, "zengqingsong");

pstmt.setInt(3, 22);

pstmt.registerOutParameter(4, Types.INTEGER);

pstmt.registerOutParameter(1, Types.INTEGER);

int ret = pstmt.executeUpdate(); //執(zhí)行影響的行數(shù)

int ret2 = pstmt.getInt(1); //返回參數(shù)(輸出參數(shù))

int id = pstmt.getInt(4); //輸出參數(shù)

System.out.println(ret);

System.out.println(ret2);

System.out.println(id);

go語(yǔ)言postgresql數(shù)據(jù)庫(kù)驅(qū)動(dòng)怎么用

PostgreSQL和MySQL比較,它更加龐大一點(diǎn),因?yàn)樗怯脕?lái)替代Oracle而設(shè)計(jì)的。所以在企業(yè)應(yīng)用中采用PostgreSQL是一個(gè)明智的選擇。

現(xiàn)在MySQL被Oracle收購(gòu)之后,有傳聞Oracle正在逐步的封閉MySQL,,鑒于此,將來(lái)我們也許會(huì)選擇PostgreSQL而不是MySQL作為項(xiàng)目的后端數(shù)據(jù)庫(kù)。

1、驅(qū)動(dòng)

Go實(shí)現(xiàn)的支持PostgreSQL的驅(qū)動(dòng)也很多,因?yàn)閲?guó)外很多人在開(kāi)發(fā)中使用了這個(gè)數(shù)據(jù)庫(kù)。

支持database/sql驅(qū)動(dòng),純Go寫(xiě)的

支持database/sql驅(qū)動(dòng),純Go寫(xiě)的

支持database/sql驅(qū)動(dòng),純Go寫(xiě)的

在下面的示例中我采用了第一個(gè)驅(qū)動(dòng),因?yàn)樗壳笆褂玫娜俗疃?,在github上也比較活躍。

2、實(shí)例代碼

數(shù)據(jù)庫(kù)建表語(yǔ)句:

復(fù)制代碼

CREATE TABLE userinfo

(

uid serial NOT NULL,

username character varying(100) NOT NULL,

departname character varying(500) NOT NULL,

Created date,

CONSTRAINT userinfo_pkey PRIMARY KEY (uid)

)

WITH (OIDS=FALSE);

CREATE TABLE userdeatail

(

uid integer,

intro character varying(100),

profile character varying(100)

)

WITH(OIDS=FALSE);

復(fù)制代碼

看下面這個(gè)Go如何操作數(shù)據(jù)庫(kù)表數(shù)據(jù):增刪改查

復(fù)制代碼

package main

import (

"database/sql"

"fmt"

_ "github.com/bmizerany/pq"

)

func main() {

db, err := sql.Open("postgres", "user=astaxie password=astaxie dbname=test sslmode=disable")

checkErr(err)

//插入數(shù)據(jù)

stmt, err := db.Prepare("INSERT INTO userinfo(username,departname,created) VALUES($1,$2,$3) RETURNING uid")

checkErr(err)

res, err := stmt.Exec("astaxie", "研發(fā)部門(mén)", "2012-12-09")

checkErr(err)

//pg不支持這個(gè)函數(shù),因?yàn)樗麤](méi)有類似MySQL的自增ID

id, err := res.LastInsertId()

checkErr(err)

fmt.Println(id)

//更新數(shù)據(jù)

stmt, err = db.Prepare("update userinfo set username=$1 where uid=$2")

checkErr(err)

res, err = stmt.Exec("astaxieupdate", 1)

checkErr(err)

affect, err := res.RowsAffected()

checkErr(err)

fmt.Println(affect)

//查詢數(shù)據(jù)

rows, err := db.Query("SELECT * FROM userinfo")

checkErr(err)

for rows.Next() {

var uid int

var username string

var department string

var created string

err = rows.Scan(uid, username, department, created)

checkErr(err)

fmt.Println(uid)

fmt.Println(username)

fmt.Println(department)

fmt.Println(created)

}

//刪除數(shù)據(jù)

stmt, err = db.Prepare("delete from userinfo where uid=$1")

checkErr(err)

res, err = stmt.Exec(1)

checkErr(err)

affect, err = res.RowsAffected()

checkErr(err)

fmt.Println(affect)

db.Close()

}

func checkErr(err error) {

if err != nil {

panic(err)

}

}

復(fù)制代碼

從上面的代碼我們可以看到,PostgreSQL是通過(guò)$1,$2這種方式來(lái)指定要傳遞的參數(shù),而不是MySQL中的?,另外在sql.Open中的dsn信息的格式也與MySQL的驅(qū)動(dòng)中的dsn格式不一樣,所以在使用時(shí)請(qǐng)注意它們的差異。

還有pg不支持LastInsertId函數(shù),因?yàn)镻ostgreSQL內(nèi)部沒(méi)有實(shí)現(xiàn)類似MySQL的自增ID返回,其他的代碼幾乎是一模一樣

GO語(yǔ)言(三十):訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù)(上)

本教程介紹了使用 Godatabase/sql及其標(biāo)準(zhǔn)庫(kù)中的包訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。

您將使用的database/sql包包括用于連接數(shù)據(jù)庫(kù)、執(zhí)行事務(wù)、取消正在進(jìn)行的操作等的類型和函數(shù)。

在本教程中,您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),然后編寫(xiě)代碼來(lái)訪問(wèn)該數(shù)據(jù)庫(kù)。您的示例項(xiàng)目將是有關(guān)老式爵士樂(lè)唱片的數(shù)據(jù)存儲(chǔ)庫(kù)。

首先,為您要編寫(xiě)的代碼創(chuàng)建一個(gè)文件夾。

1、打開(kāi)命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 data-access 的目錄。

3、創(chuàng)建一個(gè)模塊,您可以在其中管理將在本教程中添加的依賴項(xiàng)。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

此命令創(chuàng)建一個(gè) go.mod 文件,您添加的依賴項(xiàng)將在其中列出以供跟蹤。

注意: 在實(shí)際開(kāi)發(fā)中,您會(huì)指定一個(gè)更符合您自己需求的模塊路徑。有關(guān)更多信息,請(qǐng)參閱一下文章。

GO語(yǔ)言(二十五):管理依賴項(xiàng)(上)

GO語(yǔ)言(二十六):管理依賴項(xiàng)(中)

GO語(yǔ)言(二十七):管理依賴項(xiàng)(下)

接下來(lái),您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

在此步驟中,您將創(chuàng)建要使用的數(shù)據(jù)庫(kù)。您將使用 DBMS 本身的 CLI 創(chuàng)建數(shù)據(jù)庫(kù)和表,以及添加數(shù)據(jù)。

您將創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),其中包含有關(guān)黑膠唱片上的老式爵士樂(lè)錄音的數(shù)據(jù)。

這里的代碼使用MySQL CLI,但大多數(shù) DBMS 都有自己的 CLI,具有類似的功能。

1、打開(kāi)一個(gè)新的命令提示符。

在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。

2、在mysql命令提示符下,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。

3、切到您剛剛創(chuàng)建的數(shù)據(jù)庫(kù),以便您可以添加表。

4、在文本編輯器的 data-access 文件夾中,創(chuàng)建一個(gè)名為 create-tables.sql 的文件來(lái)保存用于添加表的 SQL 腳本。

將以下 SQL 代碼粘貼到文件中,然后保存文件。

在此 SQL 代碼中:

(1)刪除名為album表。 首先執(zhí)行此命令可以讓您更輕松地稍后重新運(yùn)行腳本。

(2)創(chuàng)建一個(gè)album包含四列的表:title、artist和price。每行的id值由 DBMS 自動(dòng)創(chuàng)建。

(3)添加帶有值的四行。

5、在mysql命令提示符下,運(yùn)行您剛剛創(chuàng)建的腳本。

您將使用以下形式的source命令:

6、在 DBMS 命令提示符處,使用SELECT語(yǔ)句來(lái)驗(yàn)證您是否已成功創(chuàng)建包含數(shù)據(jù)的表。

接下來(lái),您將編寫(xiě)一些 Go 代碼進(jìn)行連接,以便進(jìn)行查詢。

現(xiàn)在你已經(jīng)有了一個(gè)包含一些數(shù)據(jù)的數(shù)據(jù)庫(kù),開(kāi)始你的 Go 代碼。

找到并導(dǎo)入一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序會(huì)將您通過(guò)database/sql包中的函數(shù)發(fā)出的請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)可以理解的請(qǐng)求。

1、在您的瀏覽器中,訪問(wèn)SQLDrivers wiki 頁(yè)面以識(shí)別您可以使用的驅(qū)動(dòng)程序。

2、使用頁(yè)面上的列表來(lái)識(shí)別您將使用的驅(qū)動(dòng)程序。為了在本教程中訪問(wèn) MySQL,您將使用 Go-MySQL-Driver。

3、請(qǐng)注意驅(qū)動(dòng)程序的包名稱 - 此處為github.com/go-sql-driver/mysql.

4、使用您的文本編輯器,創(chuàng)建一個(gè)用于編寫(xiě) Go 代碼的文件,并將該文件作為 main.go 保存在您之前創(chuàng)建的數(shù)據(jù)訪問(wèn)目錄中。

5、進(jìn)入main.go,粘貼以下代碼導(dǎo)入驅(qū)動(dòng)包。

在此代碼中:

(1)將您的代碼添加到main包中,以便您可以獨(dú)立執(zhí)行它。

(2)導(dǎo)入 MySQL 驅(qū)動(dòng)程序github.com/go-sql-driver/mysql。

導(dǎo)入驅(qū)動(dòng)程序后,您將開(kāi)始編寫(xiě)代碼以訪問(wèn)數(shù)據(jù)庫(kù)。

現(xiàn)在編寫(xiě)一些 Go 代碼,讓您使用數(shù)據(jù)庫(kù)句柄訪問(wèn)數(shù)據(jù)庫(kù)。

您將使用指向結(jié)構(gòu)的指針sql.DB,它表示對(duì)特定數(shù)據(jù)庫(kù)的訪問(wèn)。

編寫(xiě)代碼

1、進(jìn)入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創(chuàng)建數(shù)據(jù)庫(kù)句柄。

在此代碼中:

(3)使用 MySQL 驅(qū)動(dòng)程序Config和FormatDSN類型以收集連接屬性并將它們格式化為連接字符串的 DSN。

該Config結(jié)構(gòu)使代碼比連接字符串更容易閱讀。

(4)調(diào)用sql.Open 初始化db變量,傳遞 FormatDSN。

(5)檢查來(lái)自 的錯(cuò)誤sql.Open。例如,如果您的數(shù)據(jù)庫(kù)連接細(xì)節(jié)格式不正確,它可能會(huì)失敗。

為了簡(jiǎn)化代碼,您調(diào)用log.Fatal結(jié)束執(zhí)行并將錯(cuò)誤打印到控制臺(tái)。在生產(chǎn)代碼中,您會(huì)希望以更優(yōu)雅的方式處理錯(cuò)誤。

(6)調(diào)用DB.Ping以確認(rèn)連接到數(shù)據(jù)庫(kù)有效。在運(yùn)行時(shí), sql.Open可能不會(huì)立即連接,具體取決于驅(qū)動(dòng)程序。您在Ping此處使用以確認(rèn) database/sql包可以在需要時(shí)連接。

(7)檢查來(lái)自Ping的錯(cuò)誤,以防連接失敗。

(8)Ping如果連接成功,則打印一條消息。

文件的頂部現(xiàn)在應(yīng)該如下所示:

3、保存 main.go。

1、開(kāi)始跟蹤 MySQL 驅(qū)動(dòng)程序模塊作為依賴項(xiàng)。

使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項(xiàng)。使用點(diǎn)參數(shù)表示“獲取當(dāng)前目錄中代碼的依賴項(xiàng)”。

2、在命令提示符下,設(shè)置Go 程序使用的DBUSER和DBPASS環(huán)境變量。

在 Linux 或 Mac 上:

在 Windows 上:

3、在包含 main.go 的目錄中的命令行中,通過(guò)鍵入go run來(lái)運(yùn)行代碼。

連接成功了!

接下來(lái),您將查詢一些數(shù)據(jù)。

文章標(biāo)題:go語(yǔ)言使用jdbc驅(qū)動(dòng) golang jdbc
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article22/hejpcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、域名注冊(cè)、靜態(tài)網(wǎng)站網(wǎng)站收錄、微信公眾號(hào)營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
旺苍县| 迁安市| 普安县| 龙川县| 汶上县| 都兰县| 绍兴县| 金沙县| 富顺县| 青川县| 瑞金市| 乌兰察布市| 仪陇县| 越西县| 漳浦县| 新营市| 贞丰县| 利辛县| 太原市| 平昌县| 余江县| 北川| 绥德县| 新密市| 徐水县| 四会市| 游戏| 措美县| 崇礼县| 汉川市| 米易县| 泽库县| 台中县| 东光县| 城市| 肃北| 明水县| 陈巴尔虎旗| 竹山县| 闵行区| 广平县|