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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...