日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Mysql(五) JDBC

發(fā)布時(shí)間:2025/4/16 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql(五) JDBC 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、JDBC

? ? JDBC(Java DataBase Connectivity) Java 數(shù)據(jù)庫(kù)連接API
? ? JDBC完成三件事:?與一個(gè)數(shù)據(jù)庫(kù)連接 ? ? ? ? ?向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句 ? ? ? ? ? ? ? ?處理數(shù)據(jù)庫(kù)返回的結(jié)果?
? ??Java.sql包提供了JDBC API,聲明了訪問數(shù)據(jù)庫(kù)的接口和類,?可以通過它編寫訪問數(shù)據(jù)庫(kù)的程序。?
? ??JDBC API只是定義了相關(guān)的規(guī)范(提供相應(yīng)的接口),并不?能直接訪問數(shù)據(jù)庫(kù),它依賴于數(shù)據(jù)庫(kù)廠商提供具體的實(shí)現(xiàn)。?
? ?

? ? ?1、相關(guān)實(shí)現(xiàn)

? ? ? ??

? ? 2、Java.sql包中的接口和類 :

? ? ? ?Driver接口和DriverManager
? ? ? ?Connection接口
? ? ? ?Statement接口
? ? ? ?PreparedStatement接口
? ? ? ?ResultSet接口

? ? ? ?(1)Driver接口和DriverManager

所有JDBC驅(qū)動(dòng)程序都必須實(shí)現(xiàn)Driver接口, JDBC驅(qū)動(dòng)程序由?數(shù)據(jù)庫(kù)廠商提供。
DriverManager用來建立和數(shù)據(jù)庫(kù)的連接已經(jīng)管理JDBC驅(qū)動(dòng)?程序。
getConnection(String url,String user,String pwd):建立和?數(shù)據(jù)庫(kù)的連接,返回Connection對(duì)象?

? ? ?(2)Connection接口

Connection接口代表Java程序和數(shù)據(jù)庫(kù)的連接, Connection接口常用方法:
? createStatement():創(chuàng)建并返回Statement對(duì)象
? prepareStatement(String sql):創(chuàng)建并返回?PreparedStatement對(duì)象?

? ? (3)Statement接口

Statement用來執(zhí)行SQL語(yǔ)句。?
? 對(duì)于insertupdatedelete語(yǔ)句,可以調(diào)用?executeUpdate(String sql)方法,該方法返回一個(gè)int型數(shù)據(jù),?表示受影響的記錄數(shù)。
? 對(duì)于select語(yǔ)句,可以調(diào)用executeQuery(String sql)方法,?該方法返回一個(gè)ResultSet對(duì)象(查詢結(jié)果集)?

? ? (4)PreparedStatement接口

PreparedStatement也用來執(zhí)行SQL語(yǔ)句,不同的是,其可以使?用動(dòng)態(tài)的參數(shù)(?)。
在訪問數(shù)據(jù)庫(kù)時(shí),如果某條SQL語(yǔ)句被多次執(zhí)行,但每次都參?數(shù)不同,在這種情況下,使用PreparedStatementStatement?更方便,?PreparedStatement允許sql語(yǔ)句中包含參數(shù)。

? ? (5)ResultSet接口
ResultSet接口表示select語(yǔ)句查詢得到的記錄結(jié)果集合,ResultSet接口的記錄行號(hào)從1開始,一個(gè)Statement對(duì)象在同?一時(shí)刻只能打開一個(gè)ResultSet對(duì)象。
? 調(diào)用ResultSetnext()方法,可以進(jìn)行順序查詢,可以使游?標(biāo)定位到下一條記錄,該方法返回一個(gè)boolean型數(shù)據(jù),當(dāng)?游標(biāo)移動(dòng)到最后一行之后返回false
? 調(diào)用ResultSetgetXXX()方法,可以獲取某個(gè)字段的值。?XXX為字段的類型。?

? ? 3、JDBC程序訪問數(shù)據(jù)庫(kù)的步驟

? ? 4、驅(qū)動(dòng)類名

驅(qū)動(dòng)類的名稱由數(shù)據(jù)庫(kù)廠商提供,不同的數(shù)據(jù)庫(kù)廠商類名也不?相同。?

MySQL驅(qū)動(dòng)類: com.mysql.jdbc.Driver
Oracle驅(qū)動(dòng)類: oracle.jdbc.driver.OracleDriver
SqlServer驅(qū)動(dòng)類: com.microsoft.sqlserver.jdbc.SQLServerDriver

