Mybatis(XML映射文件、動態SQL)

目錄

?

基礎操作

準備:

刪除:

新增:

更新:

查詢:

條件查詢:

XML映射文件

動態SQL

if

foreach

sql&include


?

基礎操作

準備:

準備數據庫表

創建一個新的springboot工程,選擇引入對應的起步依賴(mybatis、mysql驅動、lombok)

application.properties中引入數據庫連接信息

創建對應的實體類(實體類屬性采用駝峰命名)

準備Mapper接口

刪除:

    @Delete("delete from teachnewstudent where id=#{id}")public void delete(Long id);
特別指出占位符 #{id}

刪除是由返回值的,數據的返回值改為int即可刪除數據

注意事項:如果mapper接口方法形參只有一個普通類型的參數,#{...}里面的屬性名可以隨便寫,如:#{id}、#{value}。

日志輸出:

可以在application.properties中,打開mybatis的日志,并指定輸出到控制臺。

#指定mybatis輸出日志的位置,輸出控制臺mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

預編譯SQL

優勢:性能更高

更安全(防止SQL注入)

SQL注入:

SQL注入是通過操作輸入的數據來修改事先定義好的SQL語句,以達到執行代碼對服務器進行攻擊的方法。
使用#{}即為預編譯

新增:

 @Insert("insert into user(name,intro,state) values(#{name},#{intro},#{state}")public void insert(User user);

?如果有多個參數可使用實體類來封裝多個參數

主鍵返回:

描述:在數據添加成功后,需要獲取插入數據庫的主鍵。如:添加套餐數據時,還需要維護套餐菜品關系表數據。

實現:加上注解@Options(框架會自動將生成的主鍵值,賦值給user對象的id屬性)

    @Options(keyProperty="id", useGeneratedKeys = true)@Insert("insert into user(name,intro,state)+values(#{name},#{intro},#{state}")public void insert(User user);

更新:

一般是根據主鍵來修改(因為主鍵是不改變的)

    @Update("update user set name=#{name},intro=#{intro},state=#{state} where id=#{id}")public void update(User user);

查詢:

根據id查詢

   @Select("select * from user where id=#{id}")public User getById(Long id);

數據封裝:

實體類屬性名 和 數據庫表查詢返回的字段名一致,mybatis會自動封裝。

如果實體類屬性名 和 數據庫表查詢返回的字段名不一致,不能自動封裝。

解決方案:

方案一:給字段起別名,讓別名與實體類屬性一致

  @Select("select id,name,create_time createTime,update_time updateTime from user where id=#{id}")public User getById(Long id);

方案二:通過@Results,@Result 注解手動映射封裝

 @Results({@Result(column="",property="")})@Select("select * from user where id=#{id}")public User getById(Long id);

?column為需要封裝的字段,property為封裝到的屬性

方案三:開啟mybatis的駝峰命名自動映射開關 即:a_?column------>aColumn

在application.properties配置mybatis.configuration.map-underscore-to-camel-case=true

需要嚴格遵守數據庫名為下劃線,類型名為駝峰命名

?

條件查詢:

    @Select("select * from user where name like '%${name}%' and state=#{state}")public List<User> list1(String name,Short state);

因為#{}是預編譯符不能出現在""之內所以需要用$符號來代替(所以存在問題性能低、不安全、存在SQL注入問題)

解決方法:concat? 字符串拼接函數

    @Select("select * from user where name like concat('%',#{name},'%') and state=#{state}")public List<User> list1(String name,Short state);

?在springboot的2.x版本,參數名與注解中引用部分相同,否則需要單獨加入注解

?

XML映射文件

規范:

XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名)。

XML映射文件的namespace屬性為Mapper接口全限定名一致。

XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致。

目錄使用/來分隔

約束:

官方文檔:入門_MyBatis中文網

<?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.example.demo.mapper.UserMapper"></mapper>

namespace的屬性值和接口全類名保持一致

<mapper namespace="com.example.demo.mapper.UserMapper"><select id="list" resultType="com.example.pojo.User">select * from user where name like'%${name}%' and state=#{state}</select>
</mapper>

?

?插件:MyBatisX(提高MyBatis效率)能夠快速定位

?

動態SQL

動態SQL

隨著用戶的輸入或外部條件的變化而變化的SQL語句,我們稱之為 動態SQL

?

if

<if>:用于判斷條件是否成立。使用test屬性進行條件判斷,如果條件為true,則拼接SQL。

<mapper namespace="com.example.mapper.Usermapper"><select id="list" resultType="com.example.pojo.User">select * from user<where><if test="name != null">name like'%${name}%'</if><if test="state!= null">and state=#{state}</if></where></select>
</mapper>

