日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

JDBC连接MySQL数据库及示例

發(fā)布時(shí)間:2023/12/15 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC连接MySQL数据库及示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JDBC是Sun公司制定的一個(gè)可以用Java語言連接數(shù)據(jù)庫的技術(shù)。

一、JDBC基礎(chǔ)知識(shí) ? ? ? ?

? ? ? ? JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC為數(shù)據(jù)庫開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠用純 Java API 編寫數(shù)據(jù)庫應(yīng)用程序,并且可跨平臺(tái)運(yùn)行,并且不受數(shù)據(jù)庫供應(yīng)商的限制。

1、跨平臺(tái)運(yùn)行:這是繼承了Java語言的“一次編譯,到處運(yùn)行”的特點(diǎn);

2、不受數(shù)據(jù)庫供應(yīng)商的限制:巧妙在于JDBC設(shè)有兩種接口,一個(gè)是面向應(yīng)用程序?qū)?#xff0c;其作用是使得開發(fā)人員通過SQL調(diào)用數(shù)據(jù)庫和處理結(jié)果,而不需要考慮數(shù)據(jù)庫的提供商;另一個(gè)是驅(qū)動(dòng)程序?qū)?#xff0c;處理與具體驅(qū)動(dòng)程序的交互,JDBC驅(qū)動(dòng)程序可以利用JDBC API創(chuàng)建Java程序和數(shù)據(jù)源之間的橋梁。應(yīng)用程序只需要編寫一次,便可以移到各種驅(qū)動(dòng)程序上運(yùn)行。Sun提供了一個(gè)驅(qū)動(dòng)管理器,數(shù)據(jù)庫供應(yīng)商——如MySQL、Oracle,提供的驅(qū)動(dòng)程序滿足驅(qū)動(dòng)管理器的要求就可以被識(shí)別,就可以正常工作。所以JDBC不受數(shù)據(jù)庫供應(yīng)商的限制。


? ? ? ? JDBC API可以作為連接Java應(yīng)用程序與各種關(guān)系數(shù)據(jù)庫的紐帶,在帶來方便的同時(shí)也有負(fù)面影響,以下是JDBC的優(yōu)、缺點(diǎn)。優(yōu)點(diǎn)如下:

  • 操作便捷:JDBC使得開發(fā)人員不需要再使用復(fù)雜的驅(qū)動(dòng)器調(diào)用命令和函數(shù);
  • 可移植性強(qiáng):JDBC支持不同的關(guān)系數(shù)據(jù)庫,所以可以使同一個(gè)應(yīng)用程序支持多個(gè)數(shù)據(jù)庫的訪問,只要加載相應(yīng)的驅(qū)動(dòng)程序即可;
  • 通用性好:JDBC-ODBC橋接驅(qū)動(dòng)器將JDBC函數(shù)換成ODBC;
  • 面向?qū)ο?#xff1a;可以將常用的JDBC數(shù)據(jù)庫連接封裝成一個(gè)類,在使用的時(shí)候直接調(diào)用即可。

? ? ??? 缺點(diǎn)如下:

  • 訪問數(shù)據(jù)記錄的速度受到一定程度的影響;
  • 更改數(shù)據(jù)源困難:JDBC可支持多種數(shù)據(jù)庫,各種數(shù)據(jù)庫之間的操作必有不同,這就給更改數(shù)據(jù)源帶來了很大的麻煩


二、JDBC連接數(shù)據(jù)庫的流程及其原理

1、在開發(fā)環(huán)境中加載指定數(shù)據(jù)庫的驅(qū)動(dòng)程序。例如,接下來的實(shí)驗(yàn)中,使用的數(shù)據(jù)庫是MySQL,所以需要去下載MySQL支持JDBC的驅(qū)動(dòng)程序(最新的是:mysql-connector-java-5.1.18-bin.jar);而開發(fā)環(huán)境是MyEclipse,將下載得到的驅(qū)動(dòng)程序加載進(jìn)開發(fā)環(huán)境中(具體示例的時(shí)候會(huì)講解如何加載)。


