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

MyBatis使用接口映射的方法步驟

 更新時(shí)間:2024年07月05日 09:47:00   作者:辭暮爾爾-煙火年年  
映射器是MyBatis中最核心的組件之一,本文主要介紹了MyBatis使用接口映射的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在MyBatis中使用接口映射是一種基于Java接口而非XML映射文件的方式來(lái)綁定SQL查詢和操作。這種方法使用注解來(lái)指定SQL語(yǔ)句,并將其直接關(guān)聯(lián)到接口方法上。通過(guò)這種方式,可以省去編寫(xiě)XML映射文件的工作,而且使得SQL語(yǔ)句和Java代碼的關(guān)系更直觀。

1. 定義一個(gè)Mapper接口

首先,定義一個(gè)接口來(lái)表示你的數(shù)據(jù)庫(kù)操作。例如,如果你有一個(gè)User表,你可以創(chuàng)建一個(gè)UserMapper接口:

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Integer id);
    
    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
    
    @Update("UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}")
    void updateUser(User user);
    
    @Delete("DELETE FROM users WHERE id=#{id}")
    void deleteUser(Integer id);
}

這個(gè)接口定義了基本的增刪改查操作,并通過(guò)注解@Select、@Insert、@Update@Delete與SQL語(yǔ)句相關(guān)聯(lián)。

2. 配置MyBatis使用注解

接下來(lái),在MyBatis配置文件中指定你的接口。你無(wú)需指定XML文件,因?yàn)槟阌米⒔舛x了SQL語(yǔ)句。

mybatis-config.xml 示例(無(wú)需mapper XML聲明)

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper class="org.example.mapper.UserMapper"/>
    </mappers>
</configuration>

3. 在代碼中使用Mapper接口

創(chuàng)建SqlSessionFactorySqlSession,然后通過(guò)SqlSession獲取Mapper接口的實(shí)例。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    
    // 使用mapper操作數(shù)據(jù)庫(kù)
    User user = mapper.getUserById(1);
    System.out.println(user.getName());
    
    // 更多的數(shù)據(jù)庫(kù)操作...
}

4. 深入源碼分析

在MyBatis初始化過(guò)程中,當(dāng)你調(diào)用getMapper(Class<T> type)方法時(shí),MyBatis內(nèi)部使用了JDK動(dòng)態(tài)代理來(lái)創(chuàng)建Mapper接口的實(shí)現(xiàn)。

public <T> T getMapper(Class<T> type) {
    return configuration.<T>getMapper(type, this);
}

Configuration類中,getMapper方法會(huì)調(diào)用mapperRegistry中的getMapper方法,該方法最終調(diào)用了MapperProxyFactory來(lái)創(chuàng)建Mapper代理:

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
    final MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory<T>) knownMappers.get(type);
    if (mapperProxyFactory == null) {
        throw new BindingException("Type " + type + " is not known to the MapperRegistry.");
    }
    try {
        return mapperProxyFactory.newInstance(sqlSession);
    } catch (Exception e) {
        throw new BindingException("Error getting mapper instance. Cause: " + e, e);
    }
}

MapperProxyFactory創(chuàng)建代理對(duì)象:

public T newInstance(SqlSession sqlSession) {
    final MapperProxy<T> mapperProxy = new MapperProxy<>(sqlSession, mapperInterface, methodCache);
    return newInstance(mapperProxy);
}

protected T newInstance(MapperProxy<T> mapperProxy) {
    return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader(), new Class[]{mapperInterface}, mapperProxy);
}

MapperProxy是實(shí)際的代理類,它實(shí)現(xiàn)了InvocationHandler接口。每當(dāng)你調(diào)用一個(gè)Mapper接口的方法時(shí),都會(huì)調(diào)用invoke方法。在這個(gè)方法中,MyBatis會(huì)判斷該調(diào)用是否對(duì)應(yīng)一個(gè)SQL操作,并執(zhí)行相應(yīng)的SQL語(yǔ)句:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (Object.class.equals(method.getDeclaringClass())) {
        return method.invoke(this, args);
    } else {
        final MapperMethod mapperMethod = cachedMapperMethod(method);
        return mapperMethod.execute(sqlSession, args);
    }
}

