工具:
- IDEA
- MySQL8.0或之前版本
文章目錄
- JDBC原理
- JDBC入門案例
- JDBC的API詳解
- JDBC增刪改查操作
- JDBC工具類
JDBC是Java訪問資料庫的標準規范,可以為不同的關系型資料庫提供統?訪問,它由一組用Java撰寫的介面和類組成,
JDBC需要
連接驅動,驅動是兩個設備要進行通信,滿足一定通信資料格式,資料格式由設備提供商規定,設備提供商為設備提供驅動軟體,通過軟體可以與該設備進行通信,
今天我們使用的是mysql的驅動
mysql-connector-java-8.0.20.jar(適配MySQL8.0版本),如果是之前版本的MySQL建議使用應用次數較多的
mysql-connector-java-5.1.38.jar
JDBC核心規范:
- DriverManager:?于注冊驅動
- Connection: 表示與資料庫創建的連接
- Statement: 操作資料庫sql陳述句的物件
- ResultSet: 結果集或?張虛擬表
JDBC原理
Java提供訪問資料庫規范稱為JDBC,而生產廠商提供規范的實作類稱為驅動,JDBC是介面,驅動是介面的實作,沒有驅動將無法完成資料庫連接,從而不能操作資料庫!每個資料庫廠商都需要提供自己的驅動,用來連接自己公司的資料庫,也就是說驅動一般都由資料庫生成廠商提供(也就是在我們上邊匯入的jar包當中),
開發步驟
- 注冊驅動
- 獲得連接
- 獲得執行sql陳述句的物件
- 執行sql陳述句,并回傳結果
- 處理結果
- 釋放資源
JDBC入門案例
首先熟悉一下JDBC的helloworld,
- 準備MySQL資料:
#創建分類表
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('化妝品');
建立一個簡單的表
2. 匯入驅動jar包
在IDEA專案下創建lib目錄
在MVN下好jar包并復制,雙擊新建的lib目錄ctrl+v,jar包就保存到該目錄下,之后右鍵匯入的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 {
@Test
/**
* 1.注冊驅動, 就是把 Driver.class?件加載到記憶體
* mysql8.0之前的版本需要連接的驅動是com.mysql.jdbc.Driver
*/
Class.forName("com.mysql.cj.jdbc.Driver");
/**
* 2.獲得連接
* 引數 url : 需要連接資料庫的地址 jdbc:mysql://IP地址:端?號/要連接的資料庫名稱
* 引數 user : 連接資料庫 使?的?戶名
* 引數 password: 連接資料庫 使?的密碼
*/
String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true";
Connection connection = DriverManager.getConnection(url, "root", "root");
/**
* 3.獲取執?sql陳述句的物件
*/
Statement statement = connection.createStatement();
/**
* 4.執行sql陳述句并回傳結果
*/
String sql1 = "select * from category";
ResultSet resultSet = statement.executeQuery(sql1);
/**
* 5.處理結果
*/
while (resultSet.next()) {
int cid = resultSet.getInt("cid");
String cname = resultSet.getString("cname");
System.out.println("cid = " + cid + ", cname = " + cname);
}
/**
* 6.釋放資源
*/
resultSet.close();
statement.close();
connection.close();
}
}

