MyBatis————入門

1,配置相關

我們上一期詳細講了一下使用注解來實現操作數據庫的方式,我們今天使用xml來實現,有同學可能有疑問,使用注解挺方便呀,為啥還要注解呀,先來說一下注解我感覺挺麻煩的,但是我們后面要學動態SQL,注解就要要重寫一遍xml到注解,更麻煩了,所以我們還是要學這個,xml和注解是可以共存的,所以不怕沖突;

我們先來準備工作:

根據數據庫創建model字段,

@Data
public class userInfo {private Integer id;private String userName;private String password;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

?

下一個這個插件:

寫yml配置:
?

  # 數據庫連接配置datasource:url: jdbc:mysql://127.0.0.1:3306/book_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration:map-underscore-to-camel-case: true #配置駝峰?動轉換log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql語句mapper-locations: classpath:mapper/**Mapper.xml

最后一行就是yml的配置了,這一行的意思是我們在resources路徑下創建一個mapper包,里面放一個~~名后后綴是Mapper.xml的文件,這個可以自己起名;

之后在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="org.example.java_test_6_7.mapper.UserMapper"></mapper>

?這個namespace對應的是自己項目名,后面.mapper.UserMapper對應的是這塊

?下面我們點擊那個小藍鳥,如果能跳轉到小紅鳥那,就說明我們跳轉成功了;、


2,CRUD

1,增

@Mapper
public interface UserMapper {void insertUserInfo(UserInfo userInfo);
}

之后在mapper中寫:(可以直接alt+enter生成)

    <insert id="insertUserInfo"></insert>

?

注意這個要頂格寫

    <insert id="insertUserInfo">insert into user_info (user_name,password,delete_flag) values (#{userName},#{password},#{deleteFlag})</insert>
@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid insertUserInfo() {UserInfo userInfo = new UserInfo();userInfo.setUserName("yaoyu");userInfo.setPassword("12412");userInfo.setDeleteFlag(0);userMapper.insertUserInfo(userInfo);}
}

?寫測試類,測試通過,看看效果:

增添成功了;?

2,刪

把剛才添加的字段刪了:
?

    void deleteUserInfoById(Integer id);
    <delete id="deleteUserInfoById">delete from user_info where id = #{id}</delete>
    @Testvoid deleteUserInfoById() {userMapper.deleteUserInfoById(11);}

?刪除成功了。

3,查

    UserInfo selectUserInfoBYId(Integer id);
    <select id="selectUserInfoBYId" resultType="org.example.java_test_6_7.model.UserInfo">select * from user_info where id = #{id}</select>
    @Testvoid selectUserInfoBYId() {UserInfo userInfo = userMapper.selectUserInfoBYId(1);System.out.println(userInfo);}

成功查詢并拿到值了;?

4,改

void updateUserInfoById(UserInfo userInfo);
    <update id="updateUserInfoById">update user_info set user_name=#{userName}, password=#{password} ,delete_flag=#{deleteFlag} where id =#{id}</update>
    @Testvoid updateUserInfoById() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setUserName("姚宇");userInfo.setPassword("3141");userInfo.setDeleteFlag(0);userMapper.updateUserInfoById(userInfo);}

OK了?

5,java和數據庫參數名對應不上

還是那三個方法

1,使用as

2,結果映射

3,駝峰自動轉換

1和3跟注解是一模一樣的就不講了,這里我們講結果映射:

UserInfo selectUserInfoBYId2(Integer id);
    <resultMap id="base" type="org.example.java_test_6_7.model.UserInfo"><result column="delete_flag" property="deleteFlag"></result><result column="user_name" property="userName"></result><result column="create_time" property="createTime"></result><result column="update_time" property="updateTime"></result></resultMap>
    @Testvoid selectUserInfoBYId2() {UserInfo userInfo = userMapper.selectUserInfoBYId2(1);System.out.println(userInfo);}

?看結果:

OK的,這里我已經把駝峰自動轉換關掉了;?


3,多表查詢

