Java入門系列-26-JDBC

認識 JDBC

JDBC (Java DataBase Connectivity) 是 Java 數據庫連接技術的簡稱,用于連接常用數據庫。

Sun 公司提供了 JDBC API ,供程序員調用接口和類,集成在 java.sqljavax.sql 包中。

Sun 公司還提供了 DriverManager 類用來管理各種不同的JDBC驅動。

不同數據庫廠商提供各自的JDBC驅動,所以我們想要連接數據庫除了要了解 JDBC API 還需要下載各數據庫廠商的驅動 jar 包。

JDBC API

JDBC API主要用于與數據庫建立連接、執行SQL語句、處理結果,其中核心類和接口如下:

  • DriverManager:依據數據庫的不同,管理JDBC驅動
  • Connection:負責連接數據庫并擔任傳送數據的任務
  • Statement:由 Connection 產生、負責執行SQL語句
  • ResultSet:負責保存 Statement 執行后所產生的查詢結果

JDBC 編碼模板

1、與數據庫建立連接并獲取連接

Connection connection=DriverManager.getConnection(URL,數據庫用戶名,密碼);

2、發送SQL語句,得到執行結果

Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery(SQL語句);

3、處理返回結果

while(rs.next()){int a=rs.getInt("a");String b=rs.getString("b");Date d=rs.getDate("d");……
}

4、釋放資源

rs.close();
stmt.close();
connection.close();

使用 JDBC 連接到 MySQL 數據庫

本例適合已經會使用 MySQL 數據庫的同學,首先我們下載 JDBC 的驅動 jar 包。這個網址提供了 MySQL 各種語言連接數據庫的驅動 https://www.mysql.com/products/connector/,MySQL Connector / J 8.0與從MySQL 5.5開始的所有MySQL版本兼容。
8.0下載地址
下載完成后解壓,后將jar添加依賴到項目中。

