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

Mybatis之@MapKey的實現(xiàn)

 更新時間:2024年09月26日 09:51:59   作者:一只懶魚a  
本文介紹了Mybatis中@MapKey注解的使用場景與效果,包含使用@MapKey和不使用@MapKey注解的區(qū)別,然后通過源碼解析產(chǎn)生各種結(jié)果的原因,具有一定的參考價值,感興趣的可以了解一下

前言

演示返回單行、多行數(shù)據(jù),使用@MapKey和不使用@MapKey注解的區(qū)別,然后通過源碼解析產(chǎn)生各種結(jié)果的原因

案例演示

分別演示下列四種情況

  • 單行不使用@MapKey注解
  • 多行不使用@MapKey注解
  • 單行使用@MapKey注解
  • 多行使用@MapKey注解

代碼準備

創(chuàng)建mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1/test?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <environments default="default">
        <environment id="default">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/MapKeyMapper.xml"/>
    </mappers>

</configuration>

創(chuàng)建MapKeyMapper.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="com.ys.mybatis.mapper.MapKeyMapper">

    <select id="getBlogMapById" resultType="map">
         select id, title from blog where id = #{id}
    </select>

    <select id="listBlogMap" resultType="map">
         select id, title from blog
    </select>

</mapper>

創(chuàng)建接口MapKeyMapper

public interface MapKeyMapper {

    Map<String, Object> getBlogMapById(Integer id);

    Map<String, Object> listBlogMap();
}

創(chuàng)建測試類MapKeyTest

@Slf4j
public class MapKeyTest {

    private SqlSessionFactory sqlSessionFactory;

    @BeforeEach
    public void init() {
        InputStream inputStream = ConfigurationTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }


    @Test
    public void singleRowTest() {

        SqlSession sqlSession = sqlSessionFactory.openSession();

        MapKeyMapper mapper = sqlSession.getMapper(MapKeyMapper.class);
        Map<String, Object> map = mapper.getBlogMapById(1);
        System.out.println(map);

    }

    @Test
    public void multiLineTest() {

        SqlSession sqlSession = sqlSessionFactory.openSession();

        MapKeyMapper mapper = sqlSession.getMapper(MapKeyMapper.class);
        Map<String, Object> map = mapper.listBlogMap();
        System.out.println(map);
    }


}

單行不使用@MapKey注解

執(zhí)行測試方法singleRowTest

正確返回,map格式為 Map<String,Object> 

多行不使用@MapKey注解

執(zhí)行測試方法multiLineTest

異常返回,拋出 TooManyResultsException 

單行使用@MapKey注解

給接口方法添加@MapKey注解

@MapKey("id")
Map<String, Object> getBlogMapById(Integer id);

執(zhí)行測試方法singleRowTest

 正確返回,map格式為 Map<Long,Map<String,Object>>

多行使用@MapKey注解

給接口方法添加@MapKey注解

@MapKey("id")
Map<String, Object> listBlogMap();

執(zhí)行測試方法multiLineTest

 正確返回,map格式為 Map<Long, Map<String,Object>>

源碼解析

默認情況下,Mybatis會通過MapperMethod的 execute 方法對將要執(zhí)行的方法進行分發(fā)。

MapperMethod結(jié)構(gòu)如下:

public class MapperMethod {

  private final SqlCommand command;
  private final MethodSignature method;

  public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {
    this.command = new SqlCommand(config, mapperInterface, method);
    this.method = new MethodSignature(config, mapperInterface, method);
  }
}

MapperMethod實例化的過程中,會實例化其內(nèi)部屬性MethodSignature

通過源碼我們得出:如果接口方法上存在@MapKey注解,returnsMap 屬性就為true  

returnsMap的值決定是執(zhí)行executeForMap還是selectOne方法

返回類型為map,存在@MapKey注解,執(zhí)行executeForMap,否則執(zhí)行selectOne方法

selectOne 

執(zhí)行selectOne方法,如果返回的條目數(shù)大于1,則拋出異常。測試案例2(多行不使用@MapKey注解)就是因為返回的條目數(shù)大于1,拋出了TooManyResultsException異常

selectMap

DefaultMapResultHandler實例化

