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

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

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

2023-03-13 02:57 作者:山觀那恭喜囧昂貴的  | 我要投稿


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

前言

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

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

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

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

JDBC


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

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

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

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

如何運(yùn)用 JDBC?

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

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

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

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

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

要與數(shù)據(jù)庫樹立銜接,那么就需求構(gòu)建數(shù)據(jù)庫銜接的 URL,這個(gè) URL 由數(shù)據(jù)庫廠商指定,普通契合一種根本格式,即 JDBC協(xié)議+IP地址或域名+端口+數(shù)據(jù)庫稱號(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ù)庫操作。

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

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

// 編寫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ù)庫,返回影響的行數(shù) int row = ps.executeUpdate();

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


conn.close();

CRUD

新增操作

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

查詢操作

ResultSet

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

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

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

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

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

默許的 ResultSet 是不可更新的,同時(shí)它的游標(biāo)只能一步一步 next 下去,只能走一遍,不能回到上一行的。說了默許,那闡明是能夠設(shè)置的,經(jīng)過如下代碼停止設(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ì)回到開頭繼續(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();

分頁查詢

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

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

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

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

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

// 分頁參數(shù) int currentPage = 1, pageSize = 10; // 分頁 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ì)算分頁的總頁數(shù),便于前端傳送是要哪一頁的數(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)過 JDBC 來操作數(shù)據(jù)庫,就有幾個(gè)固定的步驟,先加載數(shù)據(jù)庫驅(qū)動(dòng)程序,接著獲取數(shù)據(jù)庫的銜接,有了這個(gè)銜接后,才干停止 CRUD 的操作,操作后也能夠獲取操作的結(jié)果,最后關(guān)閉這些資源,比方數(shù)據(jù)庫銜接。

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

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

分享到微博請(qǐng)遵守國家法律
台山市| 乐至县| 郎溪县| 太白县| 龙门县| 临沧市| 安庆市| 乌什县| 肃宁县| 九龙县| 兰州市| 吉木萨尔县| 东阳市| 会昌县| 扶风县| 来宾市| 乐安县| 台东县| 剑河县| 上林县| 丽江市| 连山| 盈江县| 九寨沟县| 乾安县| 苏尼特左旗| 西青区| 象州县| 东乡族自治县| 平陆县| 临西县| 台中市| 北海市| 嘉峪关市| 龙口市| 永年县| 大邑县| 铁力市| 永仁县| 额尔古纳市| 崇信县|