2、在Java程序中加載驅(qū)動(dòng)程序。在Java程序中,可以通過?“Class.forName(“指定數(shù)據(jù)庫的驅(qū)動(dòng)程序”)” 方式來加載添加到開發(fā)環(huán)境中的驅(qū)動(dòng)程序,例如加載MySQL的數(shù)據(jù)驅(qū)動(dòng)程序的代碼為: ?Class.forName(“com.mysql.jdbc.Driver”)


3、創(chuàng)建數(shù)據(jù)連接對(duì)象:通過DriverManager類創(chuàng)建數(shù)據(jù)庫連接對(duì)象ConnectionDriverManager類作用于Java程序和JDBC驅(qū)動(dòng)程序之間,用于檢查所加載的驅(qū)動(dòng)程序是否可以建立連接,然后通過它的getConnection方法,根據(jù)數(shù)據(jù)庫的URL、用戶名和密碼,創(chuàng)建一個(gè)JDBC Connection 對(duì)象。如:Connection connection = ?DriverManager.geiConnection(“連接數(shù)據(jù)庫的URL", "用戶名", "密碼”)。其中,URL=協(xié)議名+IP地址(域名)+端口+數(shù)據(jù)庫名稱;用戶名和密碼是指登錄數(shù)據(jù)庫時(shí)所使用的用戶名和密碼。具體示例創(chuàng)建MySQL的數(shù)據(jù)庫連接代碼如下:

? ? ? ? ? ? ? Connection connectMySQL ?= ?DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );


4、創(chuàng)建Statement對(duì)象:Statement 類的主要是用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對(duì)象。通過Connection 對(duì)象的 createStatement()方法可以創(chuàng)建一個(gè)Statement對(duì)象。例如:Statement statament = connection.createStatement();?具體示例創(chuàng)建Statement對(duì)象代碼如下:

? ? ? ? ? ? ?Statement statamentMySQL =connectMySQL.createStatement();?


5、調(diào)用Statement對(duì)象的相關(guān)方法執(zhí)行相對(duì)應(yīng)的 SQL 語句:通過execuUpdate()方法用來數(shù)據(jù)的更新,包括插入和刪除等操作,例如向staff表中插入一條數(shù)據(jù)的代碼:

? ? ? ?statement.excuteUpdate(?"INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"?+ " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ") ;?

通過調(diào)用Statement對(duì)象的executeQuery()方法進(jìn)行數(shù)據(jù)的查詢,而查詢結(jié)果會(huì)得到 ResulSet對(duì)象,ResulSet表示執(zhí)行查詢數(shù)據(jù)庫后返回的數(shù)據(jù)的集合,ResulSet對(duì)象具有可以指向當(dāng)前數(shù)據(jù)行的指針。通過該對(duì)象的next()方法,使得指針指向下一行,然后將數(shù)據(jù)以列號(hào)或者字段名取出。如果當(dāng)next()方法返回null,則表示下一行中沒有數(shù)據(jù)存在。使用示例代碼如下:

? ? ? ?ResultSet resultSel = statement.executeQuery(?"select * from staff"?);


6、關(guān)閉數(shù)據(jù)庫連接:使用完數(shù)據(jù)庫或者不需要訪問數(shù)據(jù)庫時(shí),通過Connection的close()?方法及時(shí)關(guān)閉數(shù)據(jù)連接。


三、JDBC應(yīng)用示例實(shí)驗(yàn)

實(shí)驗(yàn)內(nèi)容:使用phpMyAdmin在MySQL中創(chuàng)建數(shù)據(jù)庫(myuser),并添加實(shí)驗(yàn)所需的數(shù)據(jù)(新建staff表,添加一些記錄);編寫Java程序,利用JDBC連接在MySQL中創(chuàng)建好的數(shù)據(jù)庫(myuser),對(duì)staff表格進(jìn)行插入、更新、刪除和查詢等操作。

