最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程解析

 更新時間:2023年11月15日 15:09:57   作者:say榮帥  
在Mybatis中,我們需要創(chuàng)建一個與實(shí)體類對應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對應(yīng)著SQL語句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程,需要的朋友可以參考下

一、綁定方式

1. XML文件方式

在Mybatis中,我們需要創(chuàng)建一個與實(shí)體類對應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對應(yīng)著SQL語句。然后,我們需要創(chuàng)建一個XML文件,這個文件中包含了SQL語句和映射關(guān)系。

例如,我們有一個User實(shí)體類和一個UserMapper接口:

public interface UserMapper {
    User getUserById(int id);
}

然后,我們可以創(chuàng)建一個名為UserMapper.xml的文件,內(nèi)容如下:

<mapper namespace="com.example.dao.UserMapper">
    <select id="getUserById" resultType="com.example.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

在這個XML文件中,namespace屬性指定了Mapper接口的全限定名,id屬性指定了SQL語句的唯一標(biāo)識符,resultType屬性指定了查詢結(jié)果的類型。

2. 注解方式

Mybatis也支持通過注解的方式來進(jìn)行映射。首先,需要在Mapper接口上添加@Mapper注解,然后在方法上添加@Select、@Insert、@Update、@Delete等注解來指定SQL語句。

例如,我們可以將上面的UserMapper接口改為注解方式:

import org.apache.ibatis.annotations.*;
@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);
}

在這個例子中,@Mapper注解表示這是一個Mapper接口,@Select注解表示這是一個查詢語句,#{id}是參數(shù)占位符。

3. 需要注意

啟動類上添加@MapperScan注解指定掃描路徑

@SpringBootApplication
@MapperScan("com.example.mapper") // 指定掃描路徑
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

不用@MapperScan注解,也可以在mybatis-config.xml中配置mapper映射文件的位置和命名空間

<configuration>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/> // 指定Mapper映射文件的位置和名稱
    </mappers>
</configuration>

二、實(shí)現(xiàn)原理

1. 原理

Mybatis的Mapper接口和xml綁定的原理主要依賴于JDK動態(tài)代理技術(shù)。

而Mybatis中MapperProxy代理類是mybatis實(shí)現(xiàn)Mapper接口和xml綁定的核心類之一。它實(shí)現(xiàn)了InvocationHandler接口,用于攔截Mapper接口方法的調(diào)用,并將方法名和參數(shù)傳遞給SqlSession對象執(zhí)行相應(yīng)的SQL語句。

2. MapperProxy代理類的實(shí)現(xiàn)過程

  • 首先,通過JDK動態(tài)代理技術(shù)生成一個MapperProxy代理類實(shí)例。這個代理類實(shí)現(xiàn)了Mapper接口,并重寫了接口中的方法。
  • 在重寫的方法中,MapperProxy會攔截方法調(diào)用,并將方法名和參數(shù)傳遞給SqlSession對象執(zhí)行相應(yīng)的SQL語句。
  • SqlSession對象會根據(jù)Mapper接口的namespace值找到對應(yīng)的mapper.xml文件,并根據(jù)id值找到對應(yīng)的SQL語句。然后,根據(jù)返回值類型和參數(shù)類型等信息,生成相應(yīng)的Java代碼。這些Java代碼會包含對SqlSession的操作,例如查詢、更新等操作。最終,SqlSession對象會將這些Java代碼編譯成字節(jié)碼,并加載到JVM中運(yùn)行。
  • 當(dāng)SQL語句執(zhí)行完畢后,SqlSession對象會將結(jié)果返回給MapperProxy代理類。然后,MapperProxy代理類會將結(jié)果映射為Java對象,并返回給調(diào)用者。

3. MapperProxy代理類源碼

下面是MapperProxy代理class的核心方法實(shí)現(xiàn):mybatis3.5.9

public class MapperProxy<T> implements InvocationHandler, Serializable {
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    try {
      if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, args);
      } else {
        return cachedInvoker(method).invoke(proxy, method, args, sqlSession);
      }
    } catch (Throwable t) {
      throw ExceptionUtil.unwrapThrowable(t);
    }
  }
  private MapperMethodInvoker cachedInvoker(Method method) throws Throwable {
    try {
      return MapUtil.computeIfAbsent(methodCache, method, m -> {
        if (m.isDefault()) {
          try {
            if (privateLookupInMethod == null) {
              return new DefaultMethodInvoker(getMethodHandleJava8(method));
            } else {
              return new DefaultMethodInvoker(getMethodHandleJava9(method));
            }
          } catch (IllegalAccessException | InstantiationException | InvocationTargetException
              | NoSuchMethodException e) {
            throw new RuntimeException(e);
          }
        } else {
          return new PlainMethodInvoker(new MapperMethod(mapperInterface, method, sqlSession.getConfiguration()));
        }
      });
    } catch (RuntimeException re) {
      Throwable cause = re.getCause();
      throw cause == null ? re : cause;
    }
  }
  private MethodHandle getMethodHandleJava9(Method method)
      throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    final Class<?> declaringClass = method.getDeclaringClass();
    return ((Lookup) privateLookupInMethod.invoke(null, declaringClass, MethodHandles.lookup())).findSpecial(
        declaringClass, method.getName(), MethodType.methodType(method.getReturnType(), method.getParameterTypes()),
        declaringClass);
  }
  private MethodHandle getMethodHandleJava8(Method method)
      throws IllegalAccessException, InstantiationException, InvocationTargetException {
    final Class<?> declaringClass = method.getDeclaringClass();
    return lookupConstructor.newInstance(declaringClass, ALLOWED_MODES).unreflectSpecial(method, declaringClass);
  }
}

