欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入淺出MyBatis映射器

 更新時間:2024年04月16日 09:37:32   作者:Davieyang.D.Y  
映射器是MyBatis最復雜也最重要的組件,也是基于MyBatis應用程序開發(fā)中,本文主要介紹了深入淺出MyBatis映射器,具有一定的參考價值,感興趣的可以了解一下

映射器是MyBatis最復雜也最重要的組件,也是基于MyBatis應用程序開發(fā)中,占工作量比較大的工作,甚至能達到8成;映射器由Mapper接口和XML或者注解組成,在映射器中可以配置參數(shù),各類SQL語句,存儲過程、緩存、級聯(lián)等復雜處理,并通過簡易的映射規(guī)則將數(shù)據(jù)映射到指定的POJO或其對象上,這也是MyBatis核心運轉邏輯

在XML和注解之間的選擇其實很明顯,其一面對復雜SQL,尤其比較長的SQL,注解會顯得很無力;其二注解的可讀性較差,尤其是對于那些需要復雜配置的SQL;其三注解沒有XML上下文相互引用的優(yōu)勢

MyBatis映射器可配置元素

MyBatis映射器配置文件中可以包含以下主要元素,這些元素用于定義與數(shù)據(jù)庫交互的各種操作和相關配置:

  • <select>:代表SQL的SELECT語句,用于從數(shù)據(jù)庫中查詢數(shù)據(jù),可以設置屬性如id(唯一標識該查詢)、parameterType(傳入?yún)?shù)的全限定類名或別名)、resultTyperesultMap(指定查詢結果的映射類型或引用的結果映射)??梢酝ㄟ^fetchSize、timeout等屬性控制查詢行為,以及使用flushCacheuseCache等屬性管理緩存。
  • <insert>:用于執(zhí)行INSERT語句向數(shù)據(jù)庫中插入數(shù)據(jù)。配置屬性包括id、parameterType(插入數(shù)據(jù)對象的類型)??梢栽O置useGeneratedKeyskeyProperty(或keyColumn)來啟用自動增長主鍵并將其值映射到指定的Java屬性上。statementType屬性可以指定語句類型,如STATEMENTPREPAREDCALLABLE。
  • <update>:定義UPDATE語句,用于更新數(shù)據(jù)庫中的記錄。同樣具有id、parameterType屬性,指定更新操作的唯一標識和傳入?yún)?shù)類型??梢栽O置flushCache屬性決定是否刷新二級緩存。
  • <delete>:定義DELETE語句,刪除數(shù)據(jù)庫中的數(shù)據(jù)。包含id、parameterType屬性,分別表示操作標識和刪除條件所對應的參數(shù)類型。通常也支持flushCache屬性以控制緩存刷新。
  • <sql>:定義可重用的SQL片段,其中的SQL語句可以被其他元素(如<select>、<insert>等)通過include屬性引用。有助于減少重復編寫相同的SQL子句,提高代碼復用性。
  • <resultMap>:定義結果集映射規(guī)則,將查詢結果與Java對象的屬性進行關聯(lián)。包括id(唯一標識該結果映射)、type(結果對象的全限定類名或別名)??梢酝ㄟ^<id><result>、<association>、<collection>等子元素詳細描述如何將查詢結果的列映射到對象的屬性、嵌套對象或集合屬性上。
  • <parameterMap>:注意: 在較新版本的MyBatis中,已不再推薦使用<parameterMap>,而是直接使用parameterType屬性。老版本中用于定義輸入?yún)?shù)的映射規(guī)則,與<resultMap>類似,但主要用于處理復雜的參數(shù)結構。新版本中通常直接使用parameterType屬性指定參數(shù)類型。
  • <cache>:定義二級緩存配置,可以設置緩存的類型、大小、超時策略、清除策略等屬性。適用于那些查詢結果相對穩(wěn)定且希望在多次請求之間共享結果的場景。
  • <cache-ref>:引用其他命名空間中定義的緩存配置,避免重復定義。通過namespace屬性指定要引用的緩存配置所在的命名空間。這些元素構成了MyBatis映射器的基本構建塊,通過它們可以靈活地配置各種數(shù)據(jù)庫操作,并精確地控制SQL語句的執(zhí)行、參數(shù)傳遞、結果映射以及緩存策略等細節(jié)。在實際使用中,可以根據(jù)業(yè)務需求選擇合適的元素組合來實現(xiàn)高效的數(shù)據(jù)庫訪問

