Java項(xiàng)目中如何使用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)

本篇文章為大家展示了Java項(xiàng)目中如何使用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫(kù),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

凌云網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,凌云網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為凌云數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的凌云做網(wǎng)站的公司定做!

一、概念

  1. 為了能讓程序操作數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行操作,每一種數(shù)據(jù)庫(kù)都會(huì)提供一套連接和操作該數(shù)據(jù)庫(kù)的驅(qū)動(dòng),而且每種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)都各不相同,例如MySQL數(shù)據(jù)庫(kù)使用mysql驅(qū)動(dòng),oracle數(shù)據(jù)庫(kù)使用oracle驅(qū)動(dòng),這樣假如我們編寫(xiě)的程序哪一天想要換數(shù)據(jù)庫(kù),那樣就會(huì)很不方便,因?yàn)樗羞B接數(shù)據(jù)庫(kù)的代碼都要從新編寫(xiě)。SUN公司為了簡(jiǎn)化。統(tǒng)一對(duì)數(shù)據(jù)庫(kù)的操作,定義了一套java操作數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)或者規(guī)范,這個(gè)規(guī)范就是JDBC。

  2.JDBC全稱(chēng)為:Java Data Base Connectivity(java數(shù)據(jù)庫(kù)連接),它主要由接口組成。我們?cè)陂_(kāi)發(fā)過(guò)程中,只要實(shí)現(xiàn)它相應(yīng)的接口就可以非常進(jìn)行連接?! ?/p>

  3.我們?cè)陂_(kāi)發(fā)JDBC應(yīng)用時(shí),還需要導(dǎo)入相應(yīng)的數(shù)據(jù)庫(kù)的驅(qū)動(dòng)jar包,這些驅(qū)動(dòng)jar包是由數(shù)據(jù)庫(kù)公司自己編寫(xiě)的。

二、編寫(xiě)JDBC應(yīng)用程序(需要連接數(shù)據(jù)庫(kù)的程序)的前提準(zhǔn)備

1.首先要確定連接的是哪個(gè)數(shù)據(jù)庫(kù)實(shí)例,例如在mysql中,我們可以先創(chuàng)建一個(gè)庫(kù),然后在庫(kù)中新建一張表,在表中插入一些數(shù)據(jù),我在這里提供一段在mysql數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)庫(kù),以及表和數(shù)據(jù)的sql語(yǔ)句,這也是下面連接數(shù)據(jù)庫(kù)后操作的庫(kù)和表。

create database test ; /*創(chuàng)建一個(gè)名為T(mén)est的數(shù)據(jù)庫(kù)*/
use test;        /*使用該數(shù)據(jù)庫(kù)或者說(shuō)切換到該數(shù)據(jù)庫(kù)*/
create table book (
  id int primary key auto_increment, /*列:id ,類(lèi)型:int,從0開(kāi)始,自動(dòng)增加, 備注:主鍵*/
  name varchar(40) NOT NULL,    /*列:name ,類(lèi)型:varchar, 備注:非空*/
  author varchar(40)NOT NULL, /*列:author ,類(lèi)型:varchar, 備注:非空*/
  prices double NOT NULL  /*列:prices ,類(lèi)型:double, 備注:非空*/
); /*新建一張名為book的表*/
/*插入四大名著的數(shù)據(jù)*/
insert into book(id,name,author,prices) values (null,'西游記','吳承恩',25.00);
insert into book(id,name,author,prices) values (null,'水滸傳','施耐庵',30.00);
insert into book(id,name,author,prices) values (null,'紅樓夢(mèng)','曹雪芹',35.00);
insert into book(id,name,author,prices) values (null,'三國(guó)演義','羅貫中',40.00);

2.新建一個(gè)java項(xiàng)目,然后把mysql的驅(qū)動(dòng)jar包導(dǎo)入進(jìn)來(lái),即添加到程序運(yùn)行的庫(kù)中,具體的驅(qū)動(dòng)jar包,我們可以在數(shù)據(jù)庫(kù)的安裝目錄下找到,或者都網(wǎng)上自己下載相對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)jar包

三、連接數(shù)據(jù)庫(kù)操作的步驟解析

(1)注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)