where標簽會自動去除多余的and關鍵字,而且會判斷條件成不成立,當條件不成立時不會生成where關鍵字 而且會自動去除子句開頭的AND或者OR

需求:動態更新員工信息,如果更新時傳遞有值,則更新;如果更新時沒有傳遞值,則不更新。

在 if 中添加 test屬性即可

<set>標簽替換set關鍵字,能夠去除掉多余的逗號

foreach

進行循環遍歷的標簽,通常用在批量刪除中

屬性:

collection:遍歷的集合(與參數名保持一致)

item:遍歷出來的元素

separator:分隔符

open:遍歷開始前拼接的SQL片段

close:遍歷結束后拼接的SQL片段

<delete id="deleteByIds">delete from user where id in<foreach collection="ids" item="id" separetor="," open="(" close=")">#{id}</foreach>
</delete>

?

sql&include

sql負責抽取一個片段,而include引用一個片段進行復用

<sql id="commonSelect">select id,name
</sql>

include 的 refid屬性負責指定你要引用哪個片段值,該值為select的id值

?查詢一個表的全部字段時不建議使用select*,而是要羅列所有字段(select*性能較低)

<include refid="commonSelect"/>

?

?

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

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

相關文章

python校園拼團系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

多模態大語言模型arxiv論文略讀(127)

When SAM2 Meets Video Camouflaged Object Segmentation: A Comprehensive Evaluation and Adaptation ?? 論文標題&#xff1a;When SAM2 Meets Video Camouflaged Object Segmentation: A Comprehensive Evaluation and Adaptation ?? 論文作者&#xff1a;Yuli Zhou, …

劍指offer32_二叉搜索樹的后序遍歷序列

二叉搜索樹的后序遍歷序列 輸入一個整數數組&#xff0c;判斷該數組是不是某二叉搜索樹的后序遍歷的結果。 如果是則返回true&#xff0c;否則返回false。 假設輸入的數組的任意兩個數字都互不相同。 數據范圍 數組長度 [ 0 , 1000 ] [0,1000] [0,1000]。 樣例 輸入&…

《仿盒馬》app開發技術分享-- 訂單結合優惠券結算(端云一體)

技術棧 Appgallery connect 開發準備 上一節我們已經實現了優惠券的選擇&#xff0c;并且成功的把券后的價格也展示給用戶&#xff0c;不能使用的優惠券我們也用友好的方式告知用戶&#xff0c;這一節我們來實現優惠券內容的下一步&#xff0c;優惠券內容結合訂單進行結算提…

Python+Selenium+Pytest+POM自動化測試框架封裝

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 1、測試框架簡介 1&#xff09;測試框架的優點 代碼復用率高&#xff0c;如果不使用框架的話&#xff0c;代碼會顯得很冗余。可以組裝日志、報告、郵件等一些…

宋代大模型:智能重構下的文明再發現

引言&#xff1a;當汴京城遇見生成式AI 一幅動態的《清明上河圖》正通過全息投影技術演繹汴京城的市井百態。這個虛實交融的場景&#xff0c;恰似宋代大模型技術的隱喻——以人工智能為紐帶&#xff0c;連接起東京夢華的繁盛圖景與數字時代的文明重構。作為人工智能與歷史學交…

K-means++:讓K-means“聰明”地選擇初始中心點

大家好&#xff01;歡迎來到我的技術分享博客~ &#x1f44b; 在前兩篇博客中&#xff0c;我們深入探討了經典的 K-means 算法 以及它的優化方案 Canopy K-means。如果你還沒有看過&#xff0c;強烈建議先回顧一下&#xff0c;因為今天的主題 K-means 和它們有著千絲萬縷的聯系…

Langchain學習筆記(1)——如何調用Huggingface的模型并實現實時返回生成結果

Langchain支持很方便的OpenAI模型的調用&#xff0c;可以做到快速開發大模型應用。但是要使用Huggingface上的開源模型就沒有那么方便了&#xff0c;本文就詳細闡述如何用Langchain開發基于Huggingface上的模型&#xff0c;并實時返回生成結果。 實時返回生成結果是LLM很關鍵的…

Java安全-常規漏洞問題(SQL注入,XXE,SSRF,RCE)

靶場搭建 靶場下載 &#xff1a; https://github.com/whgojp/JavaSecLab這個靶場是使用Springboot搭建的所以不要下載 jar 文件運行&#xff0c;要使用IDEA運行他的文件夾 先打開pom 然后進行maven一下 改一下端口 配置完成之后修改一下 運行的模式 使用phpstudy搞一個sql數…

基于視頻的 AI 內存庫,極速語義檢索