連接到MySQL數據庫

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DemoConnectMySQL {public static void main(String[] args) {//連接MySQL的URLString url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";//MySQL數據庫用戶名String user="root";//MySQL數據庫的密碼String password="1234";Connection connection=null;try {connection=DriverManager.getConnection(url, user, password);System.out.println("連接成功");} catch (SQLException e) {e.printStackTrace();}finally {try {connection.close();System.out.println("連接關閉");} catch (SQLException e) {e.printStackTrace();}}}
}

url指定數據庫的連接字符串,格式為:
jdbc:數據庫://ip或域名:端口號?參數&參數……
這里的參數 useUnicode=true 使用Unicode字符,characterEncoding=utf8 設置編碼防止中文亂碼,serverTimezone=UTC 設置時區,useSSL=false 不使用SSL

jdbc4.0不需要加載驅動

PreparedStatement 增刪改

PreparedStatement 繼承了 Statement 接口,表示預編譯的 SQL 語句對象,SQL 語句被預編譯并存儲在 PreparedStatement 對象中,可以使用此對象多次高效地執行該語句。(還避免了 SQL 注入的隱患)

先準備好數據庫 books

表 book

字段類型屬性
id整數主鍵,自增
bName字符串非空
price小數非空

腳本也準備好了

#創建數據庫
CREATE DATABASE books;
USE books;
#創建表
CREATE TABLE book ( id INT primary key  auto_increment, bName VARCHAR ( 255 ) NOT NULL, price FLOAT NOT NULL 
);

PreparedStatement添加數據

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestInsert {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql語句String sql="insert into book(bName,price) values (?,?)";pstmt=connection.prepareStatement(sql);//傳入參數pstmt.setString(1, "《java入門到改行》");pstmt.setFloat(2, 11.11f);int result=pstmt.executeUpdate();System.out.println("受影響行數:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

說明:

1、連接字符串要修改數據庫名字為 books

String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";

2、插入數據庫的數據不能拼接而是要用 ? 代替

String sql="insert into book(bName,price) values (?,?)";

3、? 代替的參數要通過 set類型(位置,值) 傳入

pstmt.setString(1, "《java入門到改行》");
pstmt.setFloat(2, 11.11f);

pstmt.setXxx()的位置從 1 開始!

4、增刪改的SQL語句都使用這個方法,返回受影響行數

int result=pstmt.executeUpdate();

刪除數據

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestDelete {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql語句String sql="delete from book where id=?";pstmt=connection.prepareStatement(sql);//傳入參數 要刪除idpstmt.setInt(1, 1);int result=pstmt.executeUpdate();System.out.println("受影響行數:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

修改數據

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestUpdate {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql語句String sql="update book set bName=?,price=? where id=?";pstmt=connection.prepareStatement(sql);//傳入參數 要刪除idpstmt.setString(1, "《MySQL從刪庫到跑路》");pstmt.setFloat(2, 16.66f);pstmt.setInt(3, 2);int result=pstmt.executeUpdate();System.out.println("受影響行數:"+result);} catch (SQLException e) {e.printStackTrace();}finally {if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

增、刪、改操作的寫法都一樣,都調用 executeUpdate() 方法返回一個受影響行數,唯一不同的 SQL語句。

PreparedStatement 查詢數據

查詢數據需要用到 ResultSet 類保存返回的結果集,我們獲取數據要操作 ResultSet 獲取。

ResultSet 常用方法

方法名說明
boolean next()將游標從當前位置向下移動一行
void close()關閉 ResultSet 對象
int getInt(int colIndex)以int形式獲取結果集當前行指定列號值
int getInt(String colLabel)以int形式獲取結果集當前行指定列名值
float getFloat(String colLabel)以float形式獲取結果集當前行指定列名值
String getString(String colLabel)以 String 形式獲取結果集當前行指定列名值
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class TestSelect {public static void main(String[] args) {Connection connection=null;PreparedStatement pstmt=null;ResultSet rs=null;String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";String user="root";String password="1234";try {connection=DriverManager.getConnection(url,user,password);//sql語句String sql="select bName,price,id from book where id=?";pstmt=connection.prepareStatement(sql);//傳入查詢條件pstmt.setInt(1, 2);rs=pstmt.executeQuery();while(rs.next()) {//通過列名獲取列的值int id=rs.getInt("id");//通過位置獲取列的值String bName=rs.getString(1);float price=rs.getFloat("price");System.out.println(id+" "+bName+" "+price);}} catch (SQLException e) {e.printStackTrace();}finally {if(rs!=null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (pstmt!=null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}
}

關閉對象時注意關閉的順序,后使用的先關閉:rs.close()->pstmt.close()->connection.close()

ResultSet 對象存在一個光標,光標所指行為當前行。想要獲取列的數據需要先指向一行,所以要先指定 next() 方法用于指向一行,如果沒有數據next()方法返回false,有數據返回true。

使用 getXxx() 方法獲取列的數據時建議寫列名,這樣好識別

轉載于:https://www.cnblogs.com/AIThink/p/9940542.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3.19PMP試題每日一題

在房屋建造過程中,應該先完成衛生管道工程,才能進行電氣工程施工,這是一個:A、強制性依賴關系B、選擇性依賴關系C、外部依賴關系D、內部依賴關系 作者:Tracy19890201(同微信號)轉載于:https://…

Can't find temporary directory:internal error

今天我機子上的SVN突然沒有辦法進行代碼提交了,出現的錯誤提示信息為: Error:Cant find temporary directory:internal error 然后試了下其他的SVN源,發現均無法提交,并且update時也出現上面的錯誤信息。對比項目文件…

snowflake 數據庫_Snowflake數據分析教程

snowflake 數據庫目錄 (Table of Contents) Introduction 介紹 Creating a Snowflake Datasource 創建雪花數據源 Querying Your Datasource 查詢數據源 Analyzing Your Data and Adding Visualizations 分析數據并添加可視化 Using Drilldowns on Your Visualizations 在可視化…

jeesite緩存問題

jeesite,其框架主要為: 后端 核心框架:Spring Framework 4.0 安全框架:Apache Shiro 1.2 視圖框架:Spring MVC 4.0 服務端驗證:Hibernate Validator 5.1 布局框架:SiteMesh 2.4 工作流引擎…

高級Python:定義類時要應用的9種最佳做法

重點 (Top highlight)At its core, Python is an object-oriented programming (OOP) language. Being an OOP language, Python handles data and functionalities by supporting various features centered around objects. For instance, data structures are all objects, …

Java 注解 攔截器

場景描述:現在需要對部分Controller或者Controller里面的服務方法進行權限攔截。如果存在我們自定義的注解,通過自定義注解提取所需的權限值,然后對比session中的權限判斷當前用戶是否具有對該控制器或控制器方法的訪問權限。如果沒有相關權限…

醫療大數據處理流程_我們需要數據來大規模改善醫療流程

醫療大數據處理流程Note: the fictitious examples and diagrams are for illustrative purposes ONLY. They are mainly simplifications of real phenomena. Please consult with your physician if you have any questions.注意:虛擬示例和圖表僅用于說明目的。 …

What's the difference between markForCheck() and detectChanges()

https://stackoverflow.com/questions/41364386/whats-the-difference-between-markforcheck-and-detectchanges轉載于:https://www.cnblogs.com/chen8840/p/10573295.html

ASP.NET Core中使用GraphQL - 第七章 Mutation

ASP.NET Core中使用GraphQL - 目錄 ASP.NET Core中使用GraphQL - 第一章 Hello WorldASP.NET Core中使用GraphQL - 第二章 中間件ASP.NET Core中使用GraphQL - 第三章 依賴注入ASP.NET Core中使用GraphQL - 第四章 GrahpiQLASP.NET Core中使用GraphQL - 第五章 字段, 參數, 變量…

POM.xml紅叉解決方法

方法/步驟 1用Eclipse創建一個maven工程,網上有很多資料,這里不再啰嗦。 2右鍵maven工程,進行更新 3在彈出的對話框中勾選強制更新,如圖所示 4稍等片刻,pom.xml的紅叉消失了。。。

JS前臺頁面驗證文本框非空

效果圖&#xff1a; 代碼&#xff1a; 源代碼&#xff1a; <script type"text/javascript"> function check(){ var xm document.getElementById("xm").value; if(xm null || xm ){ alert("用戶名不能為空"); return false; } return …

python對象引用計數器_在Python中借助計數器對象對項目進行計數

python對象引用計數器前提 (The Premise) When we deal with data containers, such as tuples and lists, in Python we often need to count particular elements. One common way to do this is to use the count() function — you specify the element you want to count …

套接字設置為(非)阻塞模式

當socket 進行TCP 連接的時候&#xff08;也就是調用connect 時&#xff09;&#xff0c;一旦網絡不通&#xff0c;或者是ip 地址無效&#xff0c;就可能使整個線程阻塞。一般為30 秒&#xff08;我測的是20 秒&#xff09;。如果設置為非阻塞模式&#xff0c;能很好的解決這個…

經典問題之「分支預測」

問題 來源 &#xff1a;stackoverflow 為什么下面代碼排序后累加比不排序快&#xff1f; public static void main(String[] args) {// Generate dataint arraySize 32768;int data[] new int[arraySize];Random rnd new Random(0);for (int c 0; c < arraySize; c)data…

vi

vi filename :打開或新建文件&#xff0c;并將光標置于第一行首 vi n filename &#xff1a;打開文件&#xff0c;并將光標置于第n行首 vi filename &#xff1a;打開文件&#xff0c;并將光標置于最后一行首 vi /pattern filename&#xff1a;打開文件&#xff0c;并將光標置…

數字圖像處理 python_5使用Python處理數字的高級操作

數字圖像處理 pythonNumbers are everywhere in our daily life — there are phone numbers, dates of birth, ages, and other various identifiers (driver’s license and social security numbers, for example).電話號碼在我們的日常生活中無處不在-電話號碼&#xff0c;…

05精益敏捷項目管理——超越Scrum

00.我們不是不知道它會給我們帶來麻煩&#xff0c;只是沒想到麻煩會有這么多。——威爾.羅杰斯 01.知識點&#xff1a; a.Scrum是一個強大、特意設計的輕量級框架&#xff0c;器特性就是將軟件開發中在制品的數量限制在團隊層級&#xff0c;使團隊有能力與業務落班一起有效地開…

帶標題的圖片輪詢展示

為什么80%的碼農都做不了架構師&#xff1f;>>> <div> <table width"671" cellpadding"0" cellspacing"0"> <tr height"5"> <td style"back…

linux java 查找進程中的線程

這里對linux下、sun(oracle) JDK的線程資源占用問題的查找步驟做一個小結&#xff1b;linux環境下&#xff0c;當發現java進程占用CPU資源很高&#xff0c;且又要想更進一步查出哪一個java線程占用了CPU資源時&#xff0c;按照以下步驟進行查找&#xff1a;(一)&#xff1a;通過…

定位匹配 模板匹配 地圖_什么是地圖匹配?

定位匹配 模板匹配 地圖By Marie Douriez, James Murphy, Kerrick Staley瑪麗杜里茲(Marie Douriez)&#xff0c;詹姆斯墨菲(James Murphy)&#xff0c;凱里克史塔利(Kerrick Staley) When you request a ride, Lyft tries to match you with the driver most suited for your…