雖然我們剛才在新建java項(xiàng)目的時(shí)候?qū)ysql數(shù)據(jù)庫(kù)的驅(qū)動(dòng)jar包導(dǎo)入進(jìn)來(lái)了,但是JBDC不知道這里有一個(gè)驅(qū)動(dòng)包,此時(shí)我們就需要將這個(gè)驅(qū)動(dòng)包交給JBDC去管理,我們可以使用java.sql包下的DriverManager 工具類(lèi) 提供的registerDriver(Driver driver) 方法來(lái)在JDBC中注冊(cè)這個(gè)數(shù)據(jù)驅(qū)動(dòng),這個(gè)registerDriver(Driver driver)方法需要一個(gè)Driver對(duì)象,而這個(gè)Driver類(lèi)本身是JDBC提供的一個(gè)接口,我們的驅(qū)動(dòng)里面已經(jīng)實(shí)現(xiàn)了這個(gè)接口,所以我們只需要寫(xiě)如下代碼就可以實(shí)現(xiàn)注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的功能

import java.sql.DriverManager; //需要導(dǎo)入的是接口類(lèi)包
DriverManager.registerDriver(new Driver());

(2)獲取(創(chuàng)建)數(shù)據(jù)庫(kù)的連接

我們注冊(cè)好數(shù)據(jù)庫(kù)驅(qū)動(dòng)后,并沒(méi)有連接上數(shù)據(jù)庫(kù),以往,我們不管在CMD窗口下,通過(guò)可視化數(shù)據(jù)庫(kù)管理工具操作數(shù)據(jù)庫(kù)時(shí),我們都需要先連接數(shù)據(jù)庫(kù)服務(wù)器,java程序連接數(shù)據(jù)庫(kù)也不例外,這里的java程序就相當(dāng)于客戶端,只有先連接上數(shù)據(jù)庫(kù)服務(wù),才能對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作

客戶端與數(shù)據(jù)庫(kù)所有交互都是通過(guò)connection對(duì)象完成的,這個(gè)對(duì)象的常用方法:

createStatement():創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送sql的statement對(duì)象。

prepareStatement(sql) :創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送預(yù)編譯sql的

這里我們可以通過(guò)DriverManager 工具類(lèi)里的getConnection(url,user,password)方法來(lái)創(chuàng)建數(shù)據(jù)庫(kù)連接對(duì)象,此方法需要傳入三個(gè)參數(shù):

User: 數(shù)據(jù)庫(kù)的用戶名

Password:用戶密碼

URL:數(shù)據(jù)庫(kù)服務(wù)器地址,不同的數(shù)據(jù)庫(kù)的URL寫(xiě)法不同,我在這里提供三種主流數(shù)據(jù)庫(kù)的URL地址寫(xiě)法:

Oracle寫(xiě)法:jdbc:oracle:thin:@localhost:1521:sid

SqlServe寫(xiě)法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid

MySql寫(xiě)法:jdbc:mysql://localhost:3306/sid

Mysql的url地址的簡(jiǎn)寫(xiě)形式: jdbc:mysql:///sid

注:后面的sid就是數(shù)據(jù)庫(kù)的實(shí)例名稱(chēng)(使用的數(shù)據(jù)庫(kù)名)

import java.sql.Connection; //導(dǎo)入的是接口類(lèi)包
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); //這里使用的是一個(gè)名為test的mysql數(shù)據(jù)庫(kù),用戶名和密碼都是root 

(3)創(chuàng)建傳輸器對(duì)象

上面我們已經(jīng)創(chuàng)建了數(shù)據(jù)庫(kù)的連接,已經(jīng)連上數(shù)據(jù)庫(kù)了,但是如果我們想要操作該數(shù)據(jù)庫(kù),我們需要用到sql語(yǔ)句,而我們?cè)鯓邮褂迷趈ava程序中使用sql語(yǔ)句來(lái)操作數(shù)據(jù)庫(kù)呢,這里我們就需要一個(gè)傳輸器對(duì)象來(lái)傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中去執(zhí)行。上文提到在Connection 類(lèi)中就有一個(gè)createStatement()的方法可以創(chuàng)建一個(gè)傳輸器對(duì)象

import java.sql.Statement; //導(dǎo)入的是接口類(lèi)包
Statement stat = conn.createStatement();

(4)利用傳輸器對(duì)象傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中執(zhí)行操作,將結(jié)果用結(jié)果集返回

java.sql.Statement身上有許多傳輸sql語(yǔ)句的方法:其中用的最多的是