Select元素

<select>元素在 MyBatis 映射器配置文件中用于定義 SQL SELECT 查詢語句及其相關屬性。以下是<select> 元素常見的屬性及其詳細解釋:

  • id:必填屬性,它和Mapper的命名空間組合起來是唯一的,形成唯一標識符,供MyBatis調用,比如:id="getUserById"
  • parameterType:可選屬性,用于指定傳入查詢語句的參數(shù)類型,可以是全限定類名或也可以是類型別名,但必須是MyBatis的內置別名或者自定義別名,當查詢需要接受參數(shù)時,使用此屬性聲明參數(shù)類型,參數(shù)可以是簡單類型(如 int、String),復雜類型(如自定義 Java Bean),或者 Map 類型。若使用類型別名,需在全局配置文件或當前映射文件中提前定義。
  • resultType:可選屬性,用于指定查詢結果的預期類型。
    格式:全限定類名或類型別名,在允許自動匹配的情況下,結果集將通過Java Bean的規(guī)范映射,或者定義為int、double、float、map等參數(shù);當查詢結果是一條記錄映射到單個對象時,使用此屬性指定對象類型。MyBatis 會自動將查詢結果的每一行數(shù)據(jù)映射到指定類型的對象實例。若使用類型別名,需在全局配置文件或當前映射文件中提前定義(不能和resultMap同時使用)
  • resultMap:可選屬性,其作用是引用已定義的 <resultMap>,用于定制更復雜的查詢結果映射規(guī)則,應與 <resultMap> 元素的id 屬性值匹配;當查詢結果需要進行精細的列到屬性映射,或者涉及嵌套結果集、聯(lián)合查詢、自動關聯(lián)等復雜情況時,使用此屬性替代 resultType,指定的 必須在同一映射文件中預先定義。
  • flushCache:可選屬性,其作用是控制是否在調用SQL后要求MyBatis清空之前查詢的本地緩存和二級緩存,默認值:false(默認情況下,查詢不會刷新緩存)
  • useCache:可選屬性,指示是否對查詢結果啟用二級緩存。默認值:true(默認情況下,查詢結果會被緩存)
  • timeout:可選屬性,設置查詢語句的超時時間(單位:秒),默認值由JDBC驅動或全局配置中的 defaultStatementTimeout 決定。
  • fetchSize:可選屬性,為 JDBC Statement 設置預取結果集的大小,默認值由JDBC 驅動決定。
  • statementType:較少使用,用來指定執(zhí)行 SQL 語句的方式,默認值:PREPARED(預編譯語句)有3個選項:STATEMENT:靜態(tài) SQL(非預編譯)、PREPARED:預編譯語句(推薦)、CALLABLE:存儲過程調用
  • resultOrdered:較少使用,其作用是指示 MyBatis 是否應該保持結果集的順序與 SQL 中 ORDER BY 子句指定的順序一致。默認值:false(默認情況下,MyBatis 不保證結果集順序與 ORDER BY 完全一致)
  • resultSetType:較少使用其作用是指定 ResultSet 的類型(僅在使用 STATEMENT 語句類型時有意義)默認值:FORWARD_ONLY(默認情況下,使用只進游標),選項包括:FORWARD_ONLY:只進游標(不可回滾)、SCROLL_SENSITIVE:敏感滾動游標(可回滾,但可能無法看到其他事務的最新更改)、SCROLL_INSENSITIVE:不敏感滾動游標(可回滾,且不受其他事務更改影響)
  • resultSets::極少使用,其作用是當查詢語句返回多個結果集或光標時,使用此屬性指定結果集的名稱或索引。

總結起來,<select>元素的主要屬性用于定義查詢語句的身份標識、輸入?yún)?shù)類型、輸出結果映射方式、緩存策略、查詢超時、預取大小等執(zhí)行特性。這些屬性幫助開發(fā)者精細控制查詢行為,確保與數(shù)據(jù)庫交互的高效性和靈活性。在實際應用中,最常用的屬性通常是id、parameterType、resultType或 resultMap、flushCache和 useCache其他屬性在特定場景下可能會發(fā)揮作用,但并不常用。

