一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

2020-12-04 09:11wuyue Java教程

什么是JDBC?這篇文章就為大家詳細(xì)介紹了Java語(yǔ)言中用來(lái)規(guī)范客戶端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言:什么是jdbc

維基百科的簡(jiǎn)介:

  java 數(shù)據(jù)庫(kù)連接,(java database connectivity,簡(jiǎn)稱jdbc)是java語(yǔ)言中用來(lái)規(guī)范客戶端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,提供了諸如查詢和更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法。jdbc也是sun microsystems的商標(biāo)。它jdbc是面向關(guān)系型數(shù)據(jù)庫(kù)的。

  簡(jiǎn)單地說(shuō),就是用于執(zhí)行sql語(yǔ)句的一類java api,通過(guò)jdbc使得我們可以直接使用java編程來(lái)對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行操作。通過(guò)封裝,可以使開(kāi)發(fā)人員使用純java api完成sql的執(zhí)行。 

一、準(zhǔn)備工作(一):mysql安裝配置和基礎(chǔ)學(xué)習(xí)

下圖是我接下來(lái)用于演示的數(shù)據(jù)庫(kù)的表。

JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

二、準(zhǔn)備工作(二):下載數(shù)據(jù)庫(kù)對(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包。

JDBC簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理        

如果對(duì)mysql進(jìn)行操作,這時(shí)下面的import就不會(huì)報(bào)錯(cuò)了:

 
?
1
 
2
import com.mysql.jdbc.connection;
import com.mysql.jdbc.preparedstatement;

除此以外,還需要jdbc的包,直接import即可。

 
?
1
 
2
3
import java.sql.drivermanager;
import java.sql.resultset;
import java.sql.sqlexception;

三、jdbc基本操作

  為了簡(jiǎn)單起見(jiàn),與數(shù)據(jù)庫(kù)相關(guān)的操作、命令、參數(shù)都被硬編碼了。有興趣的讀者可以對(duì)這些進(jìn)行探索,降低數(shù)據(jù)與操作的耦合性。

  先看具體代碼并實(shí)踐,本文第五部分對(duì)用到的api稍作了研究。

  下面的所有方法和數(shù)據(jù)成員都在public class jdbcoperation內(nèi)部。

(1)定義記錄的類(可選)

這樣做主要是為了便于操作和接口定義,是非必須的。

 

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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ù)庫(kù)的連接。

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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為例。

 

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

 
?
1
 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)中打開(kāi)對(duì)應(yīng)數(shù)據(jù)庫(kù)的服務(wù)。mysql在windows下的啟動(dòng)命令為net start mysql

測(cè)試代碼

 
?
1
 
2
3
4
5
6
7
8
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ù)庫(kù)進(jìn)行增刪改查的過(guò)程中,可以發(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ì)象。

可見(jiàn),使用jdbc時(shí),最常打交道的是connection、preparedstatement這兩個(gè)類,以及select中的resultset類。查閱java api手冊(cè)可以了解其具體的意義和方法。

wrapper

java.sql 

接口 connection
所有超級(jí)接口:
wrapper

public interface connectionextends wrapper

與特定數(shù)據(jù)庫(kù)的連接(會(huì)話)。在連接上下文中執(zhí)行 sql 語(yǔ)句并返回結(jié)果。
connection 對(duì)象的數(shù)據(jù)庫(kù)能夠提供描述其表、所支持的 sql 語(yǔ)法、存儲(chǔ)過(guò)程、此連接功能等等的信息。此信息是使用 getmetadata 方法獲得的。

preparedstatemnt

java.sql 
接口 preparedstatement
所有超級(jí)接口:

statement, wrapper

所有已知子接口:

callablestatement

public interface preparedstatementextends statement
表示預(yù)編譯的 sql 語(yǔ)句的對(duì)象。
sql 語(yǔ)句被預(yù)編譯并存儲(chǔ)在 preparedstatement 對(duì)象中。然后可以使用此對(duì)象多次高效地執(zhí)行該語(yǔ)句。 

常用方法

boolean  execute()
          在此 preparedstatement 對(duì)象中執(zhí)行 sql 語(yǔ)句,該語(yǔ)句可以是任何種類的 sql 語(yǔ)句。
 resultset  executequery()
          在此 preparedstatement 對(duì)象中執(zhí)行 sql 查詢,并返回該查詢生成的 resultset 對(duì)象。
 int  executeupdate()
          在此 preparedstatement 對(duì)象中執(zhí)行 sql 語(yǔ)句,該語(yǔ)句必須是一個(gè) sql 數(shù)據(jù)操作語(yǔ)言(data manipulation language,dml)語(yǔ)句,比如 insert、update 或 delete 語(yǔ)句;或者是無(wú)返回內(nèi)容的 sql 語(yǔ)句,比如 ddl 語(yǔ)句。

resultset

java.sql 
接口 resultset
所有超級(jí)接口:
wrapper
所有已知子接口:
cachedrowset, filteredrowset, jdbcrowset, joinrowset, rowset, syncresolver, webrowset

public interface resultsetextends wrapper

表示數(shù)據(jù)庫(kù)結(jié)果集的數(shù)據(jù)表,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。  

六、思考問(wèn)題

每次sql操作都需要建立和關(guān)閉連接,這勢(shì)必會(huì)消耗大量的資源開(kāi)銷,如何避免?
分析:可以采用連接池,對(duì)連接進(jìn)行統(tǒng)一維護(hù),不必每次都建立和關(guān)閉。事實(shí)上這是很多對(duì)jdbc進(jìn)行封裝的工具所采用的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲第一天堂无码专区 | 精品国产三级av在线 | 精彩国产萝视频在线 | 国内精品九一在线播放 | 日本mv精品中文字幕 | 欧美精品久久一区二区三区 | 日本动漫黄网站在线观看 | 日韩欧美在线视频一区二区 | 国产激情视频网站 | 天天色综合三 | 国产亚洲玖玖玖在线观看 | hezyo加勒比一区二区三区 | 日麻逼 | 999热这里只有精品 999久久久免费精品国产牛牛 | 国产欧美日韩在线不卡第一页 | 久久精品国产亚洲AV麻豆欧美玲 | 国产一级大片免费看 | 亚洲图片综合网 | 免费亚洲一区 | 欧美精品久久久久久久影视 | 无限观看社区在线视频 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 国产一区二区精品久久 | 四虎成人免费观看在线网址 | 腿交hd | 日韩精品一区二区三区老鸭窝 | 草草草草视频 | 亚洲精品日韩专区在线观看 | 亚洲第一色网站 | 91极品在线观看 | 奇米影视在线视频8888 | 美女视频91 | 91视频破解 | 丁香久久婷婷 | 亚洲精品无码不卡在线观看 | 成年人在线视频免费观看 | 羞羞麻豆国产精品1区2区3区 | 暖暖中国免费观看高清完整版 | 欧美一级乱妇老太婆特黄 | 免费国产成人α片 | 操大爷影院 |