executeQuery(String sql) :用于向數(shù)據(jù)發(fā)送查詢(xún)語(yǔ)句。

executeUpdate(String sql):用于向數(shù)據(jù)庫(kù)發(fā)送insert、update或delete語(yǔ)句

execute(String sql):用于向數(shù)據(jù)庫(kù)發(fā)送任意sql語(yǔ)句

import java.sql.ResultSet; //需要導(dǎo)入的接口類(lèi)包
ResultSet rs = stat.executeQuery("select * from book"); //傳輸一條查詢(xún)語(yǔ)句,查詢(xún)book表中所有的元組數(shù)據(jù)

(5) 遍歷結(jié)果集,并獲取查詢(xún)對(duì)象

Jdbc程序中的ResultSet用于代表Sql語(yǔ)句的執(zhí)行結(jié)果。Resultset封裝執(zhí)行結(jié)果時(shí),采用的類(lèi)似于表格的方式。ResultSet 對(duì)象維護(hù)了一個(gè)指向表格數(shù)據(jù)行的游標(biāo),初始的時(shí)候,游標(biāo)在第一行之前,調(diào)用ResultSet.next() 方法,可以使游標(biāo)指向具體的數(shù)據(jù)行,進(jìn)行調(diào)用方法獲取該行的數(shù)據(jù)。

ResultSet既然用于封裝執(zhí)行結(jié)果的,所以該對(duì)象提供的都是用于獲取數(shù)據(jù)的get方法:

獲取指定類(lèi)型的數(shù)據(jù),例如:

getString(int index)

getString(String columnName)

ResultSet還提供了對(duì)結(jié)果集進(jìn)行滾動(dòng)的方法:

next():移動(dòng)到下一行

Previous():移動(dòng)到前一行

absolute(int row):移動(dòng)到指定行

beforeFirst():移動(dòng)resultSet的最前面。

afterLast() :移動(dòng)到resultSet的最后面。

while(rs.next())
 {
 String name = rs.getString("name");
 System.out.println(name);
}

(6)關(guān)閉連接(先創(chuàng)建的后關(guān)閉)

Jdbc程序運(yùn)行完后,切記要釋放程序在運(yùn)行過(guò)程中,創(chuàng)建的那些與數(shù)據(jù)庫(kù)進(jìn)行交互的對(duì)象,這些對(duì)象通常是ResultSet, Statement和Connection對(duì)象。

特別是Connection對(duì)象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時(shí)、正確的關(guān)閉,極易導(dǎo)致系統(tǒng)宕機(jī)。Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放。

rs.close(); 
stat.close();
conn.close(); 

初期完整的源代碼

package jdbcDemo;
/****************************
 * 初版連接數(shù)據(jù)庫(kù)程序
 **************************/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//不能導(dǎo)入 java.sql 中的 Driver 接口,要導(dǎo)入驅(qū)動(dòng)jar包中實(shí)現(xiàn)該接口的類(lèi),只有這要才能注冊(cè)相對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)
import com.mysql.jdbc.Driver; 
public class JDBCTest {
 public static void main(String[] args) throws SQLException {
 //1.注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)
 DriverManager.registerDriver(new Driver());
 //2.獲取數(shù)據(jù)庫(kù)的連接 
 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");
 //3.創(chuàng)建傳輸器對(duì)象
 Statement stat = conn.createStatement();
 //4.利用傳輸器對(duì)象傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中執(zhí)行操作,將結(jié)果用結(jié)果集返回
  ResultSet rs = stat.executeQuery("select * from book");
 //5.遍歷結(jié)果集,并獲取查詢(xún)結(jié)果
 while(rs.next()) {
  String name = rs.getString("name");
  System.out.println(name);
 }
 //6.關(guān)閉連接(后開(kāi)先關(guān))
 rs.close(); 
 stat.close();
 conn.close();
 } 
}

數(shù)據(jù)表視圖和運(yùn)行結(jié)果:

Java項(xiàng)目中如何使用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)

四、初期連接數(shù)據(jù)庫(kù)程序中出現(xiàn)的問(wèn)題

1--注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)方法不當(dāng)導(dǎo)致出現(xiàn)了兩次注冊(cè),程序通用性低

