JavaWeb筆記02

三、數據庫設計

1_簡介

1.數據庫設計設計什么?
有哪些表
表里有哪些字段
表和表之間是什么關系

2.表關系有哪幾種?
一對一
一對多(多對一)
多對多

2_多表關系實現

表關系之一對多
一對多 (多對一):
如:部門表和員工表
一個部門對應多個員工,一個員工對應一個部門
實現方式:在多的一方建立外鍵,指向一的一方的主鍵

表關系之多對多
多對多:
如:訂單和商品
一個商品對應多個訂單,一個訂單包含多個商品
實現方式:建立第三張中間表,中間表至少包含兩個外鍵,分別關聯兩方主鍵

表關系之一對一
一對一:
如:用戶和用戶詳情
一對一關系多用于表拆分,將一個實體中經常使用的字段放一張表,不經常使用的字段放另一張表,用于提升查詢性能
實現方式:在任意一方加入外鍵,關聯另一方主鍵,并且設置外鍵為唯一 (UNIQUE)

四、多表查詢

1_簡介

多表查詢
笛卡爾積:取 A,B 集合所有組合情況
多表查詢:從多張表查詢數據
?? ?連接查詢
?? ??? ?內連接:相當于查詢 A B 交集數據
?? ??? ?外連接:
?? ??? ??? ?左外連接:相當于查詢 A 表所有數據和交集部分數據
?? ??? ??? ?右外連接:相當于查詢 B 表所有數據和交集部分數據
?? ?子查詢

2_內連接&外連接

內連接
內連接查詢語法
-- 隱式內連接
SELECT 字段列表 FROM 表1,表2... WHERE 條件; ?

-- 顯式內連接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 條件; ?

內連接相當于查詢 A B 交集數據


外連接
外連接查詢語法
-- 左外連接 ?
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件; ?

-- 右外連接 ?
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件; ?

左外連接:相當于查詢 A 表所有數據和交集部分數據
右外連接:相當于查詢 B 表所有數據和交集部分數據

3_子查詢

子查詢
1.子查詢概念:
查詢中嵌套查詢,稱嵌套查詢為子查詢
2.子查詢根據查詢結果不同,作用不同:
單行單列
多行單列
多行多列


單行單列:作為條件值,使用 = != > < 等進行條件判斷
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查詢); ?

多行單列:作為條件值,使用 in 等關鍵字進行條件判斷
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查詢); ?

多行多列:作為虛擬表
SELECT 字段列表 FROM (子查詢) WHERE 條件; ?

五、事務

簡介四大特征

事務簡介
數據庫的事務(Transaction)是一種機制、一個操作序列,包含了一組數據庫操作命令
事務把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組數據庫命令要么同時成功,要么同時失敗
事務是一個不可分割的工作邏輯單元

事務四大特征
原子性(Atomicity):事務是不可分割的最小操作單位,要么同時成功,要么同時失敗
一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態
隔離性(Isolation):多個事務之間,操作的可見性
持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的

MySQL 事務默認自動提交
-- 查看事務的默認提交方式 ?
SELECT @@autocommit; ?
-- 1 自動提交 ?0 手動提交 ?

-- 修改事務提交方式 ?
set @@autocommit = 0; ?

六、JDBC

1_簡介

JDBC 概念:
JDBC 就是使用 Java 語言操作關系型數據庫的一套 API
全稱: (Java DataBase Connectivity) Java 數據庫連接
JDBC 本質:
官方 (sun 公司) 定義的一套操作所有關系型數據庫的規則,即接口
各個數據庫廠商去實現這套接口,提供數據庫驅動 jar 包
我們可以使用這套接口 (JDBC) 編程,真正執行的代碼是驅動 jar 包中的實現類
JDBC 好處:
各數據庫廠商使用相同的接口,Java 代碼不需要針對不同數據庫分別開發
可隨時替換底層數據庫,訪問數據庫的 Java 代碼基本不變
(右側圖示輔助理解:通過 “MySQL 驅動” 連接 Java 代碼與 MySQL 數據庫 )

2_快速入門

0.創建工程,導入驅動 jar 包
mysql-connector-java-5.1.48.jar

1.注冊驅動
Class.forName("com.mysql.jdbc.Driver");?

這里該類在 MySQL Connector/J 8.0 之后已被棄用,新版本推薦使用?com.mysql.cj.jdbc.Driver

2.獲取連接
Connection conn = DriverManager.getConnection(url, username, password); ?

3.定義 SQL 語句
String sql = "update..."; ?

4.獲取執行 SQL 對象
Statement stmt = conn.createStatement(); ?

5.執行 SQL
stmt.executeUpdate(sql); ?

6.處理返回結果

7釋放資源

3_API詳解DriverManager