再來一個表,我們來弄model?;

@Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer count;private BigDecimal price;private String publish;private Integer status;private Date createTime;private Date updateTime;
}

來寫一個多表查詢語句?

SELECT bo.id, bo.book_name, bo.author, uo.user_name, uo.`password` FROM user_info uo LEFT JOIN book_info bo ON bo.id = uo.id WHERE bo.id = 1

?

結果,那我們該怎么接收它呢,我們只需要再創建一個對象,對應這個字段的屬性就好了;

@Data
public class Testselect {private Integer id;private String bookName;private String author;private String userName;private String password;
}
    @Select("SELECT bo.id, bo.book_name, bo.author, uo.user_name, uo.`password` FROM user_info uo LEFT JOIN book_info bo ON bo.id = uo.id WHERE bo.id = #{id}")TestSelect selectUserInfoAndBookInfoById(Integer id);
    @Testvoid selectUserInfoAndBookInfoById() {TestSelect testSelect = userMapper.selectUserInfoAndBookInfoById(1);System.out.println(testSelect);}

?

?成功查到了


4,#{}和${}的區別

現在來正式講一下$和#,

看一下#號的,這個?id后面是一個?下面表示它要填寫的值,這個是預編譯SQL用?來站位

看下用${}的:

    @Select("select * from user_info where id = ${id}")UserInfo selectUserInfoById3(Integer id);
    void selectUserInfoById3() {UserInfo userInfo = userMapper.selectUserInfoById3(1);System.out.println(userInfo);}

看到是沒有任何占位符的,這個是即時SQL,

    @Select("select * from user_info where user_name = ${userName}")UserInfo selectUserInfoById4(String userName);

?來看看這個字符串的

    @Testvoid testSelectUserInfoById4() {UserInfo userInfo = userMapper.selectUserInfoById4("姚宇");System.out.println(userInfo);}

發現報錯了啊,?這說明是SQL語句出現了問題的,這個是因為是直接拼接的,沒有引號,正常字符串是需要加引號的,

    @Select("select * from user_info where user_name = '${userName}'")UserInfo selectUserInfoById4(String userName);

?

這下就通過了;?

我們來具體說說區別:
主要區別就是即時SQL和預編譯SQL的區別;

即時SQL呢,首先解析語法和語句,檢驗SQL是否正確,優化SQL語句,指定執行計劃,之后執行返回結果;

1. 性能更? 絕?多數情況下,某?條SQL語句可能會被反復調?執?,或者每次執?的時候只有個別的值不同(? 如select的where?句值不同,update的set?句值不同,insert的values值不同).如果每次都需要 經過上?的語法解析,SQL優化、SQL編譯等,則效率就明顯不?了.

預編譯SQL,編譯?次之后會將編譯后的SQL語句緩存起來,后?再次執?這條語句時,不會再次編譯 (只是輸?的參數不同),省去了解析優化等過程,以此來提?效率

1. 更安全(防?SQL注?) SQL注?:是通過操作輸?的數據來修改事先定義好的SQL語句,以達到執?代碼對服務器進?攻擊的 ?法。?

這個SQL注入是很嚴重的,那我們還有使用$的必要了嗎,當然是有的,我們可以自己處理來預防SQ注入,還有一些功能是需要使用$而#是用不了的

1,排序

    @Select("select * from book_info order by id ${sort}")List<BookInfo> selectBooInfoOrderById(String sort);
    @Testvoid selectBooInfoOrderById() {userMapper.selectBooInfoOrderById("DESC");}

查到了;

為啥只能用$呢,因為sql中這個DESC是不加''號的,但是使用#的話會把我們傳入的字符串自動加引號,但是sql語法是不對的;

2,like

    @Select("select * from book_info where book_name like concat('%','${key}','%')")List<BookInfo> selectBooInfoLike(String key);
    @Testvoid selectBooInfoLike() {userMapper.selectBooInfoLike("");}

?

?

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

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

相關文章

【推薦算法】推薦算法演進史:從協同過濾到深度強化學習