Select元素實例 單個參數(shù)

    <select id="countUserByFirstName" parameterType="string" resultType="int">
        select count(*) total from t_user where user_name like concat ('%',#{firstName, jdbcType=VARCHAR, javaType=String},'%')
    </select>

SQL很容易懂,里邊的元素可以參考對應上邊每一項的解釋理解,有了SQL,就需要對應的Mapper接口和方法(也就是Dao Data Access Object)public Integer countUserByFirstName(String firstName)

在MyBatis的配置文件的settings元素中,有autoMappingBehavior和mapUnderscoreToCamelCase兩個可配置的選項,他們是控制自動映射和駝峰映射的開關,一般來說自動映射會用的多一些,這樣可以使用SQL的別名機制,更加靈活,而駝峰映射要求比較嚴格;autoMappingBehavior配置項有3個選擇,NONE表示不自動映射,PARTIAL是默認值,表示只對沒有嵌套的結果集自動映射,F(xiàn)ULL表示對所有的結果集自動映射包括嵌套結果集,通常默認即可

假設我們有如下這么一個POJO

package com.ssm.pojo;
import org.apache.ibatis.type.Alias;
@Alias("role")
public class Role{
	private int id;
	private String roleName;
	private String note;
	/**  setters and getters */
}

在這個POJO里有三個屬性id、roleName、note,如果在Mapper里編寫SQL列名和屬性名保持一致,它就會形成自動映射,例如

    <select id="getRole" parameterType="int" resultType="role">
        select id, role_name as roleName, note from t_role where id = #{id}
    </select>

列名role_name被別名roleName代替了,和POJO上的屬性名保持一致,如此MyBatis就能將查詢結果集和POJO的屬性一一對應,自動完成映射無需再進行任何配置

如果嚴格按照駝峰命名法,比如數(shù)據(jù)庫字段為role_name,POJO屬性名為roleName,數(shù)據(jù)庫字段名為user_name,POJO屬性名為userName,那么只要在配置項把mapUnderscoreToCamelCase設置為true即可,如果這樣,那么SQL就可以寫成

select id, role_name, note from t_role where id = #{id}

MyBatis會嚴格按照駝峰命名的方式自動映射,只是這樣要求數(shù)據(jù)字段和POJO的屬性名嚴格對應

自動映射和駝峰映射都建立在SQL列名和POJO屬性名的映射關系上,在實際使用中會更復雜,比如可能有些字段有主表和從表關聯(lián)的級聯(lián)關系,又比如typeHandler的轉換規(guī)則復雜,此時resultType元素無法滿足這些需求需要更強大的映射規(guī)則需要考慮使用resultMap等等

Select元素實例 使用Map傳遞多個參數(shù)

假設有這樣一個Mapper接口定義,它通過鍵值對傳遞多個參數(shù)

public List<Role> findRolesByMap(Map<String, Object>parameterMap);

此時傳遞給映射器的一個Map對象,使用它在SQL中設置對應的參數(shù),如下所示

    <select id="findRoleByMap" parameterType="map" resultType="role">
        select id, role_name as roleName, note from t_role 
        where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note},'%')
    </select>

這里使用兩個數(shù)據(jù)庫字段進行了一個模糊查詢,傳參方式是使用map,執(zhí)行代碼如下所示

RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
Map<String, Object>parameterMap = new HashMap<>();
parameterMap.put("roleName", "1");
parameterMap.put("note","1");
List<Role> roleList = roleDao.findRolesByMap(parameterMap);

嚴格來說Map幾乎適用于所有場景,但其可讀性比較差,且不能限定其傳遞的數(shù)據(jù)類型

Select元素實例 使用注解傳遞多個參數(shù)

MyBatis提供了@Param(org.apache.ibatis.annotations.Param),可以通過它定義映射器的參數(shù)名稱,如下代碼所示

public List<Role> findRolesByAnnotation(@Param("roleName") String roleName, @Param("note") String note);

Mapper文件如下所示

    <select id="findRolesByAnnotation" "resultType="role">
        select id, role_name as roleName, note from t_role 
        where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note},'%')
    </select>