DriverManager
DriverManager (驅動管理類) 作用:
注冊驅動
獲取數據庫連接

1.注冊驅動
Class.forName("com.mysql.jdbc.Driver");
查看 Driver 類源碼
static {
? ? try {
? ? ? ? DriverManager.registerDriver(new Driver());
? ? } catch (SQLException var1) {
? ? ? ? throw new RuntimeException("Can't register driver!");
? ? }
}

提示:
MySQL 5 之后的驅動包,可以省略注冊驅動的步驟
自動加載 jar 包中 META-INF/services/java.sql.Driver 文件中的驅動類


2.獲取連接
static Connection ? ? ? ? ? ? ? ?getConnection(String url, String user, String password)

參數
1.url:連接路徑
語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱?參數鍵值對1&參數鍵值對2...
示例:jdbc:mysql://127.0.0.1:3306/db1
細節:
?? ?如果連接的是本機 mysql 服務器,并且 mysql 服務默認端口是 3306,則 url 可以簡寫為:jdbc:mysql:///數據庫名稱?參數鍵值對
?? ?配置 useSSL=false 參數,禁用安全連接方式,解決警告提示
2.user:用戶名
3.password:密碼

4_API詳解Connection

Connection
Connection (數據庫連接對象) 作用:
獲取執行 SQL 的對象
管理事務


1.獲取執行 SQL 的對象
普通執行 SQL 對象
?? ?Statement createStatement()
預編譯 SQL 的執行 SQL 對象:防止 SQL 注入
?? ?PreparedStatement prepareStatement(sql)
執行存儲過程的對象
?? ?CallableStatement prepareCall(sql)


2.事務管理
?? ?MySQL 事務管理
開啟事務:BEGIN; / START TRANSACTION;
提交事務:COMMIT;
回滾事務:ROLLBACK;

MySQL默認自動提交事務

?? ?JDBC 事務管理:Connection 接口中定義了 3 個對應的方法
開啟事務:setAutoCommit(boolean autoCommit):true為自動提交事務;false為手動提交事務,即為開啟事務
提交事務:commit()
回滾事務:rollback()

5_API詳解Statement

Statement
Statement 作用:
執行 SQL 語句
int ?executeUpdate(sql):執行DML、DDL語句 ?
? 返回值: (1) DML語句影響的行數 (2) DDL語句執行后,執行成功也可能返回 0 ?

ResultSet ?executeQuery(sql):執行DQL語句 ?
? 返回值:ResultSet結果集對象 ?

6_API詳解ResultSet

ResultSet
ResultSet (結果集對象) 作用:
封裝了 DQL 查詢語句的結果
ResultSet ?stmt.executeQuery(sql):執行DQL 語句,返回 ResultSet 對象 ?

獲取查詢結果
boolean ?next(): (1) 將光標從當前位置向前移動一行 ?(2) 判斷當前行是否為有效行 ?
返回值: ?
? ? true: 有效行,當前行有數據 ?
? ? false: 無效行,當前行沒有數據 ?

xxx ?getXxx(參數):獲取數據 ?
xxx: 數據類型;如: int getInt(參數);String getString(參數) ?
參數: ?
? ? int: 列的編號,從1開始 ?
? ? String: 列的名稱 ?


使用步驟:
1.游標向下移動一行,并判斷該行否有數據: next ()
2.獲取數據: getXxx (參數)
//循環判斷游標是否是最后一行末尾
while(rs.next()){
? ? //獲取數據
? ? rs.getXxx(參數);
}