推薦算法演進史&#xff1a;從協同過濾到深度強化學習 一、傳統推薦時代&#xff1a;協同過濾的奠基&#xff08;1990s-2006&#xff09;1.1 算法背景&#xff1a;信息爆炸的挑戰1.2 核心算法&#xff1a;協同過濾1.3 局限性 二、深度學習黎明&#xff1a;神經網絡初探&#xf…

Java基于SpringBoot的校園閑置物品交易系統,附源碼+文檔說明

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

Ajax Systems公司的核心產品有哪些?

Ajax Systems 是一家專注于家庭安全和智能系統的公司&#xff0c;其核心產品如下3&#xff1a; 入侵保護設備&#xff1a;如 MotionCam Outdoor 無線室外運動探測器&#xff0c;配備內置攝像頭和兩個紅外傳感器&#xff0c;可通過預裝電池運行長達三年&#xff0c;能在 15 米距…

64、js 中require和import有何區別?

在 JavaScript 中&#xff0c;require 和 import 都是用于模塊導入的語法&#xff0c;但它們屬于不同的模塊系統&#xff0c;具有顯著的區別&#xff1a; 1. 模塊系統不同 require 屬于 CommonJS 模塊系統&#xff08;Node.js 默認使用&#xff09;。 語法&#xff1a;const…

Java+Access綜合測評系統源碼分享:含論文、開題報告、任務書全套資料

JAVAaccess綜合測評系統畢業設計 一、系統概述 本系統采用Java Swing開發前端界面&#xff0c;結合Access數據庫實現數據存儲&#xff0c;專為教育機構打造的綜合測評解決方案。系統包含學生管理、題庫管理、在線測評、成績分析四大核心模塊&#xff0c;實現了測評流程的全自…

【python】RGB to YUV and YUV to RGB

文章目錄 1、YUV2、YUV vs RGB3、RGB to YUV4、YUV to RGB附錄——YUV NV12 vs YUV NV21參考1、YUV YUV 顏色空間,又常被稱作 YCbCr 顏色空間,是用于數字電視的顏色空間,在 ITU-R BT.601、BT.709、BT.2020 標準中被明確定義,這三種標準分別針對標清、高清、超高清數字電視…

運行示例程序和一些基本操作

歡迎 ----> 示例 --> 選擇sample CTRL B 編譯代碼 CTRL R 運行exe 項目 中 Shadow build 表示是否 編譯生成文件和 源碼是否放一塊 勾上不在同一個地方 已有項目情況下怎么打開項目 方法一: 左鍵雙擊 xxx.pro 方法二: 文件菜單里面 選擇打開項目

計算機網絡第2章(下):物理層傳輸介質與核心設備全面解析

目錄 一、傳輸介質1.1 傳輸介質的分類1.2 導向型傳輸介質1.2.1 雙絞線&#xff08;Twisted Pair&#xff09;1.2.2 同軸電纜&#xff08;Coaxial Cable&#xff09;1.2.3 光纖&#xff08;Optical Fiber&#xff09;1.2.4 以太網對有線傳輸介質的命名規則 1.3 非導向型傳輸介質…

PHP文件包含漏洞詳解:原理、利用與防御

PHP文件包含漏洞詳解&#xff1a;原理、利用與防御 什么是文件包含漏洞&#xff1f; 文件包含漏洞是PHP應用程序中常見的安全問題&#xff0c;當開發者使用包含函數引入文件時&#xff0c;如果傳入的文件名參數未經嚴格校驗&#xff0c;攻擊者就可能利用這個漏洞讀取敏感文件…

5.4.2 Spring Boot整合Redis

本次實戰主要圍繞Spring Boot與Redis的整合展開&#xff0c;首先創建了一個Spring Boot項目&#xff0c;并配置了Redis的相關屬性。接著&#xff0c;定義了三個實體類&#xff1a;Address、Family和Person&#xff0c;分別表示地址、家庭成員和個人信息&#xff0c;并使用Index…

java內存模型JMM

