Mybatis的sql映射

来源:https://www.cnblogs.com/cugb/archive/2020/07/07/13263807.html
-Advertisement-
Play Games

Mybatis的sql映射 添加: boolean addUser(User user); <insert id="addUser" parameterType="User"> insert into Users(uname,upass) values(#{uname},#{upass}) </in ...


Mybatis的sql映射

添加

boolean addUser(User user);

<insert id="addUser" parameterType="User">
    insert into Users(uname,upass) values(#{uname},#{upass})
</insert>

刪除

boolean deleteUserById(Integer uid);

<delete id="deleteUserById" parameterType="int">
    delete from Users where id = #{uid}
</delete>

修改

boolean update(Map<String,String> map);

<update id="update" parameterType="map">
    update Users set uname = #{uname}
	where uid=#{uid}
</update>

查詢

List<User> selectUserById(Integer uid); 

<select id="selectUserById" resultType="User">
    select * from Users where uid = #{uid}
</select>

參數詳解

映射語句常用屬性

屬性 描述
id 在命名空間中唯一的標識符,可以被用來引用這條語句。
parameterType 將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數。
resultType 期望從這條語句中返回結果的類全限定名或別名。 註意,如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。
resultMap 對外部 resultMap 的命名引用。結果映射是 MyBatis 最強大的特性,resultType 和 resultMap 之間只能同時使用一個。

傳遞參數:使用占位符#{}

  • 一個參數:使用#{value}接收。
  • 同一對象的多個屬性:封裝成對象傳入,使用#{屬性名}接收。
  • 多個參數:封裝成Map集合傳入,使用#{key}接收。

字元串替換:使用${value}替換字元串的一部分內容,可用作模糊匹配。

<!--查詢名稱中含有value值的用戶-->
<select id="selectUserByName" resultType="User">
    select * from user_table where name like '%${value}%'
</select>

ResultMap

作用:匹配結果映射集,常用來處理複雜結構的查詢結果。

使用場景

  • 數據表欄位與其對應的 JavaBean 類屬性名不相同時,無法自動匹配。
  • 查詢結果集結構較為複雜,如查詢用戶信息及其所有訂單集合。

例子

使用場景一:資料庫表中欄位名和pojo類的屬性名不一致

//資料庫  Users     包含欄位 uid、uname、upass
//pojo類的屬性為:uid uname password    
List<User> selectUserById(Integer uid); 

<select id="selectUserById" resultType="User">
    select * from Users where uid = #{uid}
</select>
    
結果為:
Users(uid=1, uname=zhangwuji, password=null)
Users(uid=2, uname=zhaomin, password=null)
Users(uid=3, uname=zhouzhiruo, password=null)
Users(uid=4, uname=xiaozhao, password=null)

將mapper.xml的語句改為

 	<select id="queryUsers" resultMap="UsersMap">
        select * from users
    </select>
   
	<resultMap id="UsersMap" type="Users">
        <result property="uid" column="uid"/>
        <result property="uname" column="uname"/>
        <result property="password" column="upass"/>
    </resultMap>
 
結果為:
Users(uid=1, uname=zhangwuji, password=123456)
Users(uid=2, uname=zhaomin, password=123456)
Users(uid=3, uname=zhouzhiruo, password=123456)
Users(uid=4, uname=xiaozhao, password=123456)

使用場景二:一對多

建表並賦值

CREATE TABLE `student`(
`sid` INT NOT NULL AUTO_INCREMENT COMMENT '學生id',
`sname` VARCHAR(30) NOT NULL COMMENT '學生姓名',
`sage` VARCHAR(30) NOT NULL COMMENT '學生年齡',
`tid` INT NOT NULL COMMENT '老師id',
PRIMARY KEY(`sid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

CREATE TABLE `teacher`(
`tid` INT NOT NULL AUTO_INCREMENT COMMENT '老師id',
`tname` VARCHAR(30) NOT NULL COMMENT '老師姓名',

PRIMARY KEY(`tid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

INSERT INTO teacher (tname) VALUES 
("王老師"),
("李老師"),
("劉老師");

INSERT INTO student (sname,sage,tid) VALUES
('諸葛亮','18',1),
('李白','18',1),
('花木蘭','18',1),
('妲己','18',2),
('貂蟬','18',2),
('小喬','18',2),
('魯班','18',3),
('後裔','18',3),
('伽羅','18',3);

創建pojo類

Student.class

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student {
    private  String sname;
    private  String age;
}

Teacher.class

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher {
    private int tid;
    private String tname;
    private ArrayList<Student> list;
}

創建TeacherDao介面

public interface  TeacherDao {

    ArrayList<Teacher> getTeacher(@Param("tid") int tid);
}

然後創建mapper.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">

<!--命名空間namespace-->
<mapper namespace="com.cugb.dao.TeacherDao">
    <!--sql語句-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select teacher.tid tid1,teacher.tname tname,student.sname sname,student.sage
        from student,teacher
        where
        teacher.tid = student.tid
        and
        teacher.tid = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="tid" column="tid1"/>
        <result property="tname" column="tname"/>
        <collection property="list" ofType="student">
            <result property="sname" column="sname"/>
            <result property="sage" column="sage"/>
        </collection>
    </resultMap>
    
</mapper>

結果:

Teacher(tid=1, tname=王老師, list=[Student(sname=諸葛亮, sage=18), 
								  Student(sname=李白, sage=18), 
                                  Student(sname=花木蘭, sage=18)])

使用場景三:多對一

創建pojo

teacher.class

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Teacher {
    private int tid;
    private String tname;
   
}

student.class

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Getter
@Setter
public class Student {
    private int sid;
    private  String sname;
    private  String sage;
    private  Teacher teacher;
}

創建StudentDao介面

public interface StudentDao {

    public ArrayList<Student> getAllStudent();
}

創建mapper.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">

<!--命名空間namespace-->
<mapper namespace="com.cugb.dao.StudentDao">
    <!--sql語句-->
    <select id="getAllStudent" resultMap="Studenteacher">
        select student.sid sid,student.sname sname,student.sage,teacher.tname
        from student,teacher
        where
        teacher.tid = student.tid

    </select>
    <resultMap id="Studenteacher" type="Student">
        <result property="sid" column="sid"/>
        <result property="sname" column="sname"/>
        <result property="sage" column="sage"/>
        <association property="teacher" javaType="Teacher">
            <result property="tname" column="tname"/>
        </association>
    </resultMap>

</mapper>

結果:

Student(sid=1, sname=諸葛亮, sage=18, teacher=Teacher(tname=王老師))
Student(sid=2, sname=李白, sage=18, teacher=Teacher(tname=王老師))
Student(sid=3, sname=花木蘭, sage=18, teacher=Teacher(tname=王老師))
Student(sid=4, sname=妲己, sage=18, teacher=Teacher(tname=李老師))
Student(sid=5, sname=貂蟬, sage=18, teacher=Teacher(tname=李老師))
Student(sid=6, sname=小喬, sage=18, teacher=Teacher(tname=李老師))
Student(sid=7, sname=魯班, sage=18, teacher=Teacher(tname=劉老師))
Student(sid=8, sname=後裔, sage=18, teacher=Teacher(tname=劉老師))
Student(sid=9, sname=伽羅, sage=18, teacher=Teacher(tname=劉老師))

ResultMap 結構

  • constructor:用於在實例化類時,註入結果到構造方法中。
    • idArg - ID 參數;標記出作為 ID 的結果可以幫助提高整體性能。
    • arg - 將被註入到構造方法的一個普通結果。
  • id : 一個 ID 結果;標記出作為 ID 的結果可以幫助提高整體性能。
  • result – 註入到欄位或 JavaBean 屬性的普通結果。
  • association:一個複雜類型的關聯;許多結果將包裝成這種類型。
    • 嵌套結果映射 – 關聯可以是 resultMap 元素,或是對其它結果映射的引用。
  • collection:一個複雜類型的集合。
    • 嵌套結果映射 – 集合可以是 resultMap 元素,或是對其它結果映射的引用。
  • discriminator:使用結果值來決定使用哪個resultMap
    • case - 基於某些值的結果映射
      • 嵌套結果映射 – case 也是一個結果映射,因此具有相同的結構和元素;或者引用其它的結果映射

ResultMap 屬性

屬性 描述
id 當前命名空間中的一個唯一標識,用於標識一個結果映射。
type 類的完全限定名, 或者一個類型別名。
autoMapping 如果設置這個屬性,MyBatis 將會為本結果映射開啟或者關閉自動映射。預設未設置。

id & result 屬性

屬性 描述
property 映射到列結果的欄位或屬性名。如果 JavaBean 有這個名字的屬性(property),會先使用該屬性。否則 MyBatis 將會尋找給定名稱的欄位(field)。
column 資料庫中的列名,或者是列的別名。
javaType 一個 Java 類的全限定名,或一個類型別名。 如果你映射到一個 JavaBean,MyBatis 通常可以推斷類型。然而,如果你映射到的是 HashMap,那麼你應該明確地指定 javaType 來保證行為與期望的相一致。
jdbcType JDBC 類型,只需要在可能執行插入、更新和刪除的且允許空值的列上指定 JDBC 類型。如果你直接面向 JDBC 編程,你需要對可以為空值的列指定這個類型。
typeHandler 使用這個屬性,你可以覆蓋預設的類型處理器。 這個屬性值是一個類型處理器實現類的全限定名,或者是類型別名。

總結

  • sql映射主要是記住各標簽的用處

    屬性 描述
    id 在命名空間中唯一的標識符,可以被用來引用這條語句。
    parameterType 將會傳入這條語句的參數的類全限定名或別名。這個屬性是可選的,因為 MyBatis 可以通過類型處理器(TypeHandler)推斷出具體傳入語句的參數。
    resultType 期望從這條語句中返回結果的類全限定名或別名。 註意,如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身的類型。 resultType 和 resultMap 之間只能同時使用一個。
    resultMap 對外部 resultMap 的命名引用。結果映射是 MyBatis 最強大的特性,resultType 和 resultMap 之間只能同時使用一個。
  • resultmap處理一對多,多對一是重點難點

    • 創建pojo對象儘量根據資料庫欄位來,避免複雜結果的處理
    • 創建pojo的類,相當於一個臨時的數據結構,所以創建時,應以實際需要的數據為準,而不是把資料庫的所有欄位都搬過來
    • 如果pojo的屬性是一個對象,用asossiation來處理, 對應的是javaType
    • 如果pojo的屬性是一個對象,用collection來處理, 對應的是ofType
    • sql語句先在資料庫中測試,確診正確了再搬過來

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天為什麼要給大家講解這個東西呢,因為css這部分,尤其是數值這部分感覺非常簡單,但是尤其是簡單的,卻很多人根本就沒有弄懂。所以今天就來講一下css的數值問題吧。大家還是好好聽一下吧。 width height 百分比 當元素的height、width設置為百分比時,分別基於包含它的塊級對象的高度、 ...
  • 今天面試了一個前端實習生,我問了一個比較簡單的問題,就是css如何實現元素垂直居中的問題,但是要說出多種方案。其實他說的不錯,基本上說到了flex佈局,grid佈局等下麵提到的佈局。還不錯,但是這幾種都是已經經常用的,老生常談,但是我想聽到他說一種用的比較少的解決方案,瞭解一下他學習的深度和廣度。但 ...
  • 許多同學是不是還在徘徊、猶豫、糾結的階段,想學怕學不好,甚至不知從何入手,下麵這篇文章幫助想轉行前端及想學好Web前端開發的同學們解決心中的困惑。 1HTML的學習 超文本標記語言(HyperTextMark-up Language簡稱HTML)是一個網頁的骨架,無論是靜態網頁還是動態網頁,最終返回 ...
  • 前端埋點主要是為了服務運營人員採集用戶行為數據,進行後續的數據分析工作。 前端監控和埋點能做什麼 數據監控(用戶行為) pv,uv 記錄操作系統 用戶在每一個頁面的停留時間(離開頁面,進入頁面) 用戶進入的入口 用戶在相應頁面的觸發行為,點擊按鈕 性能監控 (js中的performance) 用戶的 ...
  • 綜合來講,Web前端培訓分為HTML5+CSS3、JS交互設計、移動端、伺服器、前端框架、小程式六大模塊,下麵就為大傢具體介紹每個階段學什麼。 第一階段前端核心基礎,讓學員掌握前端基礎知識包括HTML5與CSS的基礎知識和代碼的撰寫會學習PC端網站佈局以及jQuery框架。 第二階段HTML5 + ...
  • web前端現在是一個很熾手可熱的職業,現在前端工程師到底能賺多少錢?月薪3000和30000的工程師到底差在哪?前端的待遇為什麼這麼高? 今天我們來具體分析一下。 web前端的薪資是多少? 我們先用三個數據瞭解一下。 web前端在北京地區的薪資: 北京前端開發工程師平均工資:¥ 18690/月,取自 ...
  • 開發一個 IDE 很難麽?這或許是件很難的事情,但當我們參考 VSCode 的技術構架來看,整個開發流程就會平滑順暢很多,從內核開發、代碼編輯器、視圖結構到插件系統,在這整個技術構架中我們可以看到很多一個 IDE 開發中需要註意的方方面面。如果你對 VSCode 深入研究過,相信可以從中頗受啟發,在 ...
  • 作者:凹凸曼 - Barrior 在 Canvas 中對文本填充水平或垂直的線性漸變可以輕易實現,而帶角度的漸變就複雜很多;就好像下麵這樣,假設文本矩形寬為 W, 高為 H, 左上角坐標為 X, Y。 猜想與答案 給出兩個答案: 正確答案是圖二,因為這樣得出來的坐標生成的漸變最緊接文本矩形邊界,它的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...