JDBC簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
前言:什么是JDBC
維基百科的簡(jiǎn)介:
Java 數(shù)據(jù)庫連接,(Java Database Connectivity,簡(jiǎn)稱JDBC)是Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫中數(shù)據(jù)的方法。JDBC也是Sun Microsystems的商標(biāo)。它JDBC是面向關(guān)系型數(shù)據(jù)庫的。
簡(jiǎn)單地說,就是用于執(zhí)行SQL語句的一類Java API,通過JDBC使得我們可以直接使用Java編程來對(duì)關(guān)系數(shù)據(jù)庫進(jìn)行操作。通過封裝,可以使開發(fā)人員使用純Java API完成SQL的執(zhí)行。
一、準(zhǔn)備工作(一):MySQL安裝配置和基礎(chǔ)學(xué)習(xí)
下圖是我接下來用于演示的數(shù)據(jù)庫的表。
二、準(zhǔn)備工作(二):下載數(shù)據(jù)庫對(duì)應(yīng)的jar包并導(dǎo)入
使用JDBC需要在工程中導(dǎo)入對(duì)應(yīng)的jar包。在Eclipse下的導(dǎo)入方法:
在工程的圖標(biāo)上右擊,選擇”Properties”,在”Java Bulid Path”中選擇”Add External JARs…”,選擇下載并解壓后獲得的jar包。
如果對(duì)MySQL進(jìn)行操作,這時(shí)下面的import就不會(huì)報(bào)錯(cuò)了:
import com.mysql.jdbc.Connection; import com.mysql.jdbc.PreparedStatement;
除此以外,還需要JDBC的包,直接import即可。
import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException;
三、JDBC基本操作
為了簡(jiǎn)單起見,與數(shù)據(jù)庫相關(guān)的操作、命令、參數(shù)都被硬編碼了。有興趣的讀者可以對(duì)這些進(jìn)行探索,降低數(shù)據(jù)與操作的耦合性。
先看具體代碼并實(shí)踐,本文第五部分對(duì)用到的API稍作了研究。
下面的所有方法和數(shù)據(jù)成員都在public class JDBCOperation內(nèi)部。
(1)定義記錄的類(可選)
這樣做主要是為了便于操作和接口定義,是非必須的。
static class Student { private String Id; private String Name; private String Sex; private String Age; Student(String Name, String Sex, String Age) { this.Id = null; //default this.Name = Name; this.Sex = Sex; this.Age = Age; } public String getId() { return Id; } public void setId(String Id) { this.Id = Id; } public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public String getSex() { return Sex; } public void setSex(String Sex) { this.Sex = Sex; } public String getAge() { return Age; } public void setage(String Age) { this.Age = Age; } }
(2)連接的獲取
在操作前必須先獲取與數(shù)據(jù)庫的連接。
private static Connection getConn() { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/samp_db"; String username = "root"; String password = ""; Connection conn = null; try { Class.forName(driver); //classLoader,加載對(duì)應(yīng)驅(qū)動(dòng) conn = (Connection) DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; }
(3)insert
private static int insert(Student student) { Connection conn = getConn(); int i = 0; String sql = "insert into students (Name,Sex,Age) values(?,?,?)"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); pstmt.setString(1, student.getName()); pstmt.setString(2, student.getSex()); pstmt.setString(3, student.getAge()); i = pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; }
(4)update
private static int update(Student student) { Connection conn = getConn(); int i = 0; String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); i = pstmt.executeUpdate(); System.out.println("resutl: " + i); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; }
(5)select
以select * from XXX為例。
private static Integer getAll() { Connection conn = getConn(); String sql = "select * from students"; PreparedStatement pstmt; try { pstmt = (PreparedStatement)conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); int col = rs.getMetaData().getColumnCount(); System.out.println("============================"); while (rs.next()) { for (int i = 1; i <= col; i++) { System.out.print(rs.getString(i) + "\t"); if ((i == 2) && (rs.getString(i).length() < 8)) { System.out.print("\t"); } } System.out.println(""); } System.out.println("============================"); } catch (SQLException e) { e.printStackTrace(); } return null; }
(6)delete
private static int delete(String name) { Connection conn = getConn(); int i = 0; String sql = "delete from students where Name='" + name + "'"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); i = pstmt.executeUpdate(); System.out.println("resutl: " + i); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; }
四、測(cè)試
在測(cè)試前,需要在系統(tǒng)中打開對(duì)應(yīng)數(shù)據(jù)庫的服務(wù)。MySQL在Windows下的啟動(dòng)命令為net start mysql
測(cè)試代碼
public static void main(String args[]) { JDBCOperation.getAll(); JDBCOperation.insert(new Student("Achilles", "Male", "14")); JDBCOperation.getAll(); JDBCOperation.update(new Student("Bean", "", "7")); JDBCOperation.delete("Achilles"); JDBCOperation.getAll(); }
Eclipse中的輸出
============================
1 Ender male 8
2 Bean male 6
3 Petra fema 9
4 Peter male 9
5 _Graff male 40
6 GOD fema 255
============================
============================
1 Ender male 8
2 Bean male 6
3 Petra fema 9
4 Peter male 9
5 _Graff male 40
6 GOD fema 255
7 Achilles Male 14
============================
resutl: 1
resutl: 1
============================
1 Ender male 8
2 Bean male 7
3 Petra fema 9
4 Peter male 9
5 _Graff male 40
6 GOD fema 255
============================
五、代碼分析
在上述對(duì)數(shù)據(jù)庫進(jìn)行增刪改查的過程中,可以發(fā)現(xiàn)其共性部分,即通用的流程:
(1)創(chuàng)建Connection對(duì)象、SQL查詢命令字符串;
(2)對(duì)Connection對(duì)象傳入SQL查詢命令,獲得PreparedStatement對(duì)象;
(3)對(duì)PreparedStatement對(duì)象執(zhí)行executeUpdate()或executeQurey()獲得結(jié)果;
(4)先后關(guān)閉PreparedStatement對(duì)象和Connection對(duì)象。
可見,使用JDBC時(shí),最常打交道的是Connection、PreparedStatement這兩個(gè)類,以及select中的ResultSet類。查閱Java API手冊(cè)可以了解其具體的意義和方法。
Wrapper
java.sql
接口 Connection
所有超級(jí)接口:
Wrapper
public interface Connectionextends Wrapper
與特定數(shù)據(jù)庫的連接(會(huì)話)。在連接上下文中執(zhí)行 SQL 語句并返回結(jié)果。
Connection 對(duì)象的數(shù)據(jù)庫能夠提供描述其表、所支持的 SQL 語法、存儲(chǔ)過程、此連接功能等等的信息。此信息是使用 getMetaData 方法獲得的。
PreparedStatemnt
java.sql
接口 PreparedStatement
所有超級(jí)接口:
Statement, Wrapper
所有已知子接口:
CallableStatement
public interface PreparedStatementextends Statement
表示預(yù)編譯的 SQL 語句的對(duì)象。
SQL 語句被預(yù)編譯并存儲(chǔ)在 PreparedStatement 對(duì)象中。然后可以使用此對(duì)象多次高效地執(zhí)行該語句。
常用方法
boolean execute()
在此 PreparedStatement 對(duì)象中執(zhí)行 SQL 語句,該語句可以是任何種類的 SQL 語句。
ResultSet executeQuery()
在此 PreparedStatement 對(duì)象中執(zhí)行 SQL 查詢,并返回該查詢生成的 ResultSet 對(duì)象。
int executeUpdate()
在此 PreparedStatement 對(duì)象中執(zhí)行 SQL 語句,該語句必須是一個(gè) SQL 數(shù)據(jù)操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 語句;或者是無返回內(nèi)容的 SQL 語句,比如 DDL 語句。
ResultSet
java.sql
接口 ResultSet
所有超級(jí)接口:
Wrapper
所有已知子接口:
CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet, RowSet, SyncResolver, WebRowSet
public interface ResultSetextends Wrapper
表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。
六、思考問題
每次SQL操作都需要建立和關(guān)閉連接,這勢(shì)必會(huì)消耗大量的資源開銷,如何避免?
分析:可以采用連接池,對(duì)連接進(jìn)行統(tǒng)一維護(hù),不必每次都建立和關(guān)閉。事實(shí)上這是很多對(duì)JDBC進(jìn)行封裝的工具所采用的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java如何創(chuàng)建一個(gè)jdbc程序詳解
- JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql
- java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法
- Java數(shù)據(jù)庫連接_jdbc-odbc橋連接方式(詳解)
- Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法
- Java中JDBC實(shí)現(xiàn)動(dòng)態(tài)查詢的實(shí)例詳解
- Java與Oracle實(shí)現(xiàn)事務(wù)(JDBC事務(wù))實(shí)例詳解
- 使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例
相關(guān)文章
如何實(shí)現(xiàn)Spring?Event(異步事件)
這篇文章主要介紹了如何實(shí)現(xiàn)Spring?Event(異步事件)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02mybatis 獲取無數(shù)據(jù)的字段不顯示的問題
這篇文章主要介紹了mybatis 獲取無數(shù)據(jù)的字段不顯示的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07spring-boot-maven-plugin未指定版本導(dǎo)致的編譯錯(cuò)誤問題
這篇文章主要介紹了spring-boot-maven-plugin未指定版本導(dǎo)致的編譯錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04StringUtils工具包中字符串非空判斷isNotEmpty和isNotBlank的區(qū)別
今天小編就為大家分享一篇關(guān)于StringUtils工具包中字符串非空判斷isNotEmpty和isNotBlank的區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12IDEA配置tomcat的方法、IDEA配置tomcat運(yùn)行web項(xiàng)目詳解
這篇文章主要介紹了IDEA配置tomcat的方法、IDEA配置tomcat運(yùn)行web項(xiàng)目詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Elasticsearch常見字段映射類型之scaled_float解讀
這篇文章主要介紹了Elasticsearch常見字段映射類型之scaled_float解讀。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11