最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Python+Requests零基礎(chǔ)系統(tǒng)掌握接口自動(dòng)化測(cè)試-山重水復(fù)疑無(wú)路

2023-03-13 02:56 作者:bili_68802470155  | 我要投稿


一文快速回憶 Java 操作數(shù)據(jù)庫(kù)的方式-JDBC

前言

Python+Requests零基礎(chǔ)系統(tǒng)掌握接口自動(dòng)化測(cè)試

download:https://www.51xuebc.com/thread-538-1-1.html

數(shù)據(jù)庫(kù)的重要性顯而易見(jiàn),不論是什么系統(tǒng),什么應(yīng)用軟件,也不論它們是 Windows 上的應(yīng)用程序,還是 Web 應(yīng)用程序,存儲(chǔ)(耐久化)和查詢(檢索)數(shù)據(jù)都是中心的功用。

大家學(xué)習(xí)數(shù)據(jù)庫(kù)時(shí),比方 MySQL 這個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng),都是在 CLI(Command Line Interface)上操作數(shù)據(jù)庫(kù)的,如今,我們看看,在 Java Web 中,我們?nèi)绾芜\(yùn)用 Java 去操作數(shù)據(jù)庫(kù)。

JDBC


JDBC(Java Data Base Connectivity)是 Java 操作數(shù)據(jù)庫(kù)的一種標(biāo)準(zhǔn),也是一種 API(與數(shù)據(jù)庫(kù)系統(tǒng)停止通訊的規(guī)范的 API),更是一門技術(shù)。

JDBC 是由一組用 Java 編寫的類和接口組成,對(duì)數(shù)據(jù)庫(kù)的操作提供了根本的辦法。但是,關(guān)于數(shù)據(jù)庫(kù)細(xì)節(jié)的操作,那就是由數(shù)據(jù)庫(kù)的廠商完成的。運(yùn)用 JDBC 操作數(shù)據(jù)庫(kù),需求數(shù)據(jù)庫(kù)廠商提供的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的支持。

那什么是數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序呢?這個(gè)驅(qū)動(dòng)(driver)能夠了解成一種能夠讓數(shù)據(jù)庫(kù)和 Java 彼此停止互動(dòng)的程序。

簡(jiǎn)單來(lái)講,JDBC 提供了一種 API 的標(biāo)準(zhǔn),通知各大數(shù)據(jù)庫(kù)廠商按這種標(biāo)準(zhǔn)來(lái)完成這些 API 詳細(xì)的完成代碼。能夠從兩個(gè)角色的角度來(lái)說(shuō)這個(gè) JDBC。從我們開(kāi)發(fā)人員的角度來(lái)說(shuō),JDBC 為我們開(kāi)發(fā)人員提供了統(tǒng)一的操作數(shù)據(jù)庫(kù)的 API,不用管這些 API 的詳細(xì)完成,專注于 API 的調(diào)用;從數(shù)據(jù)庫(kù)廠商的角度來(lái)說(shuō),JDBC 為他們提供了一套規(guī)范的模型接口,都按這個(gè)接口去做本人的完成。

如何運(yùn)用 JDBC?

JDBC 的運(yùn)用主要有如下幾個(gè)步驟:

  1. 注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(database driver program)到 JDBC 的驅(qū)動(dòng)管理器中。

在銜接數(shù)據(jù)庫(kù)之前,需求將數(shù)據(jù)庫(kù)廠商提供的數(shù)據(jù)庫(kù)驅(qū)動(dòng)類注冊(cè)到 JDBC 的驅(qū)動(dòng)管理器中,普通是把驅(qū)動(dòng)類加載到 JVM 完成的。

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

  1. 構(gòu)建數(shù)據(jù)庫(kù)銜接的 URL。

要與數(shù)據(jù)庫(kù)樹(shù)立銜接,那么就需求構(gòu)建數(shù)據(jù)庫(kù)銜接的 URL,這個(gè) URL 由數(shù)據(jù)庫(kù)廠商指定,普通契合一種根本格式,即 JDBC協(xié)議+IP地址或域名+端口+數(shù)據(jù)庫(kù)稱號(hào)。MySQL 的 URL 是 jdbc:mysql://localhost:3306/dbname

  1. 獲取銜接對(duì)象(Connection 對(duì)象)。

String url = "jdbc:mysql://localhost:3306/dbname"; String username = "root"; String password = "123456"; // Connection 對(duì)象的獲取需求借助 DriverManager 對(duì)象 Connection conn = DriverManager.getConnection(url, username, password);

  1. 停止數(shù)據(jù)庫(kù)操作。