我們?cè)诓榭碊river類(lèi)的源碼中可以看到如下代碼,從第7行代碼中我們可以看到,mysql在Driver類(lèi)的實(shí)現(xiàn)中自己注冊(cè)了一次,而我們?cè)诔绦蛑杏肿?cè)了一次,導(dǎo)致注冊(cè)兩次

我們?cè)谧?cè)驅(qū)動(dòng)時(shí),需要導(dǎo)入mysql驅(qū)動(dòng)jar包中已經(jīng)實(shí)現(xiàn)的Driver類(lèi),這樣程序就和具體的數(shù)據(jù)庫(kù)綁定在一起了,程序的通用性就降低了,如果我們想要切換數(shù)據(jù)庫(kù),還得改動(dòng)源碼

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
 //
 // Register ourselves with the DriverManager
 //
 static {
 try {
  java.sql.DriverManager.registerDriver(new Driver());
 } catch (SQLException E) {
  throw new RuntimeException("Can't register driver!");
 }
 }

修復(fù)方法:

使用Class.forname() 方法將mysql中已經(jīng)實(shí)現(xiàn)的Driver類(lèi)加載到程序中來(lái),由于Driver類(lèi)在實(shí)現(xiàn)接口時(shí)使用的是靜態(tài)代碼塊,而靜態(tài)代碼塊只會(huì)在類(lèi)加載的時(shí)候執(zhí)行一次,即保證了數(shù)據(jù)庫(kù)驅(qū)動(dòng)只會(huì)被注冊(cè)一次,同時(shí)不用導(dǎo)入mysql驅(qū)驅(qū)動(dòng)里的類(lèi)包,程序通用性提高

Class.forName("com.mysql.jdbc.Driver");

2--忽略了程序中可能會(huì)拋出的異常(最大的問(wèn)題)

我們?cè)趫?zhí)行程序時(shí),它的許多方法的調(diào)用都會(huì)拋出異常,如果它拋出異常后,沒(méi)有做相應(yīng)的處理(catch 這個(gè)異常)那么程序就會(huì)中斷執(zhí)行,Statement對(duì)象和Connection對(duì)象就沒(méi)有被關(guān)閉,而我們知道Connection對(duì)象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時(shí)、正確的關(guān)閉,極易導(dǎo)致系統(tǒng)宕機(jī),所以我們需要保證無(wú)論程序中哪一步出現(xiàn)了異常導(dǎo)致程序中斷,連接關(guān)閉的代碼都會(huì)被執(zhí)行,此時(shí)我們就會(huì)想到異常處理中的finally代碼塊,我們可以把異常向上拋出,而是先 try 住然后 catch 異常,最后執(zhí)行 finally 代碼塊

修改之后,我們發(fā)現(xiàn)每個(gè)close() 都提示有異常要處理,此時(shí)我們也直接 try/catch每個(gè)異常

修改后的源代碼:

package jdbcDemo;
/****************************
 * 修改版連接數(shù)據(jù)庫(kù)程序
 **************************/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
 public static void main(String[] args) {
 Connection conn = null;
 Statement stat = null;
 ResultSet rs = null;
 try {
  //1.注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)
  Class.forName("com.mysql.jdbc.Driver");
  //2.獲取數(shù)據(jù)庫(kù)的連接 
   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");
  //3.創(chuàng)建傳輸器對(duì)象
   stat = conn.createStatement();
  //4.利用傳輸器對(duì)象傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中執(zhí)行操作,將結(jié)果用結(jié)果集返回
   rs = stat.executeQuery("select * from book");
  //5.遍歷結(jié)果集,并獲取查詢(xún)結(jié)果
  while(rs.next()) {
   String name = rs.getString("name");
   System.out.println(name);
  }
 }catch(Exception e) {
  e.printStackTrace();
 }finally {
  //6.關(guān)閉連接(后開(kāi)先關(guān))
  try {
  rs.close();
  } catch (SQLException e) {
  e.printStackTrace();
  } 
  try {
  stat.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
  try {
  conn.close();
  } catch (SQLException e) {
  e.printStackTrace();
  }
 }
 } 
}

五、修改后程序中被忽略的異常

異常問(wèn)題

1.由于我們?cè)诔绦蜷_(kāi)頭先聲明了三個(gè)對(duì)象的引用,并且都賦值為null,假如程序在執(zhí)行到注冊(cè)數(shù)據(jù)庫(kù)這一步時(shí)就拋出了異常,此時(shí)catch 到這個(gè)異常 后執(zhí)行finally 代碼塊,結(jié)果發(fā)現(xiàn)ResultSet 對(duì)象的引用,Connection對(duì)象的引用以及Statement對(duì)象的引用都是空值,調(diào)用這個(gè)對(duì)象上的方法就會(huì)拋出空指針異常

