JavaWeb后端基礎(3)

原打算把Mysql操作數據庫的一些知識寫進去,但是感覺沒必要,要是現在會的都是簡單的增刪改查,所以,這一篇,我直接從java操作數據庫開始寫,所以這一篇大致就是記一下JDBC、MyBatis、以及SpringBoot的配置文件

JDBC

JDBC是java最底層最基礎的操作數據庫的技術,這一部分因為之后用的少,我直接從代碼開始看了。

@Testpublic void testUpdata() throws ClassNotFoundException, SQLException {//注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");//獲取數據庫鏈接String url = "jdbc:mysql://localhost:3306/web01";String username = "root";String password = "123456";Connection connection = DriverManager.getConnection(url, username, password);//獲取SQL語句執行對象Statement statement = connection.createStatement();//執行SQLint flag = statement.executeUpdate("update user set age = 25 where id = 1");//DML語句System.out.println("sql語句執行完畢 影響記錄數" + flag);//釋放資源statement.close();connection.close();}

這是基本操作的幾個步驟, 注冊驅動 數據庫連接 獲取SQL語句執行對象 然后執行SQL 關流

在SQL語句,為了防止SQL注入,我們一般使用參數動態傳遞,也就是預編譯SQL,不光可以防止SQL注入,而且性能更高,緩存會存儲已編譯的SQL語句。舉個栗子

    @Testpublic void testSelect() {String url = "jdbc:mysql://localhost:3306/web01";String username = "root";String password = "123456";String sql = "SELECT id, username, password, name, age FROM user WHERE username = ? AND password = ?";// 用于存儲查詢結果的 User 列表List<User> userList = new ArrayList<>();// JDBC 連接和查詢try (Connection connection = DriverManager.getConnection(url, username, password);PreparedStatement preparedStatement = connection.prepareStatement(sql)) {// 設置 SQL 參數preparedStatement.setString(1, "daqiao");preparedStatement.setString(2, "123456");// 執行查詢try (ResultSet resultSet = preparedStatement.executeQuery()) {// 遍歷結果集while (resultSet.next()) {// 將每一行數據封裝到 User 對象中User user = new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));user.setName(resultSet.getString("name"));user.setAge(resultSet.getInt("age"));// 將 User 對象添加到列表userList.add(user);}}} catch (SQLException e) {e.printStackTrace();}// 輸出查詢結果for (User user : userList) {System.out.println(user);}}
  • JDBC程序執行DML語句:int rowsUpdated = pstmt.executeUpdate(); //返回值是影響的記錄數

  • JDBC程序執行DQL語句:ResultSet resultSet = pstmt.executeQuery(); //返回值是查詢結果集

MyBatis?

MyBatis是一款優秀的持久層框架,用于簡化JDBC的開發,也就是之前提到的DAO層。通過Mybatis就可以大大簡化原生的JDBC程序的代碼編寫。在pom文件中導入Mybatis依賴即可使用。

在java中對于數據庫的數據,一般都使用對象進行封裝。

配置

然后在java文件夾的resouse中有一個數據庫的配置文件application.properties,用于配置數據庫的連接信息

#數據庫訪問的url地址
spring.datasource.url=jdbc:mysql://localhost:3306/web
#數據庫驅動類類名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#訪問數據庫-用戶名
spring.datasource.username=root
#訪問數據庫-密碼
spring.datasource.password=root@1234
#mybatis的配置
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

但是遇到特別復雜的工程配置,一般使用application.yml進行配置 方便 直觀 清晰

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl這條配置是查看SQL語句執行的日志信息

spring:application:name: springboot-mybatis-quickstart#配置數據庫連接信息datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/web01driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:com.ght666.mapper/*.xml

編寫

一般編寫Mybatis程序 是在mapper包中編寫Mybatis的持久層接口,定義SQL語句(注解)

package com.ght666.mapper;import com.ght666.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper//應用程序在運行時會自動的為該接口創建一個實現類對象,并且會自動將該實現類對象存入IOC容器 -bean對象
public interface UserMapper {@Select("select * from user")public List<User> findAll();
}
  • @Mapper注解:表示是mybatis中的Mapper接口

? ? ? 程序運行時,框架會自動生成接口的實現類對象(代理對象),并給交Spring的IOC容器管理

  • @Select注解:代表的就是select查詢,用于書寫select查詢語句

在創建出來的SpringBoot工程中,在src下的test目錄下,已經自動幫我們創建好了測試類 ,并且在測試類上已經添加了注解 @SpringBootTest,代表該測試類已經與SpringBoot整合。

該測試類在運行時,會自動通過引導類加載Spring的環境(IOC容器)。我們要測試那個bean對象,就可以直接通過@Autowired注解直接將其注入進行,然后就可以測試了。

@SpringBootTest //springboot單元測試注解 當前測試類的測試方法運行時 會自動啟動Springboot 產生IOC容器
class SpringbootMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll() {List<User> userList = userMapper.findAll();userList.forEach(System.out::println);//方法引用 }
}

?數據庫連接池

數據庫連接池是個容器,負責分配、管理數據庫連接(Connection),程序在啟動時,會在數據庫連接池(容器)中,創建一定數量的Connection對象

允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個

客戶端在執行SQL時,先從連接池中獲取一個Connection對象,然后在執行SQL語句,SQL語句執行完之后,釋放Connection時就會把Connection對象歸還給連接池(Connection對象可以復用)

釋放空閑時間超過最大空閑時間的連接,來避免因為沒有釋放連接而引起的數據庫連接遺漏,客戶端獲取到Connection對象了,但是Connection對象并沒有去訪問數據庫(處于空閑),數據庫連接池發現Connection對象的空閑時間 > 連接池中預設的最大空閑時間,此時數據庫連接池就會自動釋放掉這個連接對象

Spring默認連接池是Hikari(追光者),還有一個常用的是阿里巴巴開源的數據庫連接池項目Druid

如果使用Druid連接池,先添加依賴,再在application配置文件中引入數據庫連接配置

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

Mybatis占位符?

在Mybatis中,占位符是#{...} 生成的是預編譯的SQL語句。例如:

/*** 根據id刪除*/
@Delete("delete from user where id = #{id}")
public void deleteById(Integer id);
  • Mybatis的提供的符號,有兩個,一個是 #{...},另一個是 ${...},區別如下

符號說明場景
#{…}占位符。執行時,會將#{…}替換為?,生成預編譯SQL參數值傳遞
${…}拼接符。直接將參數拼接在SQL語句中,存在SQL注入問題表名、字段名動態設置時使用

補充一個點:有一個注解,@param,這個注解的作用是為接口的方法形參起名字的。(由于用戶名唯一的,所以查詢返回的結果最多只有一個,可以直接封裝到一個對象中)舉個栗子

/*** 根據用戶名和密碼查詢用戶信息*/
@Select("select * from user where username = #{username} and password = #{password}")
public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

XML映射配置

Mybatis的開發有兩種方式:注解? XML。使用Mybatis的注解方式,主要是來完成一些簡單的增刪改查功能。如果需要實現復雜的SQL功能,建議使用XML來配置映射語句,也就是將SQL語句寫在XML配置文件中。

XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名) 如果不同包同名,可以在配置文件中添加配置

mybatis:mapper-locations: classpath:com.ght666.mapper/*.xml

XML映射文件的namespace屬性為Mapper接口全限定名,XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ght666.mapper.UserMapper"><!--查詢操作--><select id="findAll" resultType="com.ght666.pojo.User">select * from user</select>
</mapper>

SpringBoot配置文件

主要就是yml配置文件的語法:

  1. 大小寫敏感

  2. 數值前邊必須有空格,作為分隔符

  3. 使用縮進表示層級關系,縮進時,不允許使用Tab鍵,只能用空格(idea中會自動將Tab轉換為空格)

  4. 縮進的空格數目不重要,只要相同層級的元素左側對齊即可

  5. #表示注釋,從這個字符一直到行尾,都會被解析器忽略

yml文件中常見的數據格式。在這里我們主要介紹最為常見的兩類:

  1. 定義對象或Map集合

  2. 定義數組、list或set集合

user:name: zhangsanage: 18password: 123456hobby: - java- game- sport

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

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

相關文章

Pytorch實現之SRGAN+CBAM的結構設計

簡介 簡介:在SRGAN的殘差連接中加入了CBAM注意力機制,同時設計了四類損失來訓練。 論文題目:Super-resolution Generative Adversarial Networks Based on Attention Model(基于注意力模型的超分辨率生成對抗網絡) 會議:2020 IEEE第六屆計算機與通信國際會議 摘要:基…

移動端國際化翻譯同步解決方案-V3

1.前言 因為軟件出海&#xff0c;從在上上家公司就開始做翻譯系統&#xff0c;到目前為止已經出了兩個比較大的版本了&#xff0c;各個版本解決的痛點如下&#xff1a; V1版本&#xff1a; 主要針對的是AndroidiOS翻譯不一致和翻譯內容管理麻煩的問題&#xff0c;通過這個工具…

2.css簡介

什么是css&#xff1a; CSS (Cascading Style Sheets&#xff0c;層疊樣式表&#xff09;&#xff0c;是一種用來為結構化文檔&#xff08;如 HTML 文檔或 XML 應用&#xff09;添加樣式&#xff08;字體、間距和顏色等&#xff09;的計算機語言&#xff0c;CSS 文件擴展名為 .…

機器人學習模擬框架 robosuite (3) 機器人控制代碼示例

Robosuite框架是一個用于機器人模擬和控制的強大工具&#xff0c;支持多種類型的機器人。 官方文檔&#xff1a;Overview — robosuite 1.5 documentation 開源地址&#xff1a;https://github.com/ARISE-Initiative/robosuite 目錄 1、通過鍵盤或SpaceMouse遠程控制機器人…

可終身授權的外國工具,不限次數使用!PDF轉CAD的軟件

最近有不少朋友問我有沒有好用的CAD轉換工具&#xff0c;今天就來給大家分享兩款超實用的小軟件&#xff0c;希望能幫到大家。 第一款軟件是一款國外開發的&#xff0c;它專門用來把PDF文件轉換成CAD格式&#xff0c;特別方便。 這款軟件的操作非常簡單&#xff0c;打開后無需安…

Ubuntu系統上部署Node.js項目的完整流程

以下是在Ubuntu系統上部署Node.js項目的完整流程&#xff0c;分為系統初始化、環境配置、項目部署三個部分&#xff1a; 一、系統初始化 & 環境準備 bash # 1. 更新系統軟件包 sudo apt update && sudo apt upgrade -y# 2. 安裝基礎工具 sudo apt install -y buil…

Android內存優化指南:從數據結構到5R法則的全面策略

目錄 一、APP 內存限制 二、內存的三大問題 2.1、內存抖動(Memory Churn) 2.1.1 頻繁創建短生命周期對象 2.1.2 系統API或第三方庫的不合理使用 2.1.3 Handler使用不當 2.2、內存泄漏(Memory Leak) 2.2.1 靜態變量持有Activity或Context引用 2.2.2 未取消的回調或…

ffmpeg源碼編譯支持cuda

1.安裝cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在選擇組件的時候&#xff0c;將CUDA中的Nsight VSE和Visual Studio Integration取消勾選 不然會安裝失敗 2.編譯ffmpeg 把cuda編譯宏定義開啟&#xff0c;再編譯avcodec 3.編譯livavutil報錯struct "Cuda…

Git強制覆蓋分支:將任意分支完全恢復為main分支內容

Git強制覆蓋分支&#xff1a;將任意分支完全恢復為main分支內容 場景背景完整操作步驟一、前置準備二、操作流程步驟 1&#xff1a;更新本地 main 分支步驟 2&#xff1a;強制重置目標分支步驟 3&#xff1a;強制推送至遠程倉庫 三、操作示意圖 關鍵風險提示&#xff08;必讀&a…

【Java反序列化測試】

Java反序列化測試 1. 識別反序列化入口點2. 構造探測Payload3. 發送Payload并觀察結果4. 繞過可能的防護5. 自動化工具注意事項總結 Java反序列化測試&#xff1a; 1. 識別反序列化入口點 常見入口&#xff1a; HTTP請求參數&#xff08;如POST數據、Cookie、Headers&#xff…

golang的io

https://www.bilibili.com/list/BV1gx4y1r7xb 1. 原生io包 io包是Go語言標準庫中底層的I/O接口層&#xff0c;定義了通用的讀寫規則和錯誤處理邏輯。每次讀寫都是直接調用底層系統 I/O&#xff0c;每次讀取1字節&#xff0c;系統調用次數多。適用于小數據量、實時性要求高。io…

【北京迅為】iTOP-RK3568OpenHarmony系統南向驅動開發-第4章 UART基礎知識

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工藝&#xff0c;搭載一顆四核Cortex-A55處理器和Mali G52 2EE 圖形處理器。RK3568 支持4K 解碼和 1080P 編碼&#xff0c;支持SATA/PCIE/USB3.0 外圍接口。RK3568內置獨立NPU&#xff0c;可用于輕量級人工…

【計算機網絡入門】初學計算機網絡(十)(重要)

目錄 1. 網絡層的作用 2. IPV4 2.1 IP 數據報格式 2.2 IP地址分類方案 2.3 數據的轉發 2.4 特殊用途的IP地址 3. 子網劃分和子網掩碼 3.1 子網劃分 3.2 子網掩碼 1. 網絡層的作用 按照教學五層模型&#xff0c;應用層、傳輸層、網絡層、數據鏈路層、物理層&#xff…

機器學習(五)

一&#xff0c;多類&#xff08;Multiclass&#xff09; 多類是指輸出不止有兩個輸出標簽&#xff0c;想要對多個種類進行分類。 Softmax回歸算法&#xff1a; Softmax回歸算法是Logistic回歸在多類問題上的推廣&#xff0c;和線性回歸一樣&#xff0c;將輸入的特征與權重進行…

基于 Vue 和 SSM 的前后端分離項目實戰:登錄與注冊功能實現

文章目錄 前言項目概述前端部分&#xff08;Vue&#xff09;1. 項目初始化2. 頁面布局Login.vueRegister.vue 3. 路由配置4. 主組件 后端部分&#xff08;SSM&#xff09;1. 項目結構2. 數據庫設計3. MyBatis 配置4. DAO 層5. Service 層6. Controller 層7. 配置文件8. Spring …

Windows安裝nvm【超詳細圖解】

目錄 前言 一、NVM下載 方式一&#xff1a;官網下載 方式二&#xff1a;GitHub 下載 二、NVM安裝 鏡像源配置 三、Node安裝 四、環境變量配置 前言 NVM&#xff08;Node Version Manager&#xff09;是一個命令行工具&#xff0c;用于在一臺計算機上輕松管理和切換多…

KVM虛擬機磁盤創建探究-2

使用 virt-install 命令自動創建磁盤鏡像和使用 qemu-img 手動創建磁盤鏡像&#xff0c;在磁盤鏡像本身格式和基本功能上是一致的&#xff0c;但在一些特性如初始占用磁盤空間、創建時的可配置性等方面存在區別&#xff0c;下面以 QCOW2 格式磁盤鏡像為例進行詳細說明。 初始占…

京準電鐘:NTP校時服務器于安防監控系統應用方案

京準電鐘&#xff1a;NTP校時服務器于安防監控系統應用方案 京準電鐘&#xff1a;NTP校時服務器于安防監控系統應用方案 NTP校時服務器在安防監控系統中的應用方案主要通過高精度時間同步技術&#xff0c;解決設備間時間差異問題&#xff0c;確保日志、錄像等數據的時間一致性…

遞歸遍歷目錄 和 普通文件的復制 [Java EE]

遞歸遍歷目錄 首先 先列出當前目錄所包含的內容 File[] files currentDir.listFiles();if (files null || files.length 0) {// 若是空目錄或非法目錄, 則直接返回return;} 然后 遍歷列出的文件, 分情況兩種討論 for (File f: files) {// 加個日志, 方便查看程序執行情…

NO.19十六屆藍橋杯模擬賽第三期上

1 如果一個數 p 是個質數&#xff0c;同時又是整數 a 的約數&#xff0c;則 p 稱為 a 的一個質因數。 請問&#xff0c; 2024 的最大的質因數是多少&#xff1f; 答&#xff1a;23 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false)…