Select元素實例 使用JavaBean傳遞多個參數(shù)

先定義一個POJO

package com.ssm.pojo.parameter;

public class RoleParams{
	private String roleName;
	private String note;
	/** setter and getter */
}

把Mapper接口定義為

public List<Role> findRolesByBean(RoleParams roleParam);

Mapper文件如下所示

    <select id="findRolesByBean" "resultType="role" parameterType="com.ssm.pojo.parameter.RoleParams">
        select id, role_name as roleName, note from t_role 
        where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note},'%')
    </select>

執(zhí)行代碼如下

sqlSession = SqlSessionFactoryUtils.openSqlSession();
RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
RoleParams roleParams = new RoleParams();
roleParams.setNote("1");
roleParams.setRoleName("1");
List<Role>roleList = roleDao.findRolesByBean(roleParams);

在某些場景下也會混合使用,例如通過角色名稱和備注查詢角色,同時需要支持分頁

分頁的POJO如下定義

package com.ssm.pojo.parameter;
public class PageParams{
	private int start;
	private int limit;
	/** setters and getters */
}

Mapper接口如下

public List<Role> findByMix(@Param("params") RoleParams roleParams, @Param("page") PageParams PageParam);

Mapper文件如下寫法

    <select id="findByMix" "resultType="role">
        select id, role_name as roleName, note from t_role 
        where role_name like concat('%', #{params.roleName}, '%') and note like concat('%', #{params.note},'%')
        limit #{page.start}, #{page.limit}
    </select>

MyBatis對params和page這類JavaBean參數(shù)提供EL(中間語言)支持,為編程帶來了很多便利

結果集映射resultMap

自動映射和駝峰映射規(guī)則比較簡單,無法定義更多的屬性和滿足復雜的場景,例如枚舉需要typeHandler,還有數(shù)據(jù)級聯(lián)等等,因此select元素提供了resultMap屬性,用于指定具體的resultMap作為映射規(guī)則,如下定義所示

<result Map id="roleMap" type="role">
	<id property="id" column="id"/>
	<result property="roleName" column="role_name"/>
	<result property="note" column="ntoe"/>
</resultMap>
<select id="getRoleUserResultMap" parameterType="int" resultMap="roleMap">
	select id, role_name, note from t_role where id = #{id}
</select>
    <!-- 定義結果映射,用于將數(shù)據(jù)庫中的數(shù)據(jù)映射成Role對象 -->
    <resultMap id="userMap" type="com.ssm.pojo.User">
        <id property="userid" column="userid"/> <!-- 主鍵映射 -->
        <result property="username" column="username"/> <!-- 角色名映射 -->
        <result property="password" column="password"/> <!-- 備注映射 -->
        <result property="sex" column="sex"/>
        <result property="phone" column="phone"/>
        <result property="email" column="email"/>
        <result property="phonenumber" column="phonenumber"/>
        <result property="comment" column="comment"/>
    </resultMap>
    <!-- 定義結果映射,用于將數(shù)據(jù)庫中的數(shù)據(jù)映射成Role對象 -->
    <resultMap id="roleMap" type="com.ssm.pojo.Role">
        <id property="id" column="id"/> <!-- 主鍵映射 -->
        <result property="roleName" column="roleName"/> <!-- 角色名映射 -->
        <result property="note" column="note" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/> <!-- 備注映射 -->
    </resultMap>

分頁參數(shù)RowBounds

MyBatis不僅支持分頁,還內置了一個專門處理分頁的類RowBounds,如下代碼所示

/**
 * RowBounds類用于設置SQL查詢的偏移量和限制結果集的大小。
 */
package org.apache.ibatis.session;

public class RowBounds {
    // 無偏移量,無限制的行數(shù)
    public static final int NO_ROW_OFFSET = 0;
    // 最大整數(shù)2147483647
    public static final int NO_ROW_LIMIT = Integer.MAX_VALUE;
    // 默認的RowBounds實例,無偏移,無限制
    public static final RowBounds DEFAULT = new RowBounds();
    private final int offset; // 偏移量,從第幾行開始
    private final int limit; // 限制返回的行數(shù)

    /**
     * 構造函數(shù),默認偏移量為0,限制的行數(shù)為最大整數(shù)值。
     */
    public RowBounds() {
        this.offset = 0;
        this.limit = Integer.MAX_VALUE;
    }

    /**
     * 構造函數(shù),設置自定義的偏移量和限制的行數(shù)。
     * 
     * @param offset 查詢結果的偏移量,即從第幾行開始。
     * @param limit 返回結果集的最大行數(shù)。
     */
    public RowBounds(int offset, int limit) {
        this.offset = offset;
        this.limit = limit;
    }

    /**
     * 獲取偏移量。
     * 
     * @return 偏移量,從第幾行開始。
     */
    public int getOffset() {
        return this.offset;
    }

    /**
     * 獲取限制的行數(shù)。
     * 
     * @return 返回結果集的最大行數(shù)。
     */
    public int getLimit() {
        return this.limit;
    }
}

Mapper接口定義如下

public List<Role> findByRowBounds(@Param("roleName") String rolename, @Param("note") String note, RowBounds rowBounds);

Mapper映射文件如下

<select id="findByRowBounds" resultType="role">
	select id, role_name as roleName, note from t_role 
	where role_name like concat('%', #{roleName}, '%') and note like concat('%', #{note}, '%')
</select>

映射代碼中沒有任何關于RowBounds參數(shù)的信息,MyBatis自身會自動識別和啟用它

執(zhí)行代碼如下

Logger log = Logger.getLogger(Main.class);
SqlSession sqlsession = null;
try{
	sqlsession = SqlSessionFacotryUtils.openSqlSession();
	RoleDao roleDao = sqlSession.getMapper(RoleDao.class);
	List<Role> roleList = roleDao.findByRowBounds("role", "note", new RownBounds(0,20));
	log.info(roleList.size());
}finally{
	if(sqlSession!=null){
		sqlSession.close();
	}
}	

RowBounds分頁一般來說只適合做少量數(shù)據(jù)的分頁,其原理是在執(zhí)行SQL的查詢后,根據(jù)偏移量和限制條數(shù)返回結果,因此大量的數(shù)據(jù)查詢性能會比較差

insert元素

在MyBatis框架中,<insert>標簽用于定義SQL插入語句。以下是其常用的屬性及其說明:

  • id:作為命名空間內的唯一標識符,與Mapper接口中的方法名相對應,用于MyBatis在執(zhí)行時找到對應的SQL語句。<insert id="insertUser" ...>,在同一個Mapper的XML文件中,id屬性值必須唯一,否則MyBatis在解析時會拋出異常。
  • parameterType:指定傳入SQL語句的參數(shù)類型,通常是一個Java類的全限定名(如包名加類名)或別名。支持基本數(shù)據(jù)類型、JavaBean對象、Map等復雜數(shù)據(jù)類型。<insert parameterType="com.example.User" ...>,MyBatis可以根據(jù)參數(shù)對象的屬性名自動映射到SQL語句中的占位符(如${}或#{}),無需手動指定每一個參數(shù)。
  • useGeneratedKeys:表示是否啟用JDBC的getGeneratedKeys方法來獲取數(shù)據(jù)庫自動生成的主鍵。默認值為false。<insert useGeneratedKeys="true" ...>,當數(shù)據(jù)庫表有自增主鍵或其他自動生成的主鍵時,設置為true可以讓MyBatis自動獲取并返回生成的主鍵值。這需要數(shù)據(jù)庫驅動和數(shù)據(jù)庫本身支持該功能。
  • keyProperty:當useGeneratedKeys="true"時,此屬性指定插入后生成的主鍵值應該賦給傳入?yún)?shù)對象(parameterType指定的對象)的哪個屬性。如果主鍵是復合主鍵,可以使用逗號分隔多個屬性名。<insert keyProperty="id" ...> 或 <insert keyProperty="primaryKey1, primaryKey2" ...>,只有當useGeneratedKeys="true"且數(shù)據(jù)庫支持時,keyProperty才生效。否則,即使指定了該屬性,也不會有任何效果。
  • statementType:指定語句的執(zhí)行類型。可選值包括STATEMENT、PREPARED(默認)和CALLABLE。分別對應使用JDBC的Statement、PreparedStatement和CallableStatement。<insert statementType="PREPARED" ...>,通常情況下,保持默認的PREPARED即可,因為它能防止SQL注入攻擊,并允許預編譯SQL語句提高性能。除非有特定需求,否則不需要更改此屬性。
  • flushCache:控制是否在執(zhí)行插入操作后刷新MyBatis的一級緩存(本地Session緩存)。默認值為true,即每次插入后清空緩存。<insert flushCache="false" ...>,若希望在插入后保留緩存以優(yōu)化后續(xù)查詢,可以設置為false。但請注意,這可能會影響數(shù)據(jù)的一致性,特別是多事務并發(fā)環(huán)境下,需要謹慎使用。
  • timeout:設置執(zhí)行語句的超時時間(單位:秒)。超過這個時間仍未得到數(shù)據(jù)庫響應時,MyBatis將拋出異常。<insert timeout="30" ...>注意: 根據(jù)數(shù)據(jù)庫操作的實際耗時和系統(tǒng)對響應時間的要求來合理設置。過短可能導致正常操作因超時而失敗,過長則可能導致應用響應緩慢。
  • keyColumn:僅對于insert和update有用,通過生成的鍵值設置表中的列名,這些設置僅在某些數(shù)據(jù)庫如PG中是必須的,當主鍵列不是表中的第一列時需要設置,如果是復合主鍵,則需要再把沒一個名稱用逗號隔開
  • 其他:parameterMap、databaseId

insert元素實例自增主鍵場景

    <!-- 插入一個新的Role記錄 -->
    <insert id="insertRole" parameterType="com.ssm.pojo.Role" databaseId="mysql" >
        INSERT INTO t_role(roleName, note) VALUES (#{roleName}, #{note})
    </insert>

這個語句非常簡單,因為表的id只自增主鍵,因此在插入數(shù)據(jù)的時候并沒有為該字段做任何事,數(shù)據(jù)庫會自動完成,但實際開發(fā)過程中往往插入一條記錄,需要根據(jù)當前表的主鍵值處理關聯(lián)表,MyBatis中可以通過getGeneratedKeys方法獲得數(shù)據(jù)庫生成的主鍵,默認它是false狀態(tài),也就是不會返回主鍵值,當打開了這個開關后,還需要配置其屬性keyPropertykeyColumn,從而告訴系統(tǒng)把生成的主鍵放入POJO的對應屬性中,如果存在多個主鍵,就要用逗號將他們分隔

    <!-- 
    插入一個新的Role記錄
    
    參數(shù):
    - parameterType: 指定插入操作時使用的參數(shù)類型,這里是 com.ssm.pojo.Role,表示插入的角色對象。
    - databaseId: 指定該SQL語句適用于哪個數(shù)據(jù)庫,這里是 mysql。
    - useGeneratedKeys: 指定是否使用數(shù)據(jù)庫自動生成的鍵值。如果為 true,則表示使用自動生成的鍵值。
    - keyProperty: 指定生成的鍵值應該被設置到對象的哪個屬性上,這里是 id。
    
    返回值: 無返回值,僅執(zhí)行插入操作。
     -->
    <insert id="insertRole" parameterType="com.ssm.pojo.Role" databaseId="mysql" useGeneratedKeys="true" keyProperty="id" >
        INSERT INTO t_role(roleName, note) VALUES (#{roleName}, #{note})
    </insert>

如此,將useGeneratedKeys配置為true表示采用JDBC的Statement對象的getGeneratedKeys方法返回主鍵,而keyProperty代表用哪個POJO的屬性匹配這個主鍵,這個例子里是id,說明它會用數(shù)據(jù)生成的主鍵賦值給這個POJO的屬性id

insert元素實例自定義主鍵場景

有時候主鍵未必是自增的,而是依賴于某些規(guī)則,例如取消角色表的id自增規(guī)則,將其規(guī)則改為當角色表記錄為空時id設置為1,當角色表記錄不為空時,id設置為當前id加3,對于這樣的特殊規(guī)則主鍵的場景,MyBatis也提供了支持,它主要依賴selectKey元素,允許自定義鍵值生成規(guī)則

    <!-- 
     插入一個新的Role記錄
     參數(shù):
     - parameterType: 指定插入操作時使用的參數(shù)類型,這里是com.ssm.pojo.Role,代表插入的角色對象。
     - databaseId: 指定此SQL適用于哪個數(shù)據(jù)庫,這里是mysql。
     - useGeneratedKeys: 指定是否使用數(shù)據(jù)庫生成的主鍵值。如果為true,MyBatis會自動獲取生成的主鍵值并設置到對象中。
     - keyProperty: 指定哪個屬性會接收生成的主鍵值,這里是id。
     返回值: 插入操作成功后,返回值為插入的記錄的主鍵ID。
    -->
    <insert id="insertRole" parameterType="com.ssm.pojo.Role" databaseId="mysql" useGeneratedKeys="true" keyProperty="id" >
        <!-- 
         使用selectKey標簽來動態(tài)生成主鍵ID。在插入新記錄之前執(zhí)行,通過查詢當前角色表中最大ID值,若不存在則默認為1,若存在則在最大ID上加3,以保證ID的唯一性。
        -->
        <selectKey keyProperty="id" resultType="int" order="BEFORE">
            select if (max(id) = null, 1, max(id) + 3) from t_role
        </selectKey>
        <!-- 插入新的Role記錄,#{id}, #{roleName}, #{note}分別代表角色的ID,角色名和備注信息。這些值會從傳入的Role對象中獲取。 -->
        INSERT INTO t_role(id, roleName, note) VALUES (#{id}, #{roleName}, #{note})
    </insert>

其他的很容易看明白,唯獨這個order,設置為BEFORE,說明它將于當前定義的SQL前執(zhí)行,也就是它會在插入數(shù)據(jù)前生成主鍵的SQL,如果還有一些需要在SQL執(zhí)行后的動作,例如插入語句內部可能有嵌入索引調用,這樣可以把它設置為AFTER,就會在執(zhí)行插入后再完成任務

update元素和delete元素

   <!-- 更新Role的信息 -->
    <!-- 
    函數(shù)級別注釋:該標簽用于更新Role表中的信息。
    參數(shù):
    - roleName: 角色名,類型為String,用于更新角色的名稱。
    - note: 備注信息,類型為String,用于更新角色的備注。
    - id: 角色ID,類型為Integer,用于指定要更新的角色。
    返回值:無返回值。
     -->
    <update id="updateRole" parameterType="com.ssm.pojo.Role">
        UPDATE t_role SET roleName = #{roleName}, note = #{note} WHERE id = #{id}
    </update>

    <!-- 
    函數(shù)級別塊注釋:
    根據(jù)提供的ID刪除數(shù)據(jù)庫中特定的Role記錄。
    
    參數(shù):
    id - 需要刪除的Role記錄的ID,類型為int。
    
    返回值:
    無返回值。
     -->
    <delete id="deleteRole" parameterType="int">
        DELETE FROM t_role WHERE id = #{id}
    </delete>

sql元素

在實際開發(fā)過程中,往往很多表的列都非常多,在編寫代碼的時候,重復寫列名是個很枯燥的事情,即便編譯器提供了很多方法,但還是很麻煩,MyBatis提供了sql元素,簡化了該場景下的編碼工作

    <!-- 定義查詢角色信息時需要返回的列名 -->
    <sql id = "roleCols">
        id, roleName, note
    </sql>


    <!-- 根據(jù)ID查詢Role信息,返回Role對象。該查詢針對Oracle數(shù)據(jù)庫。 -->
    <select id="getRoleById" parameterType="int" resultMap="roleMap" databaseId="oracle">
        SELECT <include refid="roleCols"/>FROM t_role WHERE id = #{id}
    </select>

    <!-- 插入新的Role信息。在插入前,通過selectKey為新Role生成一個唯一的ID。 -->
    <insert id="insertRole" parameterType="com.ssm.pojo.Role">
        <selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
            select if (max(id) = null, 1, max(id)+3) from t_role
        </selectKey>
        insert into t_role(<include refid="roleCols"/>) values(#{id}, #{roleName}, #{note})
    </insert>

sql元素還支持變量傳遞

    <!-- 定義一個SQL片段,用于查詢角色表中的id、roleName和note列 -->
    <!-- 通過傳入的別名(alias)動態(tài)拼接SQL語句中的表名前綴 -->
    <sql id ="roleCols2">
        ${alias}.id, ${alias}.roleName, ${alias}.note}
    </sql>


    <!-- 根據(jù)ID查詢Role信息,返回Role對象。該查詢針對Oracle數(shù)據(jù)庫。 -->
    <select id="getRoleById" parameterType="int" resultMap="roleMap" databaseId="oracle">
        SELECT <include refid="roleCols">
        <property name="alias" value="r"/>
    </include>
        FROM t_role r WHERE id = #{id}
    </select>

include元素中定義了一個“alias”的變量,其值是SQL中表t_role的別名“r”,sql元素可以通過EL引用這個變量

到此這篇關于深入淺出MyBatis映射器的文章就介紹到這了,更多相關MyBatis映射器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 顯示SonarQube私有項目徽章方案流程

    顯示SonarQube私有項目徽章方案流程

    這篇文章主要為大家介紹了如何顯示SonarQube私有項目徽章方案的流程,sonarQube目前不支持私有項目的徽章圖片獲取,這個問題早在?2018年就在sonar社區(qū)里有過激烈的討論,至今無果,只能自己尋求一種可以快速實施的方案
    2022-02-02
  • 使用mybatis切片實現(xiàn)數(shù)據(jù)權限控制的操作流程

    使用mybatis切片實現(xiàn)數(shù)據(jù)權限控制的操作流程

    數(shù)據(jù)權限控制需要對查詢出的數(shù)據(jù)進行篩選,對業(yè)務入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務的sql進行修改,本文給大家介紹了使用mybatis切片實現(xiàn)數(shù)據(jù)權限控制的操作流程,需要的朋友可以參考下
    2024-07-07
  • Tomcat?8.5?+mysql?5.7+jdk1.8開發(fā)JavaSE的金牌榜小項目

    Tomcat?8.5?+mysql?5.7+jdk1.8開發(fā)JavaSE的金牌榜小項目

    這篇文章主要介紹了Tomcat?8.5?+mysql?5.7+jdk1.8開發(fā)JavaSE的金牌榜小項目,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Java編程之文件讀寫實例詳解

    Java編程之文件讀寫實例詳解

    這篇文章主要介紹了Java編程之文件讀寫的方法,結合實例形式較為詳細的分析了Java文件讀寫所涉及的類及相應的操作技巧,需要的朋友可以參考下
    2015-12-12
  • 基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

    基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法

    這篇文章主要介紹了基于Java代碼實現(xiàn)判斷春節(jié)、端午節(jié)、中秋節(jié)等法定節(jié)假日的方法 的相關資料,需要的朋友可以參考下
    2016-01-01
  • 基于JavaMail的常用類詳細介紹

    基于JavaMail的常用類詳細介紹

    以下是對JavaMail的常用類進行了詳細分析的介紹,需要的朋友可以過來參考下
    2013-09-09
  • 在dos窗口中編譯和運行java文件的方法

    在dos窗口中編譯和運行java文件的方法

    這篇文章主要介紹了在dos窗口中編譯和運行java文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Springboot+echarts實現(xiàn)可視化

    Springboot+echarts實現(xiàn)可視化

    這篇文章主要為大家詳細介紹了Springboot+echarts實現(xiàn)可視化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • IDEA與MyEclipse代碼量統(tǒng)計方式

    IDEA與MyEclipse代碼量統(tǒng)計方式

    文章介紹在項目中不安裝第三方工具統(tǒng)計代碼行數(shù)的方法,分別說明MyEclipse通過正則搜索(排除空行和注釋)及IDEA使用Statistic插件或調整搜索設置(修改ide.usages.page.size)的兩種操作方式,并強調需根據(jù)需求靈活選擇
    2025-08-08
  • Java中雙大括號初始化的理解與使用

    Java中雙大括號初始化的理解與使用

    最近重讀Java 編程思想,讀到有關實例化代碼塊兒的內容,使我對于使用兩個大括號進行初始化有了更深的理解,下面這篇文章主要給大家介紹了關于Java中雙大括號初始化的理解與使用的相關資料,需要的朋友可以參考下
    2022-06-06

最新評論