Java 內存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09;定義了 Java 程序中的變量、線程如何和本地內存以及主內存進行交互的規則。它主要涉及到多線程環境下的共享變量可見性、指令重排等問題&#xff0c;是理解并發編程中的關鍵概念。 核心概念&#xff1a…

配置git命令縮寫

以下是 Git 命令縮寫的配置方法及常用方案&#xff0c;適用于 Linux/macOS/Windows 系統&#xff1a; &#x1f527; 一、配置方法 1. 命令行設置&#xff08;推薦&#xff09; # 基礎命令縮寫 git config --global alias.st status git config --global alias.co che…

準確--k8s cgroup問題排查

k8s cgroup問題排查 6月 06 17:20:39 k8s-node01 containerd[1515]: time"2025-06-06T17:20:39.42902033408:00" levelerror msg"StartContainer fo r \"46ae0ef9618b96447a1f28fd2229647fe671e8acbcec02c8c46b37051130c8c4\" failed" error&qu…

Go 中 map 的雙值檢測寫法詳解

Go 中 map 的雙值檢測寫法詳解 在 Go 中&#xff0c;if char, exists : pairs[s[i]]; exists { 是一種利用 Go 語言特性編寫的優雅條件語句&#xff0c;用于檢測 map 中是否存在某個鍵。讓我們分解解釋這種寫法&#xff1a; 語法結構解析 if value, ok : mapVariable[key]; …

C# Wkhtmltopdf HTML轉PDF碰到的問題

最近碰到一個Html轉PDF的需求&#xff0c;看了一下基本上都是需要依賴Wkhtmltopdf&#xff0c;需要在Windows或者linux安裝這個可以后使用。找了一下選擇了HtmlToPDFCore&#xff0c;這個庫是對Wkhtmltopdf.NetCore簡單二次封裝&#xff0c;這個庫的好處就是通過NuGet安裝HtmlT…

grafana 批量視圖備份及恢復(含數據源)

一、grafana 批量視圖備份 import requests import json import urllib3 import osfrom requests.auth import HTTPBasicAuthfilename_folders_map "folders_map.json" type_folder "dash-folder" type_dashboard "dash-db"# Grafana服務器地…

.Net Framework 4/C# 關鍵字(非常用,持續更新...)

一、is 關鍵字 is 關鍵字用于檢查對象是否于給定類型兼容,如果兼容將返回 true,如果不兼容則返回 false,在進行類型轉換前,可以先使用 is 關鍵字判斷對象是否與指定類型兼容,如果兼容才進行轉換,這樣的轉換是安全的。 例如有:首先創建一個字符串對象,然后將字符串對象隱…

露亦如電 · 時之沙 | 讓遺憾在灰燼里隨風而去

注&#xff1a;略作重排&#xff0c;未整理去重。 一個人最了不起的能力&#xff1a;快速翻篇 原創 十點邀約作者 棠唐 2022 年 11 月 29 日 20:12 福建 《了凡四訓》有言&#xff1a;“從前種種&#xff0c;譬如昨日死&#xff1b;從后種種&#xff0c;譬如今日生。” 人生猶…

python爬蟲:Newspaper3k 的詳細使用(好用的新聞網站文章抓取和解析的Python庫)

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、Newspaper3k 概述1.1 Newspaper3k 介紹1.2 主要功能1.3 典型應用場景1.4 安裝二、基本用法2.2 提取單篇文章的內容2.2 處理多篇文檔三、高級選項3.1 自定義配置3.2 分析文章情感四、實戰案例4.1 構建新聞摘要聚合器…

FastAPI安全機制:從OAuth2到JWT的魔法通關秘籍

title: FastAPI安全機制:從OAuth2到JWT的魔法通關秘籍 date: 2025/06/07 08:40:35 updated: 2025/06/07 08:40:35 author: cmdragon excerpt: FastAPI 的安全機制基于 OAuth2 規范、JWT 和依賴注入系統三大核心組件,提供了標準化的授權框架和無狀態的身份驗證。OAuth2 密碼流…