簡介 在大模型應用里&#xff0c;將文本數據分塊嵌入存儲在向量數據庫已經是標準做法。然而&#xff0c;傳統向量數據庫雖然功能強大&#xff0c;但其高昂的RAM和存儲需求&#xff0c;以及復雜的部署運維&#xff0c;常常讓開發者望而卻步。今天&#xff0c;介紹一個名為 Memv…

接口適配器模式實現令牌桶算法和漏桶算法

以下是令牌桶算法、漏桶算法和雪花算法的清晰對比解析。它們屬于完全不同的技術領域&#xff0c;前兩者用于流量控制&#xff0c;后者用于分布式ID生成&#xff1a; 1. 令牌桶算法&#xff08;Token Bucket&#xff09; 領域&#xff1a;流量整形 / 速率限制核心目標&#xff…

618背后的電商邏輯重構:從價格血戰到價值共生

“今年終于沒做數學題。” 618進行到一半&#xff0c;行云已經買了很多&#xff0c;大件的有iPad、iWatch&#xff0c;小件的有運動鞋、面膜、紙巾。往年她要湊湊減減&#xff0c;經常要找個店鋪湊單&#xff0c;下完單再馬上退掉&#xff0c;今年她沒廢太多腦細胞&#xff0c…

解決 PyTorch 與 Python 3.12 的兼容性問題:`operator torchvision::nms does not exist` 深度解析

解決 PyTorch 與 Python 3.12 的兼容性問題 問題現象錯誤根源分析終極解決方案?? 推薦方案:創建 Python 3.11 虛擬環境? 備選方案:使用 PyTorch 夜間構建版(Python 3.12)驗證修復技術深度解析最佳實踐建議問題現象 當在 Python 3.12 環境中運行以下代碼時: from tran…

Git 實戰場景

四、標簽管理 4.1、標簽的理解 在使用 Git 進行版本管理時&#xff0c;**標簽&#xff08;Tag&#xff09;**扮演著非常重要的角色。它其實就是對某次提交&#xff08;commit&#xff09;的一個簡潔標識&#xff0c;相當于給這次提交起了一個可讀、易記的“別名”。比如&…

在同態加密系統中,參與角色以及各角色的功能作用流程圖,私鑰和公鑰分發流程,可能遇到的攻擊

一、角色劃分與職責 角色身份核心任務密鑰權限客戶端數據所有者 &#xff08;如醫院、用戶&#xff09;1. 加密原始數據 2. 上傳密文至服務器 3. 接收并解密結果&#xff08;可選&#xff09;持有公鑰服務器計算服務提供方 &#xff08;如云平臺&#xff09;1. 接收客戶端密文…

langchain從入門到精通(六)——LCEL 表達式與 Runnable 可運行協議

1. 多組件 invoke 嵌套的缺點 prompt ChatPromptTemplate.from_template("{query}") llm ChatOpenAI(model"gpt-3.5-turbo-16k") parser StrOutputParser() # 獲取輸出內容 content parser.invoke( llm.invoke( prompt.invoke( {"query": r…

ArcGIS中批量獲取輸入面圖層A中各要素的四至點的實現方法

一、背景及意義 在日常工作中&#xff0c;我們經常會需要獲取面圖層的四至點&#xff0c;我們能否在ArcGIS中直接獲取面圖層的四至點呢&#xff1f;答案是肯定的&#xff0c;請繼續往下看。 二、大體思路 使用字段計算器計算輸入面圖層A中各面要素的XY的最大值和最小值&…

大IPD之——華為的戰略本質與實踐(二)

華為戰略執行的能力如此強&#xff0c;有兩個核心原因&#xff1a;一是管理體系起了非常重大的作用&#xff1b;二是企業文化導致華為的執行力特別強。華為在戰略方面&#xff0c;為什么每次都能轉型成功&#xff1f;背后是有很多實質性的內容支撐的。而華為如何做戰略&#xf…

『大模型筆記』第3篇:多長的 Prompt 會阻塞其他請求?優化策略解析

『大模型筆記』多長的 Prompt 會阻塞其他請求?優化策略解析 文章目錄 一、更簡單的問題:長 Prompt 阻塞請求隊列1. 請求并行預填方案(Request-Parallel Prefills)二、根本的問題(Fundamental Flaw):Token 生成被并行預填拖慢1. 解耦預填(Disaggregated Prefill):以延遲優…

21 - GAM模塊

論文《Global Attention Mechanism: Retain Information to Enhance Channel-Spatial Interactions》 1、作用 這篇論文提出了全局注意力機制&#xff08;Global Attention Mechanism, GAM&#xff09;&#xff0c;旨在通過保留通道和空間方面的信息來增強跨維度交互&#xf…