【JavaEE】MyBatis - Plus

目錄

  • 一、快速使用
  • 二、CRUD簡單使用
  • 三、常見注解
    • 3.1 @TableName
    • 3.2 @TableFiled
    • 3.3 @TableId
  • 四、條件構造器
    • 4.1 QueryWrapper
    • 4.2 UpdateWrapper
    • 4.3 LambdaQueryWrapper
    • 4.4 LambdaUpdateWrapper
  • 五、自定義SQL

一、快速使用

MyBatis Plus官方文檔:MyBatis Plus官方文檔

添加依賴:官方文檔都有。
Spring Boot 3的依賴:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version>
</dependency>

配置文件:

mybatis-plus:configuration:# MyBatis 配置map-underscore-to-camel-case: trueglobal-config:# 全局配置db-config:# 數據庫配置id-type: auto

也要配置數據庫:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driver

再寫實體類,

package com.example.mybatisplus.demo.model;import lombok.Data;import java.util.Date;
@Data
public class UserInfo {private Integer id;private String username;private String password;private Byte age;private Byte gender;private String phone;private Byte deleteFlag;private Date createTime;private Date updateTime;}

寫Mapper接口,要繼承BaseMapper,泛型指代要操作的實體類。

package com.example.mybatisplus.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

打印日志配置:

mybatis-plus:configuration:# 配置打印 MyBatis?志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、CRUD簡單使用

直接調用對應方法即可,方法名十分清晰。

  • 增:



  • 查:

三、常見注解

如果我們的數據庫設計是按照蛇形標準來設計數據庫名以及字段名的話,駝峰方式命名類屬性的話,MyBatis Plus會自動幫我們映射,但是如果有不和規范無法映射的話,就需要使用注解來幫我們映射。

3.1 @TableName

@TableName是類注解,用來表示當前類對應的數據庫表名。

通過錯誤日志可以看見mybatis-Plus是通過我們的類名去找表名的,當不符合規范就會找不到,但是加上@TableName注解講明表名,就可以找到。

3.2 @TableFiled

@TableFiled注解這個是屬性注解,跟@TableName作用一樣,是用來對應當不符合規范命名時,對應類屬性與數據庫表字段的。

 @TableField("update_time")private Date updateTime;

3.3 @TableId

@TableId注解,是用來對應主鍵的。MyBatis - Plus默認主鍵是id,但是如果主鍵不是,就可以加上該注解表明這是主鍵對應的屬性。還可以用 @TableId注解的type屬性來設置當前是否是自增的。

    @TableId(value = "id",type = IdType.AUTO)private Integer id;

四、條件構造器

前面介紹的都是簡單的CRUD,在實際的應?場景中,我們還需要使?更復雜的操作,MyBatisPlus也給我們提供了相應的?持。
MyBatis-Plus 提供了?套強?的條件構造器(Wrapper),?于構建復雜的數據庫查詢條件。Wrapper 類允許開發者以鏈式調?的?式構造查詢條件,?需編寫繁瑣的 SQL 語句, 從?提?開發效率并減少 SQL注?的?險。

以下是主要的 Wrapper 類及其功能:

  • AbstractWrapper:這是?個抽象基類,提供了所有 Wrapper 類共有的?法和屬性。詳情看官網
  • QueryWrapper:?于構造查詢條件,在AbstractWrapper的基礎上拓展了?個select?法,允許指定查詢字段。
  • UpdateWrapper: ?于構造更新條件,可以在更新數據時指定條件。
  • LambdaQueryWrapper:基于 Lambda 表達式的查詢條件構造器,它通過 Lambda 表達式來引?實體類的屬性,從?避免了硬編碼字段名。
  • LambdaUpdateWrapper:基于 Lambda 表達式的更新條件構造器, 它允許你使? Lambda 表達式來指定更新字段和條件,同樣避免了硬編碼字段名的問題。

介紹一些簡寫過的方法:

  • lt : “less than” 的縮寫,表??于.
  • le : "less than or equal to"的縮寫, 表??于等于
  • ge : “greater than or equal to” 的縮寫, 表??于等于.
  • gt : “greater than” 的縮寫, 表??于.
  • eq : “equals” 的縮寫, 表?等于.
  • ne : “not equals” 的縮寫, 表?不等于.

4.1 QueryWrapper

QueryWrapper并不只?于查詢語句, ?論是修改, 刪除, 查詢,后面需要跟條件查詢的時候都可以使?QueryWrapper來構建查詢條件。

例如下面的sql語句:

select id,username, password, age, gender from `user_info` where age = 18 and username  like "%s%"

結果如下:

當我們使用QueryMapper對應的代碼如下:

@Testpublic void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select(" id","username", "password", "age", "gender").eq("age",18).like("username","s");System.out.println(userInfoMapper.selectList(queryWrapper));}

結果:

默認情況下Mybatis-Plus會根據 @TableFiled ?成別名, 當指定了QueryWrapper的select屬性后就僅僅是屬性值?沒有了別名. 查詢出來的結果會對應不上
解決辦法:

  1. ??寫?定義SQL
  2. 實體類名和字段名保持?致
  3. 不指定QueryWrapper的select字段
  4. 使?LambdaQueryWrapper實現