JDBC的API詳解
- 注冊驅動
有兩種方法:
①DriverManager.registerDriver(new com.mysql.jdbc.Driver());
②Class.forName("com.mysql.jdbc.Driver");
其中第一種辦法不被推薦使用,因為驅動會被注冊兩次,并且會強烈依賴資料庫的驅動jar,通常我們在做開發的時候用的都是第二種方式來注冊驅動 - 獲得鏈接
static Connection getConnection(String url, String user, String password):試圖建立到給定資料庫 URL 的連接
使用引數說明:
- url 需要連接資料庫的位置(網址)
- user用戶名 (要區別于資料庫表名)
- password 密碼
eg:getConnection("jdbc:mysql://localhost:3306/database", "root", "root");
URL是SUN公司和資料庫廠商的一個協議
jdbc:mysql://localhost:3306/database
協議子協議 IP:埠號資料庫
- mysql資料庫:
jdbc:mysql://localhost:3306/database或者jdbc:mysql:///database(默認本機連接)- oracle資料庫:
jdbc:oracle:thin:@localhost:1521:sid
-
java.sql.Connection介面:一個連接
介面的實作在資料庫驅動中,所有與資料庫互動都是基于連接物件的, -
java.sql.Statement介面: 操作sql陳述句,并回傳相應結果
String sql = "某SQL陳述句";
獲取Statement陳述句執?平臺:Statement stmt =con.createStatement();
常用方法:
int executeUpdate(String sql);--執行insert update delete陳述句.
ResultSet executeQuery(String sql);--執行select陳述句.
boolean execute(String sql);--僅當執行select并且有結果時才回傳true,執行其他的陳述句回傳false.
- 處理結果集(注:執行insert、update、delete無需處理)
ResultSet實際上就是一張二維的表格,我們可以呼叫其boolean next()方法指向某行記錄,當第一次呼叫next()方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法來獲取指定列的資料:(與陣列索引從0開始不同,這里索引從1開始)
rs.next();//指向第??
rs.getInt(1);//獲取第??第?列的資料
常用方法:
Object getObject(int index)/Object getObject(String name)獲得任意物件String getString(int index)/String getString(String name)獲得字串int getInt(int index)/int getInt(String name)獲得整型double getDouble(int index)/double getDouble(String name)獲得雙精度浮點型
- 釋放資源
與IO流?樣,使用后的東西都需要關閉!關閉的順序是先得到的后關閉,后得到的先關閉,
rs.close();
stmt.close();
con.close();
JDBC增刪改查操作
- 增:
@Test
public void testJDBC2() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的插?
* 1.注冊驅動
* 2.獲得連接
* 3.獲得執?sql陳述句的物件
* 4.執?sql陳述句, 并回傳結果
* 5.處理結果
* 6.釋放資源
*/
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('測驗')";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
- 刪:
@Test
public void testJDBC4() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的洗掉
* 1.注冊驅動
* 2.獲得連接
* 3.獲得執?sql陳述句的物件
* 4.執?sql陳述句, 并回傳結果
* 5.處理結果
* 6.釋放資源
*/
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();
}
- 改:
@Test
public void testJDBC3() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的更新
* 1.注冊驅動
* 2.獲得連接
* 3.獲得執?sql陳述句的物件
* 4.執?sql陳述句, 并回傳結果
* 5.處理結果
* 6.釋放資源
*/
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='測驗2' where cid=4";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
- 查:
@Test
public void testJDBC5() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的洗掉
* 1.注冊驅動
* 2.獲得連接
* 3.獲得執?sql陳述句的物件
* 4.執?sql陳述句, 并回傳結果
* 5.處理結果
* 6.釋放資源
*/
// 通過id 查詢資料
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("資料沒有查到");
}
rs.close();
stat.close();
conn.close();
}
JDBC工具類
為啥要用到工具類呢?
JDBC操作中有大量的重復性編碼,為了減少不必要的作業量,引入了工具類,獲得資料庫連接操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils,提供獲取連接物件的方法,從而達到代碼的重復利用,
該工具類提供方法: public static Connection getConnection()
- 右鍵src,新建一個檔案,隨便命名


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();
}
}
/**
* 回傳連接物件 Connection
*/
public static Connection getConnection()throws SQLException{
Connection conn=DriverManager.getConnection(url,user,password);
return conn;
}
/**
* 釋放資源
*/
public static void close(ResultSet rs,Statement stat,Connection
conn)throws SQLException{
if(rs!=null){
rs.close();
}
if(stat!=null){
stat.close();
}
//看Connection來?哪?, 如果Connection是從連接池??獲得的, close()?法其
實是歸還;如果Connection是創建的,就是銷毀
if(conn!=null){
conn.close();
}
}
}
- 使用JDBC工具類 完成查詢
@Test
public void testJDBC6() throws SQLException {
/**
* 使?JDBC?具類, 完成查詢所有分類
* 1.通過JDBC?具類, 獲得連接
* 2.獲得執?sql陳述句的物件
* 3.執?sql陳述句, 并回傳結果
* 4.處理結果
* 5.釋放資源
*/
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/85804.html
標籤:其他
