Java EE 進階:MyBatis-plus

MyBatis-plus的介紹

MyBatis-plus是MyBatis的增強工具,在MyBatis的基礎上做出加強,只要MyBatis有的功能MyBatis-plus都有。

MyBatis-plus的上手

添加依賴

在我們創建項目的時候,我們需要添加MyBatis-plus和mysql的依賴

MyBatis-plus的依賴

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>

Mysql的依賴?

 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

配置數據庫

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml

首先我們創建UserInfo類

實體類中的屬性和表中的字段要一一對應。

@Data
@TableName("user_info")
public class UserInfo {@TableId("id" )private Integer id;@TableField("username")private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

編寫一個Mapper接口?

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

MyBatis-plus提供一個基礎的BaseMapper接口,已經實現了單表的增刪改查,我們自己的Mapper接口只需要繼承這個BaseMapper接口,就可以實現單表的增刪改查了

?

CRUD

我們來簡單的測試一下MyBatis-plus的CRUD

@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid select() {userInfoMapper.selectById(1);}@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(12);userInfo.setPassword("5556666");userInfoMapper.updateById(userInfo);}@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setId(27);userInfo.setAge(3);userInfo.setPassword("3");userInfo.setUsername("123333");userInfoMapper.insert(userInfo);}@Testvoid delete() {userInfoMapper.deleteById(8);
}

?@TableName

修改實體類名UserInfo為Userinfo

我們可以用@TableName來標識實體類對應的表

@Data@TableName("user_info")public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;}

?@TableField

修改屬性名deleteFlag為deleteflag

@TableField("delete_flag")private Integer deleteflag;

@TableId

修改屬性名id為userId

我們可以通過@TableId來指定對應的主鍵

@TableId("id")private Integer userId;

?

條件構造器

QueryWrapper

?于構造查詢條件,在AbstractWrapper的基礎上拓展了?個select?法,允許指定查詢字段,QueryWrapper并不只用于查詢語句,無論是修改,刪除,查詢都可以使用QueryWrapper來構造條件

Select

SELECT id,username,password,age FROM user_info WHERE age = 18 AND username 
"%min%"
 void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().select("username", "password", "id", "age").eq("age", 18).like("username", "min");List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);userInfos.forEach(x -> System.out.println(x));}

Update?

UPDATE user_info SET delete_flag=? WHERE age < 20
@Testvoid updateByCondition() {UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().lt("age", 20);userInfoMapper.update(userInfo, queryWrapper);}

Delete

 DELETE FROM user_info WHERE age = 18
@Testvoid deleteByCondition(){QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>().eq("age",18);userInfoMapper.delete(queryWrapper);}

?UpdateWrapper

對于更新,我們也可以直接使?UpdateWrapper,在不創建實體對象的情況下,直接設置更新字段和條件

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
@Testvoid updateByCondition2(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age",5).in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

?

 UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
@Testvoid updateByCondition3(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().setSql("age=age+10").in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

?LambdaQueryWrapper

?QueryWrapper和UpdateWrapper存在?個問題,就是需要寫死字段名,如果字段名發?變更,可能會 因為測試不到位釀成事故。

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

@Testvoid selectByLambdaCondition() {QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>();queryWrapper.lambda().select(UserInfo::getUsername,UserInfo::getPassword).eq(UserInfo::getAge,18);userInfoMapper.selectList(queryWrapper);}

?LambdaUpdateWrapper

@Testvoid updateByLambdaCondition(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>();updateWrapper.lambda().set(UserInfo::getUsername,"123").set(UserInfo::getAge,12).in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(updateWrapper);}

?

?定義SQL

在實際的開發中,MyBatis-plus提供的操作不能滿足我們的實際需求,MyBatis-plus也提供了自定義SQL的功能,我們可以用Wrapper構造查詢條件,結合Mapper編寫SQL

 select id,username,password,age FROM user_info WHERE username = "admin"
 @Select("select * from user_info ${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
@Testvoid testQueryUserByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);}

注:

參數命名:在?定義SQL時,傳遞Wrapper對象作為參數時,參數名必須為 ew 或者使?注解 ${ew.customSqlSegment},明確指定參數為Wrapper對象

使用 ${ew.customSqlSegment} :在SQL語句中,使? ${ew.customSqlSegment}來引?Wrapper對象?成的SQL?段.

不?持基于entity的where語句:?定義SQL時,Wrapper對象不會基于實體類?動?成 where?句,你需要?動編寫完整的SQL語句

MyBatis-plus也支持xml的方式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.blame.mybatisplus.mapper.UserInfoMapper"><select id="queryUserByCustom2" resultType="com.blame.mybatisplus.model.UserInfo">select id,username,password,age FROM user_info ${ew.customSqlSegment}</select></mapper>
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
 @Testvoid testQueryUserByCustom2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);}