編寫 SQL,然后獲取 PreparedStatement 對(duì)象,對(duì) SQL 語(yǔ)句停止執(zhí)行。SQL 語(yǔ)句的參數(shù)是能夠運(yùn)用占位符 “?” 替代,再經(jīng)過(guò) PreparedStatement 對(duì)象對(duì) SQL 語(yǔ)句中的占位符停止賦值。

Statment 這個(gè)單詞的意義在這里指的就是 SQL 語(yǔ)句。

// 編寫SQL String sql = "INSERT INTO tb_game(name, price, platform) values(?, ?, ?)"; // 獲取 PreparedStatement 對(duì)象 PreparedStatement ps = conn.preparedStatement(sql); // 給占位符賦值 ps.setString(1, "NBA2K"); ps.setDouble(2, 198.0); ps.setString(3, "Windows"); // 執(zhí)行 SQL,將這條數(shù)據(jù)寫入數(shù)據(jù)庫(kù),返回影響的行數(shù) int row = ps.executeUpdate();

運(yùn)用 PreparedStatement 對(duì)象對(duì) SQL 語(yǔ)句的占位符參數(shù)賦值,其參數(shù)的下標(biāo)是從 1 開(kāi)端的。
  1. 關(guān)閉銜接


conn.close();

CRUD

新增操作

新增操作,就是上面的插入操作,請(qǐng)看上面。

查詢操作

ResultSet

運(yùn)用 JDBC 查詢數(shù)據(jù),與插入數(shù)據(jù)的操作流程根本一樣,但是執(zhí)行查詢操作后需求經(jīng)過(guò)一個(gè)對(duì)象來(lái)接納查詢的結(jié)果,這個(gè)對(duì)象就是 ResultSet (結(jié)果集)。

ResultSet 是 JDBC API 中封裝的對(duì)象,從數(shù)據(jù)表中查到的一切記載都會(huì)放在這個(gè)匯合中。ResultSet 中維護(hù)著一個(gè) cursor(游標(biāo))來(lái)指向當(dāng)前的數(shù)據(jù)行(數(shù)據(jù)記載),初始化的時(shí)分,這個(gè)游標(biāo)指向第一行的前一行,能夠經(jīng)過(guò) next() 辦法來(lái)挪動(dòng)游標(biāo),讓游標(biāo)指向下一行。

調(diào)用這個(gè) next() 它返回的是一個(gè)布爾值,為 true 闡明 ResultSet 中還有下一行的數(shù)據(jù),為 false 闡明沒(méi)有,所以能夠分離 while 循環(huán)運(yùn)用這個(gè)辦法來(lái)遍歷整個(gè) ResultSet。

// 由于一開(kāi)端的游標(biāo)在第一行的前一行,所以執(zhí)行 next() 后,游標(biāo)就指向第一行的數(shù)據(jù)了 while (resultSet.next()) { // 處置結(jié)果集中每一行的數(shù)據(jù) }

獲取到 ResultSet 對(duì)象后,挪動(dòng)了光標(biāo)指定了數(shù)據(jù)行,然后經(jīng)過(guò) ResultSet 對(duì)象提供的一系列 getXxxx() 辦法來(lái)獲取當(dāng)前行的數(shù)據(jù),比方 resultSet.getInt("price") 獲取當(dāng)前行中字段名為 price 的數(shù)據(jù)。

默許的 ResultSet 是不可更新的,同時(shí)它的游標(biāo)只能一步一步 next 下去,只能走一遍,不能回到上一行的。說(shuō)了默許,那闡明是能夠設(shè)置的,經(jīng)過(guò)如下代碼停止設(shè)置:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); // rs 是能夠滾動(dòng)的,也就是游標(biāo)走到最后又會(huì)回到開(kāi)頭繼續(xù)走,并且它的內(nèi)容是能夠被改動(dòng)的

查詢

找到價(jià)錢大于50塊錢的一切游戲:

String sql = "SELECT id, name, price FROM tb_game WHERE price > ?"; PreparedStatement ps = conn.preparedStatement(sql); ps.setDouble(1, 50); // 執(zhí)行查詢 ResultSet rs = ps.executeQuery(sql); List gameList = new ArrayList<>(); // 遍歷結(jié)果集 while (rs.next()) { Game game = new Game(); // 獲取當(dāng)前行中字段名為 id 的數(shù)據(jù),并賦值到 game 對(duì)象中 game.setId(rs.getInt("id")); game.setName(rs.getString("name")); game.setPrice(rs.getDouble("price")); gameList.add(game); } System.out.println(gameList);

