JDBC连接MySQL数据库及演示样例
JDBC是Sun公司制定的一個(gè)能夠用Java語(yǔ)言連接數(shù)據(jù)庫(kù)的技術(shù)。
一、JDBC基礎(chǔ)知識(shí) ? ? ? ?
? ? ? ? JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,能夠?yàn)槎喾N關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪問(wèn),它由一組用Java語(yǔ)言編寫的類和接口組成。JDBC為數(shù)據(jù)庫(kù)開(kāi)發(fā)者提供了一個(gè)標(biāo)準(zhǔn)的API,據(jù)此能夠構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)者能夠用純 Java API 編寫數(shù)據(jù)庫(kù)應(yīng)用程序,而且可跨平臺(tái)執(zhí)行,而且不受數(shù)據(jù)庫(kù)供應(yīng)商的限制。
1、跨平臺(tái)執(zhí)行:這是繼承了Java語(yǔ)言的“一次編譯,到處執(zhí)行”的特點(diǎn);
2、不受數(shù)據(jù)庫(kù)供應(yīng)商的限制:巧妙在于JDBC設(shè)有兩種接口,一個(gè)是面向應(yīng)用程序?qū)?#xff0c;其作用是使得開(kāi)發(fā)者通過(guò)SQL調(diào)用數(shù)據(jù)庫(kù)和處理結(jié)果,而不須要考慮數(shù)據(jù)庫(kù)的提供商;還有一個(gè)是驅(qū)動(dòng)程序?qū)?#xff0c;處理與詳細(xì)驅(qū)動(dòng)程序的交互,JDBC驅(qū)動(dòng)程序能夠利用JDBC API創(chuàng)建Java程序和數(shù)據(jù)源之間的橋梁。應(yīng)用程序僅僅須要編寫一次,便能夠移到各種驅(qū)動(dòng)程序上執(zhí)行。Sun提供了一個(gè)驅(qū)動(dòng)管理器,數(shù)據(jù)庫(kù)供應(yīng)商——如MySQL、Oracle,提供的驅(qū)動(dòng)程序滿足驅(qū)動(dòng)管理器的要求就能夠被識(shí)別,就能夠正常工作。所以JDBC不受數(shù)據(jù)庫(kù)供應(yīng)商的限制。
? ? ? ? JDBC API能夠作為連接Java應(yīng)用程序與各種關(guān)系數(shù)據(jù)庫(kù)的紐帶,在帶來(lái)方便的同一時(shí)候也有負(fù)面影響,下面是JDBC的優(yōu)、缺點(diǎn)。長(zhǎng)處例如以下:
- 操作便捷:JDBC使得開(kāi)發(fā)者不須要再使用復(fù)雜的驅(qū)動(dòng)器調(diào)用命令和函數(shù);
- 可移植性強(qiáng):JDBC支持不同的關(guān)系數(shù)據(jù)庫(kù),所以能夠使同一個(gè)應(yīng)用程序支持多個(gè)數(shù)據(jù)庫(kù)的訪問(wèn),僅僅要載入對(duì)應(yīng)的驅(qū)動(dòng)程序就可以;
- 通用性好:JDBC-ODBC橋接驅(qū)動(dòng)器將JDBC函數(shù)換成ODBC;
- 面向?qū)ο?#xff1a;能夠?qū)⒔?jīng)常使用的JDBC數(shù)據(jù)庫(kù)連接封裝成一個(gè)類,在使用的時(shí)候直接調(diào)用就可以。
? ? ? ? 缺點(diǎn)例如以下:
- 訪問(wèn)數(shù)據(jù)記錄的速度受到一定程度的影響;
- 更改數(shù)據(jù)源困難:JDBC可支持多種數(shù)據(jù)庫(kù),各種數(shù)據(jù)庫(kù)之間的操作必有不同,這就給更改數(shù)據(jù)源帶來(lái)了非常大的麻煩
二、JDBC連接數(shù)據(jù)庫(kù)的流程及其原理
1、在開(kāi)發(fā)環(huán)境中載入指定數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序。比如,接下來(lái)的實(shí)驗(yàn)中,使用的數(shù)據(jù)庫(kù)是MySQL,所以須要去下載MySQL支持JDBC的驅(qū)動(dòng)程序(最新的是:mysql-connector-java-5.1.18-bin.jar);而開(kāi)發(fā)環(huán)境是MyEclipse,將下載得到的驅(qū)動(dòng)程序載入進(jìn)開(kāi)發(fā)環(huán)境中(詳細(xì)演示樣例的時(shí)候會(huì)解說(shuō)怎樣載入)。
2、在Java程序中載入驅(qū)動(dòng)程序。在Java程序中,能夠通過(guò)?“Class.forName(“指定數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序”)” 方式來(lái)載入加入到開(kāi)發(fā)環(huán)境中的驅(qū)動(dòng)程序,比如載入MySQL的數(shù)據(jù)驅(qū)動(dòng)程序的代碼為: ?Class.forName(“com.mysql.jdbc.Driver”)
3、創(chuàng)建數(shù)據(jù)連接對(duì)象:通過(guò)DriverManager類創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象Connection。DriverManager類作用于Java程序和JDBC驅(qū)動(dòng)程序之間,用于檢查所載入的驅(qū)動(dòng)程序能否夠建立連接,然后通過(guò)它的getConnection方法,依據(jù)數(shù)據(jù)庫(kù)的URL、username和password,創(chuàng)建一個(gè)JDBC Connection 對(duì)象。如:Connection connection = ?DriverManager.geiConnection(“連接數(shù)據(jù)庫(kù)的URL", "username", "password”)。當(dāng)中,URL=協(xié)議名+IP地址(域名)+port+數(shù)據(jù)庫(kù)名稱;username和password是指登錄數(shù)據(jù)庫(kù)時(shí)所使用的username和password。詳細(xì)演示樣例創(chuàng)建MySQL的數(shù)據(jù)庫(kù)連接代碼例如以下:
? ? ? ? ? ? ? Connection connectMySQL ?= ?DriverManager.geiConnection(“jdbc:mysql://localhost:3306/myuser","root" ,"root" );
4、創(chuàng)建Statement對(duì)象:Statement 類的主要是用于運(yùn)行靜態(tài) SQL 語(yǔ)句并返回它所生成結(jié)果的對(duì)象。通過(guò)Connection 對(duì)象的 createStatement()方法能夠創(chuàng)建一個(gè)Statement對(duì)象。比如:Statement statament = connection.createStatement();?詳細(xì)演示樣例創(chuàng)建Statement對(duì)象代碼例如以下:
? ? ? ? ? ? ?Statement statamentMySQL =connectMySQL.createStatement();?
5、調(diào)用Statement對(duì)象的相關(guān)方法運(yùn)行相相應(yīng)的 SQL 語(yǔ)句:通過(guò)execuUpdate()方法用來(lái)數(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' ) ") ;?
通過(guò)調(diào)用Statement對(duì)象的executeQuery()方法進(jìn)行數(shù)據(jù)的查詢,而查詢結(jié)果會(huì)得到 ResulSet對(duì)象,ResulSet表示運(yùn)行查詢數(shù)據(jù)庫(kù)后返回的數(shù)據(jù)的集合,ResulSet對(duì)象具有能夠指向當(dāng)前數(shù)據(jù)行的指針。通過(guò)該對(duì)象的next()方法,使得指針指向下一行,然后將數(shù)據(jù)以列號(hào)或者字段名取出。假設(shè)當(dāng)next()方法返回null,則表示下一行中沒(méi)有數(shù)據(jù)存在。使用演示樣例代碼例如以下:
? ? ? ?ResultSet resultSel = statement.executeQuery(?"select * from staff"?);
6、關(guān)閉數(shù)據(jù)庫(kù)連接:使用完數(shù)據(jù)庫(kù)或者不須要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),通過(guò)Connection的close()?方法及時(shí)關(guān)閉數(shù)據(jù)連接。
三、JDBC應(yīng)用演示樣例實(shí)驗(yàn)
實(shí)驗(yàn)內(nèi)容:使用phpMyAdmin在MySQL中創(chuàng)建數(shù)據(jù)庫(kù)(myuser),并加入實(shí)驗(yàn)所需的數(shù)據(jù)(新建staff表,加入一些記錄);編寫Java程序,利用JDBC連接在MySQL中創(chuàng)建好的數(shù)據(jù)庫(kù)(myuser),對(duì)staff表格進(jìn)行插入、更新、刪除和查詢等操作。
實(shí)驗(yàn)環(huán)境及開(kāi)發(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)過(guò)程及步驟:
? ? ? ? 1、下載MySQL支持JDBC的驅(qū)動(dòng)程序:假設(shè)已經(jīng)有了,可跳過(guò)這一步。前往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 跟著站點(diǎn)的引導(dǎo)進(jìn)行下載。打開(kāi)下載得到的壓縮包(mysql-connector-java-5.1.18.zip),將當(dāng)中的Java包(mysql-connector-java-5.1.18-bin.jar),拷貝到MySQL文件夾下(僅是為了方便才放到這里),以備載入驅(qū)動(dòng)程序時(shí)使用。
? ? ? ? 2、創(chuàng)建數(shù)據(jù)庫(kù):使用phpMyAdmin,登錄MySQL,創(chuàng)建數(shù)據(jù)庫(kù)myuser,并在當(dāng)中插入一個(gè)名為staff的表格。并加入一些數(shù)據(jù),操作步驟如圖,登錄進(jìn)去MySQL數(shù)據(jù)庫(kù)后:
? ? ? ? ? ? ? ?1)創(chuàng)建數(shù)據(jù)庫(kù),名稱為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)加入到project的Build path中,加入過(guò)程如圖所看到的:
? ? ? ? 4、編寫JDBC連接MySQL數(shù)據(jù)庫(kù)的實(shí)例詳細(xì)代碼,JDBC_Test.java:
詳細(xì)代碼:
<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ù)庫(kù)try {String sql = "INSERT INTO staff(name, age, sex,address, depart, worklen,wage)"+ " VALUES ('Tom1', 32, 'M', 'china','Personnel','3','3000')"; // 插入數(shù)據(jù)的sql語(yǔ)句st = (Statement) conn.createStatement(); // 創(chuàng)建用于運(yùn)行靜態(tài)sql語(yǔ)句的Statement對(duì)象int count = st.executeUpdate(sql); // 運(yùn)行插入操作的sql語(yǔ)句,并返回插入數(shù)據(jù)的個(gè)數(shù)System.out.println("向staff表中插入 " + count + " 條數(shù)據(jù)"); //輸出插入操作的處理結(jié)果conn.close(); //關(guān)閉數(shù)據(jù)庫(kù)連接} catch (SQLException e) {System.out.println("插入數(shù)據(jù)失敗" + e.getMessage());}}/* 更新符合要求的記錄,并返回更新的記錄數(shù)目*/public static void update() {conn = getConnection(); //相同先要獲取連接,即連接到數(shù)據(jù)庫(kù)try {String sql = "update staff set wage='2200' where name = 'lucy'";// 更新數(shù)據(jù)的sql語(yǔ)句st = (Statement) conn.createStatement(); //創(chuàng)建用于運(yùn)行靜態(tài)sql語(yǔ)句的Statement對(duì)象,st屬局部變量int count = st.executeUpdate(sql);// 運(yùn)行更新操作的sql語(yǔ)句,返回更新數(shù)據(jù)的個(gè)數(shù)System.out.println("staff表中更新 " + count + " 條數(shù)據(jù)"); //輸出更新操作的處理結(jié)果conn.close(); //關(guān)閉數(shù)據(jù)庫(kù)連接} catch (SQLException e) {System.out.println("更新數(shù)據(jù)失敗");}}/* 查詢數(shù)據(jù)庫(kù),輸出符合要求的記錄的情況*/public static void query() {conn = getConnection(); //相同先要獲取連接,即連接到數(shù)據(jù)庫(kù)try {String sql = "select * from staff"; // 查詢數(shù)據(jù)的sql語(yǔ)句st = (Statement) conn.createStatement(); //創(chuàng)建用于運(yùn)行靜態(tài)sql語(yǔ)句的Statement對(duì)象,st屬局部變量ResultSet rs = st.executeQuery(sql); //運(yùn)行sql查詢語(yǔ)句,返回查詢數(shù)據(jù)的結(jié)果集System.out.println("最后的查詢結(jié)果為:");while (rs.next()) { // 推斷是否還有下一個(gè)數(shù)據(jù)// 依據(jù)字段名獲取對(duì)應(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ù)庫(kù)連接} catch (SQLException e) {System.out.println("查詢數(shù)據(jù)失敗");}}/* 刪除符合要求的記錄,輸出情況*/public static void delete() {conn = getConnection(); //相同先要獲取連接,即連接到數(shù)據(jù)庫(kù)try {String sql = "delete from staff where name = 'lili'";// 刪除數(shù)據(jù)的sql語(yǔ)句st = (Statement) conn.createStatement(); //創(chuàng)建用于運(yùn)行靜態(tài)sql語(yǔ)句的Statement對(duì)象,st屬局部變量int count = st.executeUpdate(sql);// 運(yùn)行sql刪除語(yǔ)句,返回刪除數(shù)據(jù)的數(shù)量System.out.println("staff表中刪除 " + count + " 條數(shù)據(jù)\n"); //輸出刪除操作的處理結(jié)果conn.close(); //關(guān)閉數(shù)據(jù)庫(kù)連接} catch (SQLException e) {System.out.println("刪除數(shù)據(jù)失敗");}}/* 獲取數(shù)據(jù)庫(kù)連接的函數(shù)*/public static Connection getConnection() {Connection con = null; //創(chuàng)建用于連接數(shù)據(jù)庫(kù)的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ù)庫(kù)連接失敗" + e.getMessage());}return con; //返回所建立的數(shù)據(jù)庫(kù)連接}
}
項(xiàng)目部署到server,然后執(zhí)行結(jié)果:
http://www.5678520.com/kaiwangdian/130.html?
http://www.5678520.com/kaiwangdian/129.html?
http://www.5678520.com/kaiwangdian/128.html?
http://www.5678520.com/kaiwangdian/127.html?
http://www.5678520.com/kaiwangdian/126.html?
http://www.lianzhiwei.com/News/389/20122116.html?
http://www.lianzhiwei.com/News/389/20122115.html?
http://www.lianzhiwei.com/News/389/20122114.html?
http://www.lianzhiwei.com/News/389/20122113.html?
http://www.lianzhiwei.com/News/389/20122112.html?
轉(zhuǎn)載于:https://www.cnblogs.com/mfrbuaa/p/4003567.html
總結(jié)
以上是生活随笔為你收集整理的JDBC连接MySQL数据库及演示样例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 标头“Vary:Accept-Encod
- 下一篇: 麋鹿妆换幽静妆谁亏,急~