? ?5、建立與數(shù)據(jù)庫(kù)的連接

Connection con =?DriverManager.getConnection(url,user,password);
url表示連接數(shù)據(jù)庫(kù)的地址,不同的數(shù)據(jù)庫(kù), url也不相同。
userpassword分別表示連接數(shù)據(jù)庫(kù)的用戶名和密碼。
url的一般形式為:
jdbc:drivertype:driversubtype://parameters
drivertype表示驅(qū)動(dòng)程序的類型, driversubtype是子類型,?parameter通常用來設(shè)定數(shù)據(jù)庫(kù)服務(wù)器的IP地址、端口號(hào)和數(shù)據(jù)?庫(kù)的名稱
?

? 6、事務(wù)處理
在數(shù)據(jù)庫(kù)操作中,一項(xiàng)事務(wù)是指由一條或多條對(duì)數(shù)據(jù)庫(kù)更新?的SQL語(yǔ)句所組成的不可分割的工作單元。?

只有當(dāng)事務(wù)中的所有操作都正常完成,整個(gè)事務(wù)才能被提交?到數(shù)據(jù)庫(kù)。如果有一項(xiàng)操作沒有完成,則必須撤銷整個(gè)事務(wù)。?

事務(wù)的原則:要么全部完成,要么什么都不做。


Connection類中提供了3個(gè)控制事務(wù)的方法:

setAutoCommit(boolean autoCommit):設(shè)置是否自動(dòng)提交事?務(wù)
commit():提交事務(wù)
rollback():撤銷事務(wù)
默認(rèn)情況下,事務(wù)為自動(dòng)提交。即每一條數(shù)據(jù)庫(kù)更新的SQL?語(yǔ)句代表一項(xiàng)事務(wù),操作成功后,系統(tǒng)將自動(dòng)調(diào)用commit()?來提交,否則將調(diào)用rollback()來撤銷事務(wù)。?
可以通過調(diào)用setAutoCommit(false)來禁止自動(dòng)提交事務(wù)。?可以把多條更新數(shù)據(jù)庫(kù)的SQL語(yǔ)句作為一個(gè)事務(wù),在所有操?作完成后,調(diào)用commit()來進(jìn)行整體提交。若其中一項(xiàng)SQL操作失敗,就不會(huì)執(zhí)行commit(),而是產(chǎn)生相應(yīng)的SQLException,此時(shí)就可以在捕獲異常的代碼塊中調(diào)用rollback()方法撤銷事務(wù)。?

? ?7、數(shù)據(jù)庫(kù)連接池

之前的數(shù)據(jù)庫(kù)連接方式,是在需要時(shí)創(chuàng)建一個(gè)連接,當(dāng)訪問?數(shù)據(jù)庫(kù)結(jié)束后,即將創(chuàng)建的連接銷毀。?

數(shù)據(jù)庫(kù)的連接池的基本思想:在數(shù)據(jù)源中為數(shù)據(jù)庫(kù)連接建立?多個(gè)連接,保存在連接池(connect pool)中;預(yù)先在連接池?中放入一定數(shù)量的連接,當(dāng)Java程序訪問數(shù)據(jù)庫(kù)時(shí),只需從?連接池中取出一個(gè)空閑狀態(tài)的數(shù)據(jù)庫(kù)連接。當(dāng)程序訪問數(shù)據(jù)?庫(kù)結(jié)束,再將數(shù)據(jù)庫(kù)連接放回連接池。這樣就可以提高訪問
數(shù)據(jù)庫(kù)的效率,因?yàn)檫B接池只是將連接回收,而不是銷毀。?要清楚,數(shù)據(jù)庫(kù)連接的創(chuàng)建與銷毀是非常耗費(fèi)資源的。?

二、

1、