如果需要查看更多關于MyBatis-plus 的資料,點擊

簡介 | MyBatis-Plushttps://baomidou.com/introduce/?

希望能對大家有所幫助!!!!!

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

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

相關文章

GitHub和Gitee上的一些AI項目

以下是GitHub和Gitee上的一些AI項目&#xff1a; GitHub上的AI項目 TensorFlow&#xff1a;一個端到端開源機器學習平臺&#xff0c;包含大量工具和庫&#xff0c;廣泛應用于圖像識別、自然語言處理等領域。PyTorch&#xff1a;由Facebook開發的開源深度學習框架&#xff0c;…

JavaScript網頁設計高級案例:構建交互式圖片畫廊

JavaScript網頁設計高級案例&#xff1a;構建交互式圖片畫廊 在現代Web開發中&#xff0c;交互式元素已成為提升用戶體驗的關鍵因素。本文將通過一個高級案例 - 構建交互式圖片畫廊&#xff0c;展示如何結合HTML和JavaScript創建引人入勝的網頁應用。這個案例不僅涵蓋了基礎的…

Linux命令大全:從入門到高效運維

適合人群&#xff1a;Linux新手 | 運維工程師 | 開發者 目錄 一、Linux常用命令&#xff08;每天必用&#xff09; 1. 文件與目錄操作 2. 文件內容查看與編輯 二、次常用命令&#xff08;按需使用&#xff09; 1. 系統管理與監控 2. 網絡與通信 3. 權限與用戶管理 三、…

Windows 10/11 使用 VSCode + SSH 免密遠程連接 Ubuntu 服務器(指定端口)

摘要&#xff1a; 本文詳細介紹如何在 Windows 系統上通過 VSCode Remote-SSH 免密登錄遠程 Ubuntu 服務器&#xff08;SSH 端口 2202&#xff09;&#xff0c;避免每次輸入密碼的繁瑣操作&#xff0c;提高開發效率。 1. 環境準備 本地系統&#xff1a;Windows 10/11遠程服務…

一些需要學習的C++庫:CGAL和Eysshot

寫在前面&#xff1a; 從開始工作到現在&#xff0c;去過多家公司&#xff0c;多個行業&#xff0c; 雖然大部分時間在通信業&#xff0c;但也有其它的行業的工作沒有做完&#xff0c;但也很感興趣。每次想要研究一下時&#xff0c;總是想不起來。 這里寫一些信息&#xff0c;…

藍橋杯16天刷題計劃一一Day01

藍橋杯16天刷題計劃一一Day01&#xff08;STL練習&#xff09; 作者&#xff1a;blue 時間&#xff1a;2025.3.26 文章目錄 藍橋杯16天刷題計劃一一Day01&#xff08;STL練習&#xff09;[P1540 [NOIP 2010 提高組\] 機器翻譯 - 洛谷 (luogu.com.cn)](https://www.luogu.com.…

相對位置2d矩陣和kron運算的思考

文章目錄 1. 相對位置矩陣2d2. kron運算 1. 相對位置矩陣2d 在swin-transformer中&#xff0c;我們會計算每個patch之間的相對位置&#xff0c;那么我們看到有一連串的拉伸和相減&#xff0c;直接貼代碼&#xff1a; import torch import torch.nn as nntorch.set_printoptio…

Redis 版本演進及主要新特性