package com.itheima.jdbc;import org.junit.Test;import java.sql.*;//JDBC快速入門
public class JDBCDemo7_PreparedStatement {@Testpublic void PreparedStatement() throws Exception {//2. 獲取連接: 如果連接的是本機mysql并且端口是默認的 3306 可以簡化書寫String url = "jdbc:mysql:///test?useSSL=false";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);// 接收用戶輸入 用戶名和密碼String name = "zhangsan";String pwd = "123";// 定義sqlString sql = "select * from tb_user where username = ? and password = ?";// 獲取pstmt對象PreparedStatement pstmt = conn.prepareStatement(sql);// 設置?的值pstmt.setString(1, name);pstmt.setString(2, pwd);// 執行sqlResultSet rs = pstmt.executeQuery();// 判斷登錄是否成功if(rs.next()){System.out.println("登錄成功~");}else{System.out.println("登錄失敗~");}//7. 釋放資源rs.close();pstmt.close();conn.close();}
}

7_API詳解PreparedStatement

PreparedStatement
PreparedStatement 作用:
?? ?預編譯 SQL 語句并執行:預防 SQL 注入問題
SQL 注入
?? ?SQL 注入是通過操作輸入來修改事先定義好的 SQL 語句,用以達到執行代碼對服務器進行攻擊的方法。

① 獲取 PreparedStatement 對象
// SQL語句中的參數值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通過Connection對象獲取,并傳入對應的sql語句
PreparedStatement pstmt = conn.prepareStatement(sql);

② 設置參數值
PreparedStatement對象:setXxx(參數1,參數2):給?賦值 ?
Xxx:數據類型;如 setInt(參數1,參數2) ?
參數: ?
?? ?參數1:?的位置編號,從1開始 ?
?? ?參數2:?的值 ?

③ 執行 SQL
executeUpdate(); / executeQuery(); :不需要再傳遞sql ?


PreparedStatement 原理
PreparedStatement 好處:
1.預編譯 SQL,性能更高
2.防止 SQL 注入:將敏感敏感字符進行轉義
① PreparedStatement 預編譯功能開啟: useServerPrepStmts=true
② 配置 MySQL 執行日志 (重啟 mysql 服務后生效)
log-output=FILE ?
general-log=1 ?
general_log_file="D:\mysql.log" ?
slow-query-log=1 ?
slow_query_log_file="D:\mysql_slow.log" ?
long_query_time=2 ?

PreparedStatement 原理:
1.在獲取 PreparedStatement 對象時,將 sql 語句發送給 mysql 服務器進行檢查,編譯(這些步驟很耗時)
2.執行時就不用再進行這些步驟了,速度更快
3.如果 sql 模板一樣,則只需要進行一次檢查、編譯

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

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

相關文章

Junit_注解_枚舉

文章目錄 一&#xff1a;Junit單元測試測試分類&#xff1a;Junit的使用Before_After 二&#xff1a;注解什么是注解文檔相關的注解IDEA中的javadoc使用&#xff1a;JDK內置的3個注解自定義注解 元注解RetentionTargetRepeatableDocumented&#xff08;用的很少&#xff09;Inh…

將N8N配置為服務【ubuntu】

docker模式不在此討論。這里討論的是node安裝為n8n后&#xff0c;如何安裝為服務&#xff1a; 安裝NODE&#xff08;略&#xff09; 安裝N8N 一個命令解決&#xff1a; npm install n8n -g 安裝服務 vi /etc/systemd/system/n8n.service內容如下 [Unit] Descriptionn8…

Java后端調用外部接口標準流程詳解

在Java后端開發中&#xff0c;調用外部HTTP接口&#xff08;如第三方平臺API、云服務、微服務等&#xff09;是非常常見的需求。實現這個功能通常遵循一套標準的流程&#xff1a; 1. 準備DTO類&#xff08;數據傳輸對象&#xff09; 作用&#xff1a; DTO&#xff08;Data Tra…

星火燎原 數智新生 —— 《GB/T 45341—2025》 × AI大模型 × 全域PaaS創新,領碼SPARK打造行業數字化轉型新范式

【摘要】 數字中國新征程&#xff0c;標準引航數智化。面對企業數字蝶變的關鍵關口&#xff0c;《GB/T 45341—2025 數字化轉型管理 參考架構》引領行業規范發展。愛分析最新數據顯示&#xff0c;中國iPaaS市場規模持續高增長&#xff0c;印證PaaS已成為企業數字化基石。 AI大…

25-7-1 論文學習(1)- Fractal Generative Models 何愷明大佬的論文

分形生成模型 Tianhong Li1 Qinyi Sun1 Lijie Fan2 Kaiming He1 摘要 模塊化是計算機科學的基石&#xff0c;它將復雜函數抽象為原子構建塊。在本文中&#xff0c;我們通過將生成模型抽象為原子生成模塊&#xff0c;引入了新的模塊化層次。類似于數學中的分形&#xff0c;我…

如何讀取運行jar中引用jar中的文件

1.問題發現 項目中有個common包資源文件&#xff0c;然后springboot項目引用了common&#xff0c;那么我們要怎么讀取這個資源了。這里需要考慮三個場景&#xff0c;idea運行時、common jar獨立運行時、springboot引用common后運行時。 2.問題解決 2.1.idea運行時 Protection…

【學習方法】框架質疑學習法:破解專業學習的“知識厚度”困境

今天博主給大家分享一個&#xff0c;我自己發明了一個比較高效的學習方法,名叫“框架質疑學習法” 本文提出的框架質疑學習法&#xff08;Framework Questioning Learning Method&#xff09;為本文作者&#xff0c;也就是我&#xff0c;董翔首次提出。 在軟件專業的學習中&a…

spring-ai 1.0.0 學習(十七)——MCP Client

之前學過了工具調用&#xff08;spring-ai 1.0.0 學習&#xff08;十二&#xff09;——工具調用_springai 1.0 如何判斷調用哪一個tool工具-CSDN博客&#xff09;&#xff0c;今天來看一下MCP MCP是什么 MCP全稱是模型上下文協議&#xff0c;有點繞&#xff0c;通俗點理解&a…

Git 運行.sh文件

1.在項目文件中右擊 Open Git Bash here 顯示&#xff08;base&#xff09;環境 2.激活conda環境 3.復制.sh文件的相對路徑 4.將路徑復制到git終端 先輸入sh和空格&#xff0c;然后右擊后選paste&#xff0c;不要直接ctrl v 5.開始運行

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么區別?

MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么區別&#xff1f; 主要解答詳細解答1. **聚簇索引&#xff08;Clustered Index&#xff09;**2. **非聚簇索引&#xff08;Non-Clustered Index / Secondary Index&#xff09;**3. **對比總結**4. **流程圖&#xff08;查詢過…

[2025CVPR]DE-GANs:一種高效的生成對抗網絡

目錄 引言:數據高效GAN的困境 核心原理:動態質量篩選機制 1. 判別器拒絕采樣(DRS)的再思考 2. 質量感知動態拒絕公式 (1)質量感知階段 (2)動態拒絕階段 模型架構:輕量化設計 技術突破:三大創新點 1. 首創訓練階段DRS 2. 動態拒絕機制 3. 質量重加權策略 …

[面試] 手寫題-數組轉樹

示例數據&#xff1a; const arr [{ id: 1, parentId: null, name: Root },{ id: 2, parentId: 1, name: Child 1 },{ id: 3, parentId: 1, name: Child 2 },{ id: 4, parentId: 2, name: Grandchild 1 }, ]目標生成&#xff1a; const tree [{id: 1,name: Root,children: …

CertiK《Hack3d:2025年第二季度及上半年Web3.0安全報告》(附報告全文鏈接)

CertiK《Hack3d&#xff1a;2025年第二季度及上半年Web3.0安全報告》現已發布&#xff0c;報告顯示&#xff1a;僅2025年上半年&#xff0c;因安全事件導致的損失接近25億美元&#xff1b;截至目前&#xff0c;總損失已超過去年全年水平。整體來看&#xff0c;Web3.0安全形勢依…

反向傳播 梯度消失

反向傳播 backpropagation 反向傳播&#xff08;Backpropagation&#xff09; 是神經網絡訓練中的一種核心算法&#xff0c;用于通過計算誤差并將其傳播回網絡&#xff0c;從而更新神經網絡的參數。通過反向傳播&#xff0c;網絡能夠在每次迭代中逐步調整其參數&#xff08;例…

京東外賣服務商加入方案對比!選擇本地生活服務商系統的優勢,到底在哪?

自入局之日起&#xff0c;京東外賣似乎就一直熱衷于給人驚喜&#xff1a; 先是在上線時規定了“2025年5月1日前入駐的商家&#xff0c;全年免傭金”和“僅限品質堂食商家入駐”&#xff1b; 再是宣布了要為外賣騎手繳納五險一金&#xff0c;并承擔其中的所有成本&#xff1b;…

【RTSP從零實踐】4、使用RTP協議封裝并傳輸AAC

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Bootstrap 安裝使用教程

一、Bootstrap 簡介 Bootstrap 是一個開源的前端框架&#xff0c;由 Twitter 開發&#xff0c;旨在快速開發響應式、移動優先的 Web 頁面。它包含 HTML、CSS 和 JavaScript 組件&#xff0c;如按鈕、導航欄、表單等。 二、Bootstrap 安裝方式 2.1 使用 CDN&#xff08;推薦入…

Java學習第二部分——基礎語法

目錄 一.數據類型 &#xff08;一&#xff09;數值類型&#xff08;用于存儲數字&#xff0c;包括整數和浮點數&#xff09; 1. **整數類型** 2. **浮點類型** &#xff08;二&#xff09;非數值類型&#xff08;非數值類型用于存儲非數字數據&#xff09; 1. **char** 2…

Redis分布式鎖核心原理源碼

文章目錄 概述一、Redis實現分布式鎖1.1、第一版1.2、第二版1.3、第三版1.3、第四版 二、Redisson實現分布式鎖核心源碼分析2.1、加鎖核心源碼2.2、鎖續期核心源碼2.3、重試機制核心源碼2.4、解鎖核心源碼 總結 概述 傳統的單機鎖&#xff08;Synchronized&#xff0c;Reentran…

關于vue2使用elform的rules校驗

在使用vue2開發項目的時候使用element組件的el-form大多數情況都需要用到必填項校驗 舉個栗子&#xff1a; <el-form :model"ruleForm" :rules"rules" ref"ruleForm" label-width"100px" class"demo-ruleForm"><e…