4.2 UpdateWrapper

完成下面的sql語句:

update user_info set delete_flag = 1, age = age + 10 where id in(1,2,3)

運行前數據:

使用UpdateWrapper的代碼:

@Testpublic void updateByCondition() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",1).setSql("age = age + 10").in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}

運行后結果:

4.3 LambdaQueryWrapper

LambdaQueryWrapper是基于Lambda表達式的條件構造器,它通過 Lambda 表達式來引?實體類的屬性,從?避免了硬編碼字段名。也提?了代碼的可讀性和可維護性。

查詢下面的sql

select id,username, password, age, gender from `user_info` where age = 28 and username  like "%s%"

結果:

對應的使用LambdaQueryWrapper的代碼:

    @Testpublic void selectByCondition2() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(UserInfo::getId, UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge,UserInfo::getGender, UserInfo::getDeleteFlag).eq(UserInfo::getAge,28).like(UserInfo::getUsername,"s");System.out.println(userInfoMapper.selectList(lambdaQueryWrapper));}

結果:

4.4 LambdaUpdateWrapper

update user_info set delete_flag = 1, age = age - 10 where id in(1,2,3)

運行前數據:

對應使用LambdaUpdateWrapper代碼:

@Testpublic void updateByCondition2() {LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1).setSql("age = age - 10").in(UserInfo::getId, List.of(1,2,3));userInfoMapper.update(lambdaUpdateWrapper);}

執行結果:

五、自定義SQL

官方文檔,MyBatis Plus官方文檔介紹自定義SQL如下:

示例一:
SQL語句:

select id,username, password, age from `user_info` where age = 18 or username  like "%s%"

結果:

代碼:

@Select(" select id,username, password, age from user_info  ${ew.customSqlSegment}")List<UserInfo> select (@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);

測試代碼:

    @Testvoid testSelect() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("age",18).or().like("username","s");userInfoMapper.select(queryWrapper);}

結果:

示例二:
執行的SQL語句:

update user_info set delete_flag = 0, age = age + 10 where id in(1,2,3)

原始數據:

xml代碼:

    <update id="update">update user_info set delete_flag = 0, age = age + #{age} ${ew.customSqlSegment}</update>

測試代碼:

    @Testvoid testUpdate() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.in("id", List.of(1,2,3));userInfoMapper.update(10,updateWrapper);}

結果:

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

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

相關文章

采用前端技術開源了一個數據結構算法的可視化工具

今天要推薦的開源項目叫VisuAlgoX,是一個面向計算機科學和游戲開發的 交互式算法可視化工具&#xff0c;幫助用戶通過直觀的動畫理解各種數據結構和算法。 項目的前身 由于最近在做一些關于游戲和圖形化方面的文章&#xff0c;因此做了一部分相關算法的動態可視化來做配圖展示…

體驗智譜清言的AutoGLM進行自動化的操作(Chrome插件)

最近體驗了很多的大模型&#xff0c;大模型我是一直關注著ChatGLM&#xff0c;因為它確實在7b和8b這檔模型里&#xff0c;非常聰明&#xff01; 最近還體驗了很多大模型的應用軟件&#xff0c;比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是這些一般都是圖形界面或者…

pytorch中dataloader自定義數據集

前言 在深度學習中我們需要使用自己的數據集做訓練&#xff0c;因此需要將自定義的數據和標簽加載到pytorch里面的dataloader里&#xff0c;也就是自實現一個dataloader。 數據集處理 以花卉識別項目為例&#xff0c;我們分別做出圖片的訓練集和測試集&#xff0c;訓練集的標…

Blender模型導入虛幻引擎設置

單位系統不一致 Blender默認單位是米&#xff08;Meters&#xff09;&#xff0c;而虛幻引擎默認使用**厘米&#xff08;Centimeters&#xff09;**作為單位。 當模型從Blender導出為FBX或其他格式時&#xff0c;如果沒有調整單位&#xff0c;虛幻引擎會將1米&#xff08;Blen…

Docker基礎詳解

Docker 技術詳解 一、概述 Docker官網&#xff1a;https://docs.docker.com/ 菜鳥教程&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker&#xff1f; Docker 是一個開源的容器化平臺&#xff0c;它允許開發者將應用程序和其依賴項打包到…

FastPillars:一種易于部署的基于支柱的 3D 探測器

FastPillars&#xff1a;一種易于部署的基于支柱的 3D 探測器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP語言模型訓練里的特殊向量

1. CLS 向量和 DEC 向量的區別及訓練方式 (1) CLS 向量與 DEC 向量是否都是特殊 token&#xff1f; CLS 向量&#xff08;[CLS] token&#xff09;和 DEC 向量&#xff08;Decoder Input token&#xff09;都是特殊的 token&#xff0c;但它們出現在不同類型的 NLP 模型中&am…

字節跳動 UI-TARS 匯總整理報告

1. 摘要 UI-TARS 是字節跳動開發的一種原生圖形用戶界面&#xff08;GUI&#xff09;代理模型 。它將感知、行動、推理和記憶整合到一個統一的視覺語言模型&#xff08;VLM&#xff09;中 。UI-TARS 旨在跨桌面、移動和 Web 平臺實現與 GUI 的無縫交互 。實驗結果表明&#xf…