2.close()這個(gè)方法身上也有異常,如果我們不做相應(yīng)的異常處理,那些對(duì)象還是不能被正常關(guān)閉

解決辦法

1---為了防止出現(xiàn)空指針異常,我們可以先判斷哪些對(duì)象的引用是否為null,如果不為null,則執(zhí)行異常處理代碼

2---在每個(gè)close()異常處理后在加上一個(gè)finally靜態(tài)代碼塊,將每個(gè)相應(yīng)對(duì)象的引用值置為null,原理是:如果程序執(zhí)行到close() 方法并拋出了異常,那么最后finally代碼塊執(zhí)行,給該對(duì)象的應(yīng)用值置為null,由于這個(gè)對(duì)象沒(méi)有任何引用指向它,它就成為了垃圾對(duì)象,JVM垃圾回收器就會(huì)回收這個(gè)對(duì)象資源,這個(gè)對(duì)象也就關(guān)閉了

異常處理完后最終的源代碼:

package jdbcDemo;
/****************************
 * 無(wú)異常版連接數(shù)據(jù)庫(kù)程序
 **************************/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
 public static void main(String[] args) {
 Connection conn = null;
 Statement stat = null;
 ResultSet rs = null;
 try {
  //1.注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)
  Class.forName("com.mysql.jdbc.Driver");
  //2.獲取數(shù)據(jù)庫(kù)的連接 
   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");
  //3.創(chuàng)建傳輸器對(duì)象
   stat = conn.createStatement();
  //4.利用傳輸器對(duì)象傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中執(zhí)行操作,將結(jié)果用結(jié)果集返回
   rs = stat.executeQuery("select * from book");
  //5.遍歷結(jié)果集,并獲取查詢(xún)結(jié)果
  while(rs.next()) {
   String name = rs.getString("name");
   System.out.println(name);
  }
 }catch(Exception e) {
  e.printStackTrace();
 }finally {
  //6.關(guān)閉連接(后開(kāi)先關(guān))
  if(rs != null) {
   try {
   rs.close();
   } catch (SQLException e) {
   e.printStackTrace();
   } finally {
   rs = null;
   }
  }
  if(stat != null) {
   try {
   stat.close();
   } catch (SQLException e) {
   e.printStackTrace();
   }finally {
   stat = null;
   }
  }
  if(conn != null) {
   try {
   conn.close();
   } catch (SQLException e) {
   e.printStackTrace();
   }finally {
   conn = null;
   }
  } 
 } //--finally
 } //--main 
}//--class

總結(jié):

這里我只是把所有的異常處理完,但是程序的通用性還不是特別高,因?yàn)檫B接數(shù)據(jù)庫(kù)用到的Driver類(lèi)名、URL、user以及password 都寫(xiě)在程序中,我們其實(shí)可以寫(xiě)在一個(gè)文本文件中,通過(guò)對(duì)文件的讀取來(lái)獲得每種數(shù)據(jù)庫(kù)特有的連接參數(shù)

還有就是在實(shí)際開(kāi)發(fā)過(guò)程中,連接數(shù)據(jù)庫(kù)的程序代碼一般會(huì)寫(xiě)在一個(gè)工具類(lèi)中,我們想要對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行操作時(shí),只需要調(diào)用這個(gè)工具類(lèi)就可以了,不用每次都寫(xiě)那么多代碼

接下來(lái)我還會(huì)更新一篇如何將數(shù)據(jù)庫(kù)的連接信息保存在文本文件中,然后讀取這個(gè)文件來(lái)實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)的操作,同時(shí)我也會(huì)將這個(gè)程序修改為連接數(shù)據(jù)庫(kù)的一個(gè)工具類(lèi)

上述內(nèi)容就是Java項(xiàng)目中如何使用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫(kù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱(chēng):Java項(xiàng)目中如何使用JDBC實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)
URL地址:http://muchs.cn/article24/ieppce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器托管、定制開(kāi)發(fā)外貿(mào)建站

廣告

聲明:本網(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)

成都seo排名網(wǎng)站優(yōu)化