DefaultMapResultHandler實例化的過程中,會實例化其內(nèi)部屬性mappedResults,該屬性的類型為Map

handleResult

通過@MapKey指定的key獲取value,再以該value為key,原始value為value,put到mappedResults中,最終將這個mappedResults返回。因為原始value的類型是Map<String,Object>,@MapKey指定的key的類型是Long,所以最終返回類型是Map<Long,Map<String,Object>>

到此這篇關(guān)于Mybatis之@MapKey的實現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis @MapKey內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的CompletionService批量異步執(zhí)行詳解

    Java中的CompletionService批量異步執(zhí)行詳解

    這篇文章主要介紹了Java中的CompletionService批量異步執(zhí)行詳解,我們知道線程池可以執(zhí)行異步任務(wù),同時可以通過返回值Future獲取返回值,所以異步任務(wù)大多數(shù)采用ThreadPoolExecutor+Future,需要的朋友可以參考下
    2023-12-12
  • 解析Java的設(shè)計模式編程之解釋器模式的運用

    解析Java的設(shè)計模式編程之解釋器模式的運用

    這篇文章主要介紹了解析Java的設(shè)計模式編程之解釋器模式的運用,文中對解釋器模式的優(yōu)缺點及適用場景作出了分析,需要的朋友可以參考下
    2016-02-02
  • Java的注解原理詳解

    Java的注解原理詳解

    這篇文章主要介紹了Java的注解原理詳解,注解是JDK1.5引入的新特性,包含在java.lang.annotation包中,它是附加在代碼中的一些元信息,將一個類的外部信息與內(nèi)部成員聯(lián)系起來,在編 譯、運行時進行解析和使用,需要的朋友可以參考下
    2023-10-10
  • Java多線程處理List問題

    Java多線程處理List問題

    這篇文章主要介紹了Java多線程處理List問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • PowerJob UseCacheLock工作流程源碼剖析

    PowerJob UseCacheLock工作流程源碼剖析

    這篇文章主要為大家介紹了PowerJob UseCacheLock工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Java Springboot如何基于圖片生成下載鏈接

    Java Springboot如何基于圖片生成下載鏈接

    這篇文章主要介紹了Java Springboot如何基于圖片生成下載鏈接,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java_Spring之XML?的?AOP?配置

    Java_Spring之XML?的?AOP?配置

    這篇文章主要介紹了Java_Spring中基于XML的AOP配置,上篇講到的是基于注解的AOP配置,對XML感興趣的同學可以參考閱讀本文
    2023-04-04
  • 基于spring@aspect注解的aop實現(xiàn)過程代碼實例

    基于spring@aspect注解的aop實現(xiàn)過程代碼實例

    這篇文章主要介紹了基于spring@aspect注解的aop實現(xiàn)過程代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot中YAML配置文件異常:ArrayIndexOutOfBoundsException: -1的解決方法

    SpringBoot中YAML配置文件異常:ArrayIndexOutOfBoundsException: -

    本文詳細探討了在SpringBoot應(yīng)用中使用YAML配置文件時遇到的ArrayIndexOutOfBoundsException異常,揭示了問題的根本原因在于SnakeYAML解析器在處理隱式和顯式多文檔結(jié)構(gòu)時的邊界情況bug,通過分析問題現(xiàn)象、背景知識、解決方案及最佳實踐,需要的朋友可以參考下
    2025-12-12
  • Java中的顯示鎖ReentrantLock使用與原理詳解

    Java中的顯示鎖ReentrantLock使用與原理詳解

    這篇文章主要介紹了Java中的顯示鎖ReentrantLock使用與原理詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論

道孚县| 屯门区| 科技| 东安县| 保靖县| 三门县| 梅州市| 宁明县| 广昌县| 三穗县| 巴彦淖尔市| 天峻县| 新巴尔虎右旗| 根河市| 苏州市| 墨竹工卡县| 连平县| 望都县| 固镇县| 肥东县| 本溪市| 自贡市| 京山县| 澜沧| 托里县| 元氏县| 和政县| 毕节市| 达州市| 岳西县| 新民市| 彩票| 宁河县| 广南县| 淳安县| 恭城| 镇雄县| 清流县| 宜宾县| 沭阳县| 四川省|