實(shí)驗(yàn)環(huán)境及開發(fā)工具:Win7操作系統(tǒng);jdk1.6.0_26;XAMPP1.7.7(MySQL 5.1,??phpMyAdmin);MyEclipse 8.5

實(shí)驗(yàn)環(huán)境的搭建:可參考我的博客

  • Java環(huán)境搭配:http://blog.csdn.net/cxwen78/article/details/6400798;
  • windows系統(tǒng)XAMPP安裝配置使用:http://blog.csdn.net/cxwen78/article/details/6847927


實(shí)驗(yàn)過程及步驟:

? ? ??? 1、下載MySQL支持JDBC的驅(qū)動(dòng)程序:如果已經(jīng)有了,可跳過這一步。前往MySQL官網(wǎng)(http://www.mysql.com/products/connector/?)下載驅(qū)動(dòng)程序,,MySQL針對(duì)不同的平臺(tái)提供了不同的連接器,我們需要的是DBC Driver for MySQL (Connector/J),如下圖所示,點(diǎn)擊 Download 跟著網(wǎng)站的引導(dǎo)進(jìn)行下載。打開下載得到的壓縮包(mysql-connector-java-5.1.18.zip),將其中的Java包(mysql-connector-java-5.1.18-bin.jar),復(fù)制到MySQL目錄下(僅是為了方便才放到這里),以備加載驅(qū)動(dòng)程序時(shí)使用。







? ? ? ??2、創(chuàng)建數(shù)據(jù)庫:使用phpMyAdmin,登錄MySQL,創(chuàng)建數(shù)據(jù)庫myuser,并在其中插入一個(gè)名為staff的表格。并添加一些數(shù)據(jù),操作步驟如圖,登錄進(jìn)去MySQL數(shù)據(jù)庫后:

? ? ? ? ? ? ? ?1)創(chuàng)建數(shù)據(jù)庫,名稱為myuser,編碼為utf8_general_ci(支持中文);


? ? ? ? ? ? ? 2)新建表格,名稱為staff,表格有8個(gè)字段;

? ? ? ? ? ? ? ? ? 3)8個(gè)字段的設(shè)置,包括名稱、類型、值的長(zhǎng)度、初始值、編碼等等(點(diǎn)擊查看大圖);


? ? ? ? ? ? ? ? 4)添加成功后,查看的staff表格情況:


? ? ? ? ? ? ? ??5)往表格中插入一些實(shí)驗(yàn)所需數(shù)據(jù),需要插入兩條,一個(gè)是員工lucy的,還有lili的:




? ? ??? 3、在MyEclips中創(chuàng)建項(xiàng)目并在項(xiàng)目中添加MySQL驅(qū)動(dòng)程序:創(chuàng)建的項(xiàng)目類型可以是Java項(xiàng)目或者是Java Web項(xiàng)目都可以。這里創(chuàng)建的是Web項(xiàng)目,項(xiàng)目名稱可以隨便取,我命名為“JavaWebChp07”。創(chuàng)建成功后將步驟1里下載得到的MySQL驅(qū)動(dòng)程序包(mysql-connector-java-5.1.18-bin.jar)添加到工程的Build path中,添加過程如圖所示:








? ? ? ??4、編寫JDBC連接MySQL數(shù)據(jù)庫的實(shí)例具體代碼,JDBC_Test.java:



具體代碼:

[java]?view plaincopy
  • <pre?name="code"?class="java">package?chp07;??
  • ??
  • import?java.sql.Connection;??
  • import?java.sql.DriverManager;??
  • import?java.sql.ResultSet;??
  • import?java.sql.SQLException;??
  • import?java.sql.Statement;??
  • ??
  • public?class?JDBC_Test?{??
  • ????//?創(chuàng)建靜態(tài)全局變量??
  • ????static?Connection?conn;??
  • ??
  • ????static?Statement?st;??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????insert();???//插入添加記錄??
  • ????????update();???//更新記錄數(shù)據(jù)??
  • ????????delete();???//刪除記錄??
  • ????????query();????//查詢記錄并顯示??
  • ????}??
  • ??????
  • ????/*?插入數(shù)據(jù)記錄,并輸出插入的數(shù)據(jù)記錄數(shù)*/??
  • ????public?static?void?insert()?{??
  • ??????????
  • ????????conn?=?getConnection();?//?首先要獲取連接,即連接到數(shù)據(jù)庫??
  • ??
  • ????????try?{??
  • ????????????String?sql?=?"INSERT?INTO?staff(name,?age,?sex,address,?depart,?worklen,wage)"??
  • ????????????????????+?"?VALUES?('Tom1',?32,?'M',?'china','Personnel','3','3000')";??//?插入數(shù)據(jù)的sql語句??
  • ??????????????
  • ????????????st?=?(Statement)?conn.createStatement();????//?創(chuàng)建用于執(zhí)行靜態(tài)sql語句的Statement對(duì)象??
  • ??????????????
  • ????????????int?count?=?st.executeUpdate(sql);??//?執(zhí)行插入操作的sql語句,并返回插入數(shù)據(jù)的個(gè)數(shù)??
  • ??????????????
  • ????????????System.out.println("向staff表中插入?"?+?count?+?"?條數(shù)據(jù)");?//輸出插入操作的處理結(jié)果??
  • ??????????????
  • ????????????conn.close();???//關(guān)閉數(shù)據(jù)庫連接??
  • ??????????????
  • ????????}?catch?(SQLException?e)?{??
  • ????????????System.out.println("插入數(shù)據(jù)失敗"?+?e.getMessage());??
  • ????????}??
  • ????}??
  • ??????
  • ????/*?更新符合要求的記錄,并返回更新的記錄數(shù)目*/??
  • ????public?static?void?update()?{??
  • ????????conn?=?getConnection();?//同樣先要獲取連接,即連接到數(shù)據(jù)庫??
  • ????????try?{??
  • ????????????String?sql?=?"update?staff?set?wage='2200'?where?name?=?'lucy'";//?更新數(shù)據(jù)的sql語句??
  • ??????????????
  • ????????????st?=?(Statement)?conn.createStatement();????//創(chuàng)建用于執(zhí)行靜態(tài)sql語句的Statement對(duì)象,st屬局部變量??
  • ??????????????
  • ????????????int?count?=?st.executeUpdate(sql);//?執(zhí)行更新操作的sql語句,返回更新數(shù)據(jù)的個(gè)數(shù)??
  • ??????????????
  • ????????????System.out.println("staff表中更新?"?+?count?+?"?條數(shù)據(jù)");??????//輸出更新操作的處理結(jié)果??
  • ??????????????
  • ????????????conn.close();???//關(guān)閉數(shù)據(jù)庫連接??
  • ??????????????
  • ????????}?catch?(SQLException?e)?{??
  • ????????????System.out.println("更新數(shù)據(jù)失敗");??
  • ????????}??
  • ????}??
  • ??
  • ????/*?查詢數(shù)據(jù)庫,輸出符合要求的記錄的情況*/??
  • ????public?static?void?query()?{??
  • ??????????
  • ????????conn?=?getConnection();?//同樣先要獲取連接,即連接到數(shù)據(jù)庫??
  • ????????try?{??
  • ????????????String?sql?=?"select?*?from?staff";?????//?查詢數(shù)據(jù)的sql語句??
  • ????????????st?=?(Statement)?conn.createStatement();????//創(chuàng)建用于執(zhí)行靜態(tài)sql語句的Statement對(duì)象,st屬局部變量??
  • ??????????????
  • ????????????ResultSet?rs?=?st.executeQuery(sql);????//執(zhí)行sql查詢語句,返回查詢數(shù)據(jù)的結(jié)果集??
  • ????????????System.out.println("最后的查詢結(jié)果為:");??
  • ????????????while?(rs.next())?{?//?判斷是否還有下一個(gè)數(shù)據(jù)??
  • ??????????????????
  • ????????????????//?根據(jù)字段名獲取相應(yīng)的值??
  • ????????????????String?name?=?rs.getString("name");??
  • ????????????????int?age?=?rs.getInt("age");??
  • ????????????????String?sex?=?rs.getString("sex");??
  • ????????????????String?address?=?rs.getString("address");??
  • ????????????????String?depart?=?rs.getString("depart");??
  • ????????????????String?worklen?=?rs.getString("worklen");??
  • ????????????????String?wage?=?rs.getString("wage");??
  • ??????????????????
  • ????????????????//輸出查到的記錄的各個(gè)字段的值??
  • ????????????????System.out.println(name?+?"?"?+?age?+?"?"?+?sex?+?"?"?+?address??
  • ????????????????????????+?"?"?+?depart?+?"?"?+?worklen?+?"?"?+?wage);??
  • ??????????????
  • ????????????}??
  • ????????????conn.close();???//關(guān)閉數(shù)據(jù)庫連接??
  • ??????????????
  • ????????}?catch?(SQLException?e)?{??
  • ????????????System.out.println("查詢數(shù)據(jù)失敗");??
  • ????????}??
  • ????}??
  • ??
  • ????/*?刪除符合要求的記錄,輸出情況*/??
  • ????public?static?void?delete()?{??
  • ??
  • ????????conn?=?getConnection();?//同樣先要獲取連接,即連接到數(shù)據(jù)庫??
  • ????????try?{??
  • ????????????String?sql?=?"delete?from?staff??where?name?=?'lili'";//?刪除數(shù)據(jù)的sql語句??
  • ????????????st?=?(Statement)?conn.createStatement();????//創(chuàng)建用于執(zhí)行靜態(tài)sql語句的Statement對(duì)象,st屬局部變量??
  • ??????????????
  • ????????????int?count?=?st.executeUpdate(sql);//?執(zhí)行sql刪除語句,返回刪除數(shù)據(jù)的數(shù)量??
  • ??????????????
  • ????????????System.out.println("staff表中刪除?"?+?count?+?"?條數(shù)據(jù)\n");????//輸出刪除操作的處理結(jié)果??
  • ??????????????
  • ????????????conn.close();???//關(guān)閉數(shù)據(jù)庫連接??
  • ??????????????
  • ????????}?catch?(SQLException?e)?{??
  • ????????????System.out.println("刪除數(shù)據(jù)失敗");??
  • ????????}??
  • ??????????
  • ????}??
  • ??????
  • ????/*?獲取數(shù)據(jù)庫連接的函數(shù)*/??
  • ????public?static?Connection?getConnection()?{??
  • ????????Connection?con?=?null;??//創(chuàng)建用于連接數(shù)據(jù)庫的Connection對(duì)象??
  • ????????try?{??
  • ????????????Class.forName("com.mysql.jdbc.Driver");//?加載Mysql數(shù)據(jù)驅(qū)動(dòng)??
  • ??????????????
  • ????????????con?=?DriverManager.getConnection(??
  • ????????????????????"jdbc:mysql://localhost:3306/myuser",?"root",?"root");//?創(chuàng)建數(shù)據(jù)連接??
  • ??????????????
  • ????????}?catch?(Exception?e)?{??
  • ????????????System.out.println("數(shù)據(jù)庫連接失敗"?+?e.getMessage());??
  • ????????}??
  • ????????return?con;?//返回所建立的數(shù)據(jù)庫連接??
  • ????}??
  • }??

  • 項(xiàng)目部署到服務(wù)器,然后運(yùn)行結(jié)果:


    創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的JDBC连接MySQL数据库及示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。