基于Python深度學習的鯊魚識別分類系統

摘要&#xff1a;鯊魚是海洋環境健康的指標&#xff0c;但受到過度捕撈和數據缺乏的挑戰。傳統的觀察方法成本高昂且難以收集數據&#xff0c;特別是對于具有較大活動范圍的物種。論文討論了如何利用基于媒體的遠程監測方法&#xff0c;結合機器學習和自動化技術&#xff0c;來…

【漫話機器學習系列】168.最大最小值縮放(Min-Max Scaling)

在機器學習和數據預處理中&#xff0c;特征縮放&#xff08;Feature Scaling&#xff09; 是一個至關重要的步驟&#xff0c;它可以使模型更穩定&#xff0c;提高訓練速度&#xff0c;并優化收斂效果。最大最小值縮放&#xff08;Min-Max Scaling&#xff09; 是其中最常見的方…

開源測試用例管理平臺

不可錯過的10個開源測試用例管理平臺&#xff1a; PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 開源測試用例管理工具提供了一種透明、靈活的解決方案&#xff0c;使團隊能夠在不受限的情況下適應具體的測…

鴻蒙闊折疊Pura X外屏開發適配

首先看下鴻蒙中斷點分類 內外屏開合規則 Pura X開合連續規則: 外屏切換到內屏,界面可以直接接續。內屏(鎖屏或非鎖屏狀態)切換到外屏,默認都顯示為鎖屏的亮屏狀態。用戶解鎖后:對于應用已適配外屏的情況下,應用界面可以接續到外屏。折疊外屏顯示展開內屏顯示折疊狀態…

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 這兩行代碼用于啟用 Linux DRM&#xff08;Direct Rendering Manager&#xff09;客戶端的兩個關鍵特性&#xff0c;具體作用如下&#xff1a; 1. drmSetClientCap…

敏捷開發10:精益軟件開發和看板kanban開發方法的區別是什么

簡介 精益生產起源于豐田生產系統&#xff0c;核心是消除浪費&#xff0c;而看板最初是由豐田用于物料管理的信號卡片&#xff0c;后來被引入軟件開發。 Kanban 后來引入到敏捷開發中&#xff0c;強調持續交付和流程可視化。 精益軟件開發原則是基于精益生產的原則&#xff0…

用matlab探索卷積神經網絡(Convolutional Neural Networks)-3

5.GoogLeNet中的Filters 這里我們探索GoogLeNet中的Filters&#xff0c;首先你需要安裝GoogLeNet.在Matlab的APPS里找到Deep Network Designer,然后找到GoogLeNet&#xff0c;安裝后的網絡是沒有右下角的黃色感嘆號的&#xff0c;沒有安裝的神經網絡都有黃色感嘆號。 一個層&a…

Verilog中X態的危險:仿真漏掉的bug

由于Verilog中X態的微妙語義,RTL仿真可能PASS,而網表仿真卻會fail。 目前進行的網表仿真越來越少,這個問題尤其嚴重,主要是網表仿真比RTL仿真慢得多,因此對整個回歸測試而言成本效益不高。 上面的例子中,用Verilog RTL中的case語句描述了一個簡單的AND函數,它被綜合成AN…

PyTorch中知識蒸餾淺講

知識蒸餾 在 PyTorch 中,使用 teacher_model.eval() 和凍結教師模型參數是知識蒸餾(Knowledge Distillation)中的關鍵步驟。 ?1. teacher_model.eval() 的作用 目的: 將教師模型切換到評估模式,影響某些特定層(如 Dropout、BatchNorm)的行為。 ?具體影響: ?Dropo…

Odoo/OpenERP 和 psql 命令行的快速參考總結

Odoo/OpenERP 和 psql 命令行的快速參考總結 psql 命令行選項 選項意義-a從腳本中響應所有輸入-A取消表數據輸出的對齊模式-c <查詢>僅運行一個簡單的查詢&#xff0c;然后退出-d <數據庫名>指定連接的數據庫名&#xff08;默認為當前登錄用戶名&#xff09;-e回顯…

ChatGPT 迎來 4o模型:更強大的圖像生成能力與潛在風險

OpenAI 對 ChatGPT 進行重大升級&#xff0c;圖像生成功能即將迎來新的 4o 模型&#xff0c;并取代原本的 DALLE。此次更新不僅提升了圖像生成質量&#xff0c;還增強了對話內容和上傳文件的融合能力&#xff0c;使 AI 生成的圖像更加智能化和精準化。 4o 模型帶來的革新 Ope…

Python 實現的運籌優化系統代碼詳解(整數規劃問題)

一、引言 在數學建模的廣袤領域里&#xff0c;整數規劃問題占據著極為重要的地位。它廣泛應用于工業生產、資源分配、項目管理等諸多實際場景&#xff0c;旨在尋求在一系列約束條件下&#xff0c;使目標函數達到最優&#xff08;最大或最小&#xff09;且決策變量取整數值的解決…