到此這篇關(guān)于Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程的文章就介紹到這了,更多相關(guān)Mybatis Mapper接口和xml綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java進(jìn)行異常處理的9種最佳實(shí)踐

    Java進(jìn)行異常處理的9種最佳實(shí)踐

    異常處理是Java編程中不可或缺的部分,但也是最容易被忽視或?qū)崿F(xiàn)不當(dāng)?shù)沫h(huán)節(jié),本文總結(jié)了Java異常處理的9種最佳實(shí)踐,這些實(shí)踐來自項(xiàng)目開發(fā)的經(jīng)驗(yàn)總結(jié),希望能幫助大家避開常見陷阱
    2025-05-05
  • Java實(shí)現(xiàn)歸并排序的示例代碼

    Java實(shí)現(xiàn)歸并排序的示例代碼

    歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide?and?Conquer)的一個非常典型的應(yīng)用。本文將用Java實(shí)現(xiàn)這一排序,需要的可以參考一下
    2022-08-08
  • Java數(shù)組擴(kuò)容實(shí)例代碼

    Java數(shù)組擴(kuò)容實(shí)例代碼

    這篇文章主要介紹了Java數(shù)組擴(kuò)容實(shí)例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 使用Java代碼實(shí)現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步

    使用Java代碼實(shí)現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步

    這篇文章主要介紹了使用Java代碼實(shí)現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步問題,文中通過代碼示例給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼

    SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼

    這篇文章主要介紹了SpringBoot中實(shí)現(xiàn)數(shù)據(jù)字典的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java集合定義與用法實(shí)例總結(jié)【Set、List與Map】

    Java集合定義與用法實(shí)例總結(jié)【Set、List與Map】

    這篇文章主要介紹了Java集合定義與用法,結(jié)合實(shí)例形式總結(jié)分析了Java集合中Set、List和Map相關(guān)概念、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • mybatis使用pgvector的實(shí)現(xiàn)示例

    mybatis使用pgvector的實(shí)現(xiàn)示例

    本文主要介紹了mybatis定義和注冊VectorTypeHandler,并使用@TableName注解設(shè)置Entity類,其中autoResultMap屬性設(shè)置為true,這樣就可以實(shí)現(xiàn)數(shù)據(jù)存儲與查詢,感興趣的可以了解一下
    2026-01-01
  • 創(chuàng)建SpringBoot項(xiàng)目的全過程

    創(chuàng)建SpringBoot項(xiàng)目的全過程

    文章介紹了如何在IDEA專業(yè)版中創(chuàng)建SpringBoot項(xiàng)目,并通過一個簡單的示例展示了如何使用SpringBoot輸出"hello,Springboot"
    2025-03-03
  • java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓的方法

    java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓的方法

    這篇文章主要介紹了java實(shí)現(xiàn)稀疏矩陣的壓縮與解壓 ,把該稀疏矩陣壓縮以三元組形式表示并以文件形式保存,再寫另一個程序讀取文件中的信息把壓縮后的三元組還原成原來的稀疏矩陣,需要的朋友可以參考下
    2022-03-03
  • Java設(shè)計(jì)模式之責(zé)任鏈模式簡介

    Java設(shè)計(jì)模式之責(zé)任鏈模式簡介

    這篇文章主要介紹了Java設(shè)計(jì)模式之責(zé)任鏈模式,需要的朋友可以參考下
    2014-07-07

最新評論

宁晋县| 长垣县| 普洱| 南郑县| 石渠县| 亳州市| 莱西市| 贵德县| 麻城市| 沛县| 沂南县| 平山县| 怀安县| 汉源县| 彭泽县| 金沙县| 桂林市| 邳州市| 昌图县| 满洲里市| 观塘区| 中卫市| 平潭县| 额敏县| 来安县| 岚皋县| 丹凤县| 延吉市| 临泽县| 米林县| 建昌县| 昆山市| 玉环县| 博罗县| 安塞县| 肇源县| 淮滨县| 临潭县| 宜宾县| 房产| 邹城市|