修正(更新)操作

修正(更新)數(shù)據(jù)的操作,也是和插入數(shù)據(jù)的操作是相似的。

更新 ID 為 3 的數(shù)據(jù)記載,修正其價(jià)錢為 298 塊錢。

String sql = "UPDATE tb_game SET price = ? WHERE id = ?"; PreparedStatement ps = conn.preparedStatement(sql); ps.setDouble(1, 298); ps.setInt(2, 3); int row = ps.executeUpdate();

刪除操作

同理。

String sql = "DELETE FROM tb_game WHERE id = ?"; PreparedStatement ps = conn.preparedStatement(sql); ps.setInt(1, 1); int row = ps.executeUpdate();

分頁(yè)查詢

在 Java Web 中數(shù)據(jù)量十分大的狀況下,是不利于將一切數(shù)據(jù)都展現(xiàn)到一個(gè)頁(yè)面中的,查看不便當(dāng),又占用系統(tǒng)資源。此時(shí)就需求對(duì)數(shù)據(jù)停止分頁(yè)查詢,同時(shí),以后的工作中,能夠說(shuō)大局部的業(yè)務(wù)場(chǎng)景都會(huì)觸及到分頁(yè)查詢。

在 MySQL 中,分頁(yè)能夠經(jīng)過(guò)其本身的 LIMIT 關(guān)鍵字來(lái)完成:

SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT 0, 10; // 從表中下標(biāo)0開(kāi)端(第一行的下標(biāo)為0),限制返回10條記載

目前分頁(yè)觸及到這樣的兩個(gè)參數(shù):當(dāng)前頁(yè)碼和頁(yè)面大小。

觸及的 SQL 語(yǔ)句:SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT 當(dāng)前頁(yè)碼, 頁(yè)面大小

// 分頁(yè)參數(shù) int currentPage = 1, pageSize = 10; // 分頁(yè) SQL String sql = "SELECT * FROM tb_game WHERE price > 50 ORDER BY price DESC LIMIT ?, ?"; PreparedStatement ps = conn.preparedStatement(sql); // 賦值 ps.setInt(1, (page - 1) * pageSize); ps.setInt(2, pageSize); ResultSet rs = ps.executeQuery();

與此同時(shí),還需求計(jì)算獲取的數(shù)據(jù)的總記載數(shù),用于計(jì)算分頁(yè)的總頁(yè)數(shù),便于前端傳送是要哪一頁(yè)的數(shù)據(jù)給后端。

int count = 0; String sql = "SELECT COUNT(*) FROM tb_game WHERE price > 50"; PreparedStatement ps = conn.preparedStatement(sql); ResultSet rs = ps.executeQuery(); if (rs.next()) { // 獲取總記載數(shù),getInt(1) 是獲取第一列的數(shù)據(jù) count = rs.getInt(1); }

總結(jié)

目前在 Java 中經(jīng)過(guò) JDBC 來(lái)操作數(shù)據(jù)庫(kù),就有幾個(gè)固定的步驟,先加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,接著獲取數(shù)據(jù)庫(kù)的銜接,有了這個(gè)銜接后,才干停止 CRUD 的操作,操作后也能夠獲取操作的結(jié)果,最后關(guān)閉這些資源,比方數(shù)據(jù)庫(kù)銜接。

不過(guò),在日常的開(kāi)發(fā)中,根本不會(huì)用到原生的 JDBC 來(lái)操作數(shù)據(jù)庫(kù),普通我們有多種選擇,能夠運(yùn)用 JdbcTemplate、Hibernate、MyBatis、JPA(Java Persistence API,Java 耐久化 API)或者是其他恣意的耐久化框架。

Python+Requests零基礎(chǔ)系統(tǒng)掌握接口自動(dòng)化測(cè)試-山重水復(fù)疑無(wú)路的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
亚东县| 茂名市| 安平县| 安新县| 青龙| 昌图县| 惠州市| 乌海市| 上高县| 榕江县| 丹巴县| 常宁市| 玉山县| 瑞丽市| 武平县| 浦县| 红河县| 新巴尔虎左旗| 离岛区| 靖西县| 扎兰屯市| 鄂温| 绥芬河市| 霍邱县| 六安市| 斗六市| 延川县| 兰溪市| 沈阳市| 上高县| 荣成市| 馆陶县| 黔江区| 孟津县| 黄陵县| 蕲春县| 嘉禾县| 东安县| 宣汉县| 商洛市| 博客|