/** 通過Java連接MySQL數(shù)據(jù)庫(kù)。*/ package day23;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class ConnectionTest {public static void main(String[] args) {Connection con = null;Statement st = null;try {// 可以創(chuàng)建驅(qū)動(dòng)類的對(duì)象來令驅(qū)動(dòng)類初始化,只是創(chuàng)建// 的對(duì)象是多余的(根本不使用該對(duì)象)// new com.mysql.jdbc.Driver();// 加載并初始化驅(qū)動(dòng)類。Class.forName("com.mysql.jdbc.Driver");// 獲得數(shù)據(jù)庫(kù)的連接,返回Connection接口類型的對(duì)象。con = DriverManager.getConnection("jdbc:mysql://000.0.0.0:3306/test?useSSL=false", "root", "");// System.out.println(con);// 創(chuàng)建可執(zhí)行的sql語(yǔ)句。st = con.createStatement();// 執(zhí)行更新語(yǔ)句。返回受影響的記錄數(shù)。int count = st.executeUpdate("insert into student(id, name) values (8, '新增')");System.out.println(count);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {// 資源釋放的順序:// 先創(chuàng)建的后釋放,后創(chuàng)建的先釋放。if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (con != null) {try {con.close();} catch (SQLException e) {e.printStackTrace();}}}} }

  

2、TryWithResources:

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class TryWithResources {public static void main(String[] args) {try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}try (Connection con = DriverManager.getConnection("jdbc:mysql://***.0.0.1:3306/test?useSSL=false", "root", "");Statement st = con.createStatement();ResultSet rs = st.executeQuery("select id, name, age, sex from student");) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 判斷是否有下一條記錄,如果存在,返回true,同時(shí)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 移動(dòng)游標(biāo)(指針),使其指向下一條記錄。如果不存在,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 返回false。

while (rs.next()) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 根據(jù)字段的索引獲得當(dāng)前記錄該字段的值。索引從1開始。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // int id = rs.getInt(1);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 根據(jù)字段的名字獲得當(dāng)前記錄該字段的值。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int id = rs.getInt("id");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String name = rs.getString("name");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int age = rs.getInt("age");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String sex = rs.getString("sex");

}} catch (SQLException e) {e.printStackTrace();}}}

  3、PreparedStatement

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class DBUtil {public static Connection getConnection() {Connection con = null;try {Class.forName("com.mysql.jdbc.Driver");con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?useSSL=false", "root", "");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return con;}public static void release(ResultSet rs, Statement st, Connection con) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}if (con != null) {try {con.close();} catch (SQLException e) {e.printStackTrace();}}} }

  

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement;public class PreparedTest {public static void main(String[] args) {}public void insert(int id, String name, int age, String sex) {try (Connection con = DBUtil.getConnection(); Statement st = con.createStatement();) {String sql = "insert into student(id, name, age, sex) values (" + id + ", '" + name + "'," + age + ",'"+ sex + "')";StringBuilder bu = new StringBuilder();bu.append("insert into student(id, name, age, sex) values (").append(id).append(",'").append(name).append("',").append(age).append(",'").append(sex).append("')");st.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}}/** PreparedStatement與Statement* PreparedStatement是預(yù)處理的SQL語(yǔ)句對(duì)象,當(dāng)重復(fù)* 執(zhí)行時(shí),PreparedStatement在性能上可能會(huì)好于* Statement(這要取決于底層數(shù)據(jù)庫(kù)是否支持預(yù)處理)。* PreparedStatement在程序的可讀性上,也好于* Statement,因此,我們應(yīng)該總是有限的考慮使用* PreparedStatement。*/public void insert2(int id, String name, int age, String sex) {try (Connection con = DBUtil.getConnection();PreparedStatement ps = con.prepareStatement("insert into student(id, name, age, sex) values(?,?,?,?)")) {ps.setInt(1, id);ps.setString(2, name);ps.setInt(3, age);ps.setString(4, sex);ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}}

  4、Transaction

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;public class Transaction {public static void main(String[] args) {Connection con = DBUtil.getConnection();try (PreparedStatement ps1 = con.prepareStatement("update account set money = money - 100 where id = 1");PreparedStatement ps2 = con.prepareStatement("updatedd account set money = money + 100 where id = 2");) {// 將自動(dòng)提交設(shè)置為假。con.setAutoCommit(false);ps1.executeUpdate();ps2.executeUpdate();// 事務(wù)執(zhí)行完畢,沒有異常,提交。con.commit();con.setAutoCommit(true);} catch (SQLException e) {try {// 失敗,進(jìn)行回滾操作。恢復(fù)到事務(wù)執(zhí)行之前的// 狀態(tài)。con.rollback();con.setAutoCommit(true);} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}}}

  






















?

轉(zhuǎn)載于:https://www.cnblogs.com/liuwei6/p/7280399.html

總結(jié)

以上是生活随笔為你收集整理的Mysql(五) JDBC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。