生活随笔
收集整理的這篇文章主要介紹了
原生JDBC和工具类的基本实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
工具:
- IDEA
- MySQL8.0或之前版本
文章目錄
- JDBC原理
- JDBC入門案例
- JDBC的API詳解
- JDBC增刪改查操作
- JDBC工具類
JDBC是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范,可以為不同的關(guān)系型數(shù)據(jù)庫提供統(tǒng)?訪問,它由一組用Java編寫的接口和類組成。
JDBC需要
連接驅(qū)動(dòng),驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動(dòng)軟件,通過軟件可以與該設(shè)備進(jìn)行通信。
今天我們使用的是mysql的驅(qū)動(dòng)
mysql-connector-java-8.0.20.jar(適配MySQL8.0版本),如果是之前版本的MySQL建議使用應(yīng)用次數(shù)較多的
mysql-connector-java-5.1.38.jar
JDBC核心規(guī)范:
- DriverManager:?于注冊(cè)驅(qū)動(dòng)
- Connection: 表示與數(shù)據(jù)庫創(chuàng)建的連接
- Statement: 操作數(shù)據(jù)庫sql語句的對(duì)象
- ResultSet: 結(jié)果集或?張?zhí)摂M表
JDBC原理
Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實(shí)現(xiàn)類稱為驅(qū)動(dòng)。JDBC是接口,驅(qū)動(dòng)是接口的實(shí)現(xiàn),沒有驅(qū)動(dòng)將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!每個(gè)數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動(dòng),用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動(dòng)一般都由數(shù)據(jù)庫生成廠商提供(也就是在我們上邊導(dǎo)入的jar包當(dāng)中)。
開發(fā)步驟
注冊(cè)驅(qū)動(dòng)獲得連接獲得執(zhí)行sql語句的對(duì)象執(zhí)行sql語句,并返回結(jié)果處理結(jié)果釋放資源
JDBC入門案例
首先熟悉一下JDBC的helloworld,
準(zhǔn)備MySQL數(shù)據(jù):
create table category
(
cid
int PRIMARY KEY AUTO_INCREMENT,
cname
varchar(100)
);
insert into category
(cname
) values('家電');
insert into category
(cname
) values('服飾');
insert into category
(cname
) values('化妝品');
建立一個(gè)簡(jiǎn)單的表
2. 導(dǎo)入驅(qū)動(dòng)jar包
在IDEA項(xiàng)目下創(chuàng)建lib目錄
在MVN下好jar包并復(fù)制,雙擊新建的lib目錄ctrl+v,jar包就保存到該目錄下,之后右鍵導(dǎo)入的jar包,選擇添加到庫…或Add as Library...,就正式添加完畢了
MySQL8.0連接jdbc方法
package JDBCTest
;import org
.junit
.Test
;import java
.sql
.*
;public class JDBCDemo {public static void main(String
[] args
) throws ClassNotFoundException
, SQLException
{@TestClass
.forName("com.mysql.cj.jdbc.Driver");String url
= "jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true";Connection connection
= DriverManager
.getConnection(url
, "root", "root");Statement statement
= connection
.createStatement();String sql1
= "select * from category";ResultSet resultSet
= statement
.executeQuery(sql1
);while (resultSet
.next()) {int cid
= resultSet
.getInt("cid");String cname
= resultSet
.getString("cname");System
.out
.println("cid = " + cid
+ ", cname = " + cname
);}resultSet
.close();statement
.close();connection
.close();}
}
JDBC的API詳解
注冊(cè)驅(qū)動(dòng)
有兩種方法:
①DriverManager.registerDriver(new com.mysql.jdbc.Driver());
②Class.forName("com.mysql.jdbc.Driver");
其中第一種辦法不被推薦使用,因?yàn)轵?qū)動(dòng)會(huì)被注冊(cè)兩次,并且會(huì)強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動(dòng)jar,通常我們?cè)谧鲩_發(fā)的時(shí)候用的都是第二種方式來注冊(cè)驅(qū)動(dòng)獲得鏈接
static Connection getConnection(String url, String user, String password) :試圖建立到給定數(shù)據(jù)庫 URL 的連接
使用參數(shù)說明:
- url 需要連接數(shù)據(jù)庫的位置(網(wǎng)址)
- user用戶名 (要區(qū)別于數(shù)據(jù)庫表名)
- password 密碼
eg:getConnection("jdbc:mysql://localhost:3306/database", "root", "root");
URL是SUN公司和數(shù)據(jù)庫廠商的一個(gè)協(xié)議
jdbc
:mysql
://localhost
:3306/database
協(xié)議子協(xié)議 IP:端口號(hào)數(shù)據(jù)庫
- mysql數(shù)據(jù)庫:
- jdbc:mysql://localhost:3306/database 或者
- jdbc:mysql:///database(默認(rèn)本機(jī)連接)
- oracle數(shù)據(jù)庫:
- jdbc:oracle:thin:@localhost:1521:sid
java.sql.Connection接口:一個(gè)連接
接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中,所有與數(shù)據(jù)庫交互都是基于連接對(duì)象的。
java.sql.Statement接口: 操作sql語句,并返回相應(yīng)結(jié)果
String sql
= "某SQL語句";
獲取Statement語句執(zhí)?平臺(tái):Statement stmt
=con
.createStatement();
常用方法:
int executeUpdate(String sql); --執(zhí)行insert update delete語句.
ResultSet executeQuery(String sql); --執(zhí)行select語句.
boolean execute(String sql); --僅當(dāng)執(zhí)行select并且有結(jié)果時(shí)才返回true,執(zhí)行其他的語句返回false.
處理結(jié)果集(注:執(zhí)行insert、update、delete無需處理)
ResultSet實(shí)際上就是一張二維的表格,我們可以調(diào)用其 boolean next() 方法指向某行記錄,當(dāng)?shù)谝淮握{(diào)用 next() 方法時(shí),便指向第一行記錄的位置,這時(shí)就可以使用ResultSet提供的 getXXX(int col) 方法來獲取指定列的數(shù)據(jù):(與數(shù)組索引從0開始不同,這里索引從1開始)
rs
.next();
rs
.getInt(1);
常用方法:
- Object getObject(int index) / Object getObject(String name) 獲得任意對(duì)象
- String getString(int index) / String getString(String name) 獲得字符串
- int getInt(int index) / int getInt(String name) 獲得整型
- double getDouble(int index) / double getDouble(String name) 獲得雙精度浮點(diǎn)型
釋放資源
與IO流?樣,使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。
rs
.close();
stmt
.close();
con
.close();
JDBC增刪改查操作
增:
@Testpublic void testJDBC2() throws SQLException
, ClassNotFoundException
{
Class
.forName("com.mysql.jdbc.Driver");String url
= "jdbc:mysql://localhost:3306/mydb";Connection conn
= DriverManager
.getConnection(url
, "root","root");Statement stat
= conn
.createStatement();String sql
= "insert into category(cname) values('測(cè)試')";int result
= stat
.executeUpdate(sql
);System
.out
.println("result = " + result
);stat
.close();conn
.close();}
刪:
@Test
public void testJDBC4() throws SQLException
, ClassNotFoundException
{
Class
.forName("com.mysql.jdbc.Driver");
String url
= "jdbc:mysql://localhost:3306/mydb";
Connection conn
= DriverManager
.getConnection(url
, "root",
"root");
Statement stat
= conn
.createStatement();
String sql
= "delete from category where cid=4";
int result
= stat
.executeUpdate(sql
);
System
.out
.println("result = " + result
);
stat
.close();
conn
.close();
}
改:
@Testpublic void testJDBC3() throws SQLException
, ClassNotFoundException
{
Class
.forName("com.mysql.jdbc.Driver");String url
= "jdbc:mysql://localhost:3306/mydb";Connection conn
= DriverManager
.getConnection(url
, "root","root");Statement stat
= conn
.createStatement();String sql
= "update category set cname='測(cè)試2' where cid=4";int result
= stat
.executeUpdate(sql
);System
.out
.println("result = " + result
);stat
.close();conn
.close();}
查:
@Testpublic void testJDBC5() throws SQLException
, ClassNotFoundException
{
Class
.forName("com.mysql.jdbc.Driver");String url
= "jdbc:mysql://localhost:3306/mydb";Connection conn
= DriverManager
.getConnection(url
, "root","root");Statement stat
= conn
.createStatement();String sql
= "select * from category where cid = 3";ResultSet rs
= stat
.executeQuery(sql
);if (rs
.next()) {int cid
= rs
.getInt("cid");String cname
= rs
.getString("cname");System
.out
.println("cid = " + cid
+ ",cname = " +cname
);} else {System
.out
.println("數(shù)據(jù)沒有查到");}rs
.close();stat
.close();conn
.close();}
JDBC工具類
為啥要用到工具類呢?
JDBC操作中有大量的重復(fù)性編碼,為了減少不必要的工作量,引入了工具類,獲得數(shù)據(jù)庫連接操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連接對(duì)象的方法,從而達(dá)到代碼的重復(fù)利用。
該工具類提供方法: public static Connection getConnection()
右鍵src,新建一個(gè)文件,隨便命名
MySQL8.0用戶
jdbc
.driver
=com
.mysql
.jdbc
.Driver
jdbc
:mysql
://localhost
:3306/mydb
?characterEncoding
=utf8
&useSSL
=false&serverTimezone
=UTC
&rewriteBatchedStatments
=true
jdbc
.user
=root
jdbc
.password
=root
MySQL8.0以前版本的用戶
jdbc
.driver
=com
.mysql
.jdbc
.Driver
jdbc
.url
=jdbc
:mysql
://localhost
:3306/mydb
jdbc
.user
=root
jdbc
.password
=root
建立JDBC工具類
public class JDBCUtils2 {private static String driver
;private static String url
;private static String user
;private static String password
;static {try{
InputStream is
=JDBCUtils2
.class.getClassLoader().getResourceAsStream("jdbc.properties");Properties prop
=new Properties();prop
.load(is
);driver
=prop
.getProperty("jdbc.driver");url
=prop
.getProperty("jdbc.url");user
=prop
.getProperty("jdbc.user");password
=prop
.getProperty("jdbc.password");
Class
.forName(driver
);}catch(IOException e
){e
.printStackTrace();}catch(ClassNotFoundException e
){e
.printStackTrace();}}
public static Connection
getConnection()throws SQLException
{Connection conn
=DriverManager
.getConnection(url
,user
,password
);return conn
;}
public static void close(ResultSet rs
,Statement stat
,Connectionconn
)throws SQLException
{if(rs
!=null
){rs
.close();}if(stat
!=null
){stat
.close();}
實(shí)是歸還
;如果Connection是創(chuàng)建的
,就是銷毀
if(conn
!=null
){conn
.close();}}}
使用JDBC工具類 完成查詢
@Test
public void testJDBC6() throws SQLException
{
Connection conn
= JDBCUtils2
.getConnection();
Statement stat
= conn
.createStatement();
ResultSet rs
= stat
.executeQuery("select * from category");
while (rs
.next()) {
int cid
= rs
.getInt("cid");
String cname
= rs
.getString("cname");
System
.out
.println("cid = " + cid
+ ",cname = " + cname
);
}
JDBCUtils2
.close(rs
, stat
, conn
);
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的原生JDBC和工具类的基本实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。