Redis 版本發布歷史 穩定版本時間線 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新穩定版(截至…

HTML5 Geolocation(地理定位)學習筆記

一、HTML5 Geolocation簡介 HTML5 Geolocation&#xff08;地理定位&#xff09;API用于獲取用戶的地理位置信息。通過這個API&#xff0c;可以獲取用戶的緯度、經度、海拔等信息。由于地理定位可能涉及用戶隱私&#xff0c;因此只有在用戶同意的情況下&#xff0c;才能獲取其…

愛普生VG3225EFN壓控晶振5G基站低噪聲的解決方案

在 5G 通信網絡的高速發展中&#xff0c;系統噪聲的控制成為保障網絡可靠性與數據吞吐量的關鍵。愛普生 VG3225EFN 壓控晶振憑借其卓越的低噪聲特性&#xff0c;成為 5G 基站時鐘系統的理想選擇。通過創新的技術設計&#xff0c;這款晶振不僅為基站提供了穩定的時鐘基準&#x…

【問題解決】Linux安裝conda修改~/.bashrc配置文件后,root 用戶下顯示 -bash-4.2#

問題描述 在Linux安裝conda下的python環境時候&#xff0c;修改了~/.bashrc文件&#xff0c;修改完成后&#xff0c;再次進入服務器后&#xff0c;登錄時候顯示的不是正常的[rootlocalhost ~]#&#xff0c;而是-bash-4.2# 原因分析&#xff1a; 網上原因有&#xff1a;/root下…

機器學習knnlearn5

import numpy as np from os import listdir from sklearn.neighbors import KNeighborsClassifier as kNN# 此函數用于將一個32x32的文本文件轉換為一個1x1024的一維向量 def img2vector(filename):"""將32x32的文本文件轉換為1x1024的向量:param filename: 要…

git revert 用法實戰:撤銷一個 commit 或 merge

git revert 1 區別 ? 常規的 commit &#xff08;使用 git commit 提交的 commit&#xff09; ? merge commit 2 首先構建場景 master上的代碼 dev開發分支上&#xff0c;添加一個a標簽&#xff0c;并commit這次提交 切到master上&#xff0c;再次進行改動和提交 將de…

自然語言處理|高效法律助手:AI如何解析合同條款?

引言&#xff1a;法律 AI 的崛起 在數字化浪潮快速發展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一個陌生的概念&#xff0c;它正以快速發展滲透到各個領域&#xff0c;法律行業也不例外。從智能合同審查到法律風險預測&#xff0c;AI 技術為法律工作帶來…

【數據分享】2000—2024年我國鄉鎮的逐年歸一化植被指數(NDVI)數據(年最大值/Shp/Excel格式)

之前我們分享過2000-2024年我國逐年的歸一化植被指數&#xff08;NDVI&#xff09;柵格數據&#xff0c;該逐年數據是取的當年月歸一化植被指數&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我們基于此年度柵格數據按照行政區劃取平均值&#xff0c;得到…

辦公網絡健康監控(域名健康監控)

需求 辦公室訪問一些網絡經常出現故障 現需要時時觀察監控這些網絡的健康 包含專線網等其他網絡 實施 支持 SNMP 且支持 Webhook 發送報警的開源監控系統 hertzbeat:關系型數據庫+時序數據庫; Zabbix:關系型數據庫; LibreNMS:關系型數據庫; Prometheus(包含ale…

藍橋杯 合并數列

問題描述 小明發現有很多方案可以把一個很大的正整數拆成若干個正整數的和。他采用了其中兩種方案&#xff0c;分別將它們列為兩個數組&#xff1a; {a?, a?, ..., a?}{b?, b?, ..., b?} 兩個數組的元素和相同。 定義一次合并操作為&#xff1a;將某個數組中相鄰的兩…

【行駛證識別】批量咕嘎OCR識別行駛證照片復印件圖片里的文字信息保存表格或改名字,基于QT和騰訊云api_ocr的實現方式

項目背景 在許多業務場景中,如物流管理、車輛租賃、保險理賠等,常常需要處理大量的行駛證照片復印件。手動錄入行駛證上的文字信息,像車主姓名、車輛型號、車牌號碼等,不僅效率低下,還容易出現人為錯誤。借助 OCR(光學字符識別)技術,能夠自動識別行駛證圖片中的文字信…

個人學習編程(3-29) leetcode刷題

最后一個單詞的長度&#xff1a; 思路&#xff1a;跳過末尾的空格&#xff0c;可以從后向前遍歷 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的長度&#xff0c; int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //從字符串末尾開始//…

PAT甲級(Advanced Level) Practice 1028 List Sorting

原題 1028 List Sorting - PAT (Advanced Level) Practice 題目大意 輸入n個學生的id、姓名、分數&#xff0c;再輸入C表示對C列進行排序。 id&#xff1a;從小到大排 姓名&#xff1a;姓名不同時從小到大排&#xff0c;相同時id從小到大排 分數&#xff1a;不同時從小到…