5. 細(xì)節(jié)和最佳實(shí)踐

  • 使用注解時(shí),確保你的SQL語(yǔ)句不會(huì)過(guò)于復(fù)雜。對(duì)于復(fù)雜的SQL,考慮使用XML映射文件。
  • 明確區(qū)分@Param注解來(lái)綁定方法參數(shù),尤其是在參數(shù)超過(guò)一個(gè)的方法中,這樣可以在SQL語(yǔ)句中更容易地引用參數(shù)。
  • 使用@Options注解來(lái)調(diào)整MyBatis的行為,例如獲取自動(dòng)生成的鍵。
  • 保持Mapper接口的清晰和簡(jiǎn)潔,邏輯復(fù)雜時(shí)考慮將其拆分。

通過(guò)以上步驟和解析,你可以在MyBatis中成功地使用接口映射,以簡(jiǎn)潔和直觀的方式進(jìn)行數(shù)據(jù)庫(kù)操作。

到此這篇關(guān)于MyBatis使用接口映射的方法步驟的文章就介紹到這了,更多相關(guān)MyBatis 接口映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程生命周期的終止與復(fù)位

    Java線程生命周期的終止與復(fù)位

    這篇文章主要介紹了Java線程生命周期的終止與復(fù)位,Java的線程狀態(tài)描述放在Thread類里面的枚舉類State中.總共包含了6中狀態(tài),具體詳情需要的小伙伴可以參考一下文章描述
    2022-07-07
  • Zuul 如何屏蔽服務(wù)和指定路徑

    Zuul 如何屏蔽服務(wù)和指定路徑

    這篇文章主要介紹了Zuul 如何屏蔽服務(wù)和指定路徑的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • MyBatis輸入映射和輸出映射實(shí)例詳解

    MyBatis輸入映射和輸出映射實(shí)例詳解

    mapper.xml是我們配置操作數(shù)據(jù)庫(kù)的sql語(yǔ)句的地方.這篇文章主要介紹了MyBatis輸入映射和輸出映射實(shí)例詳解,需要的朋友可以參考下
    2017-02-02
  • 淺析Java Scanner 類的用法

    淺析Java Scanner 類的用法

    這篇文章主要介紹了Java Scanner 類的用法,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • MyBatis Mapper XML中比較操作符轉(zhuǎn)義問(wèn)題解決

    MyBatis Mapper XML中比較操作符轉(zhuǎn)義問(wèn)題解決

    在使用MyBatis編寫(xiě)Mapper XML時(shí),有時(shí)會(huì)遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot整合mybatis結(jié)合pageHelper插件實(shí)現(xiàn)分頁(yè)

    SpringBoot整合mybatis結(jié)合pageHelper插件實(shí)現(xiàn)分頁(yè)

    在本篇文章里小編給大家整理的是關(guān)于SpringBoot整合mybatis使用pageHelper插件進(jìn)行分頁(yè)操作相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2020-02-02
  • 關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過(guò)濾器的問(wèn)題

    關(guān)于SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過(guò)濾器的問(wèn)題

    這篇文章主要介紹了SpringBoot創(chuàng)建存儲(chǔ)令牌的媒介類和過(guò)濾器的問(wèn)題,需要在配置文件中,添加JWT需要的密匙,過(guò)期時(shí)間和緩存過(guò)期時(shí)間,具體實(shí)例代碼參考下本文
    2021-09-09
  • Java pdu短信解碼全面解析

    Java pdu短信解碼全面解析

    本文是根據(jù)python的方法改寫(xiě)的pdu短信解碼,非常不錯(cuò),代碼簡(jiǎn)單易懂具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-10-10
  • JUnit4 Hamcrest匹配器常用方法總結(jié)

    JUnit4 Hamcrest匹配器常用方法總結(jié)

    這篇文章主要介紹了JUnit4 Hamcrest匹配器常用方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring?Cloud?Eureka?搭建?&?集群方式

    Spring?Cloud?Eureka?搭建?&?集群方式

    這篇文章主要介紹了Spring?Cloud?Eureka?搭建?&?集群方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論