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

Mybatis接口式編程的原理

 更新時(shí)間:2017年03月15日 15:46:44   作者:Terence_Jing  
mybatis有兩種實(shí)現(xiàn)方式,一種可以通過xml配置文件實(shí)現(xiàn),其二是面向接口編程的實(shí)現(xiàn)。本文重點(diǎn)給大家介紹mybatis接口編程的原理,需要的的朋友參考下

Mybatis 有兩種實(shí)現(xiàn)方式

其一:通過xml配置文件實(shí)現(xiàn)

其二:面向接口編程的實(shí)現(xiàn)

           前者原理在Mybatis運(yùn)行套路里面大致說了一下,此節(jié)說的是后者,面向接口的編程,可以解決掉 namespace / 傳入?yún)?shù) / 返回值 / 與Sql關(guān)聯(lián)Id 等四處風(fēng)險(xiǎn)。

           意思就是,Mybatis配置文件Dao.xml找了一個(gè)接口作為自己的代言人,并告訴其他的Java對象,以后訪問數(shù)據(jù)庫不要再騷擾我這個(gè)Dao.xml文件了,你去找我的代言人助理它會(huì)全權(quán)負(fù)責(zé)的。

           如果接口助理要全權(quán)負(fù)責(zé)Dao.xml文件的所有工作,那么,Dao.xml文件肯定要和代言接口交接清楚工作任務(wù),不能然接口亂搞。

仍舊以訪問數(shù)據(jù)庫信息列表為例:

首先要定義一個(gè)接口IMessage和Dao.xml文件里面的各種配置項(xiàng)一一對應(yīng):

package hdu.terence.dao; 
import java.util.List; 
import hdu.terence.bean.Message; 
public interface IMessage { 
    publicList<Message> queryMessageList(Message message); 
} 

Dao.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.terence.dao.IMessage">  
 <resultMap type="hdu.terence.bean.Message" id="MessageResult">  
  <id column="id" jdbcType="INTEGER"property="id"/> <!--主鍵標(biāo)簽--> 
  <result column="COMMAND" jdbcType="VARCHAR"property="command"/> 
  <result column="DESCRIPTION" jdbcType="VARCHAR" property="description"/> 
  <result column="CONTENT" jdbcType="VARCHAR"property="content"/> 
 </resultMap>   
 <select id="queryMessageList" parameterType="hdu.terence.bean.Message" resultMap="MessageResult"> 
  SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1    
  <if test="command!=null and!"".equals(command.trim())"> 
  andCOMMAND=#{command} 
  </if> 
  <if test="description!=null and!"".equals(description.trim())"> 
  andDESCRIPTION like '%' #{description} '%' 
  </if>  
 </select><span style="color: teal; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span> 

測試:

public List<Message> queryMessageListByMybatis(Stringcommand,String description) 
  { 
    DBAccess dbAccess =new DBAccess(); 
    SqlSession sqlSession=null; 
    List<Message>messageList=new ArrayList<Message>(); 
    try { 
      sqlSession=dbAccess.getSqlSession(); 
      Message message=new Message(); 
      message.setCommand(command); 
      message.setDescription(description);           
      //方式二:通過接口調(diào)用配置文件里面的sql語句 
      IMessageimessage=sqlSession.getMapper(IMessage.class); 
      messageList=imessage.queryMessageList(message); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    finally{ 
      if(sqlSession!=null) 
      { 
        sqlSession.close(); //要關(guān)閉數(shù)據(jù)庫會(huì)話 
      } 
    } 
    return messageList; 
  } 

            第一,Dao.xml文件命名空間要和接口的全名保持一致:寫接口的全名(包括報(bào)名com.terence.dao.IMessage)方便接口找到配置文件的命名空間。

            第二,接口定義代言的sql語句對應(yīng)的方法:queryMessageList(),方法名要和代言的sql語句配置項(xiàng)的id:queryMessageList相同,方便接口根據(jù)自己聲明的方法映射到對應(yīng)的配置項(xiàng)id。

            第三,接口聲明的方法帶入的形參Message要和Dao.xml文件對應(yīng)配置項(xiàng)需要的參數(shù)保持一致。

            第四,接口聲明的方法的返回值類型List<Message>要和Dao.xml文件id配置項(xiàng)resultMap類型一致。

            這樣就完成了接口的代理工作,配置文件會(huì)告訴其他的Java代碼,以后通過這個(gè)接口就可以完成我本來要完成的工作,執(zhí)行Sql語句對數(shù)據(jù)庫完成交互工作;很明顯,這種接口式編程比以前的直接調(diào)用配置文件方便多了,以前直接調(diào)用配置文件,每次使用配置文件,都需要寫配置文件的命名空間、id、參數(shù)和返回值,這些地方有時(shí)候會(huì)手滑寫不一致,如果出錯(cuò),編譯器不會(huì)出現(xiàn)提示,開發(fā)者只能根據(jù)執(zhí)行結(jié)果錯(cuò)誤提示推敲錯(cuò)誤的地方慢慢調(diào)試。如果使用接口式編程,通過將配置文件dao.xml和定義的接口一一匹配對應(yīng),通過接口代理配置文件,以后不管誰使用都可以直接調(diào)用接口下,不用管配置文件里面的命名空間和sql配置ID,調(diào)用接口時(shí)如果出錯(cuò),會(huì)自動(dòng)提示,更有利于錯(cuò)誤的查找。

            但是,如果僅僅在Mybatis中使用接口式編程,并沒有什么顯著的效果,但是當(dāng)Mybatis遇到spring的時(shí)候,效果就顯著了。

            當(dāng)Mybatis遇到Spring,Mybatis的核心配置文件Configuration.xml中連接數(shù)據(jù)庫的配置,就會(huì)取代了Spring中的DB層,Mybatis中的SqlSession會(huì)話將會(huì)托管給Spring,上述的MessageDao.xml部分帶入?yún)?shù)調(diào)用接口的部分都會(huì)托管給Spring的Service來完成。此時(shí)我們定義的IMessage接口將會(huì)替代原來的Dao層,此時(shí)的Dao層只剩下接口文件和JavaDao.xml配置文件. 

Mybatis接口式編程的原理

第一個(gè)問題,明天為什么接口Imssage.queryMessageList()沒有實(shí)現(xiàn)類,但是卻可以調(diào)用對應(yīng)的方法?

            首先要有一個(gè)創(chuàng)建代理實(shí)例的類,類里面有個(gè)方法invoke();

MapperProxy implements InvocationHandler
{
 MapperProxy.invoke();
}

            當(dāng)我們調(diào)用接口的時(shí)候,走的是Invoke()方法,會(huì)通過Proxy.NewProxyInstance()加載一個(gè)代理實(shí)例,實(shí)際上也就是通過sqlSession.getMapper()來獲取代理實(shí)例,即

sqlSession.getMapper()==Proxy.newProxyInstance(); 
IMessage imessage=sqlSession.getMapper(IMessage.class);
messageList=imessage.queryMessageList(message);

            這樣,即使IMessage自身沒有實(shí)現(xiàn)類,但是通過SqlSession的getMapper方法帶入接口類IMessage.class,就可以獲取一個(gè)IMessage類型的代理實(shí)例,很明顯,這里是泛型在起作用,帶入什么樣的類型,就得到一個(gè)什么類型的接口,原因是Mybatis已經(jīng)利用泛型做了強(qiáng)轉(zhuǎn)了; 

第二個(gè)問題,既然是通過invoke()方法,它是怎么知道我們要調(diào)用sqlSession.selectList()方法?

            因?yàn)閯偝跏蓟痵qlSession的時(shí)候,加載了Configuration.xml文件,并在改文件中加載了各個(gè)JavaDao.xml文件,而這個(gè)Configuration.xml文件對應(yīng)了Mybatis中相關(guān)的類:Configuration,接口的全名稱在Invoke()方法里面都可以拿到, 接口全名稱.方法名==namespace.id,所以可以拿到配置文件中的查詢方法。 

SqlSession的獲取

public SqlSession getSqlSession() throws IOException 
{ 
    //1、通過配置文件獲取數(shù)據(jù)庫連接相關(guān)信息 
    Readerreader=Resources.getResourceAsReader("hdu/terence/config/Configuration.xml"); 
    //2、通過配置信息構(gòu)建SqlSessionFactory 
    SqlSessionFactorySSF=newSqlSessionFactoryBuilder().build(reader); 
    //3、通過SqlSessionFactory打開數(shù)據(jù)庫會(huì)話 
    SqlSessionsqlSession=SSF.openSession(); 
    return sqlSession; } 

    SqlSession通過上述配置實(shí)現(xiàn),首先通過Resources.getResourceAsReader(“配置文件路徑”)方法加載配置文件包裝一個(gè)reader對象,然后通過SqlSessionFactory這個(gè)接口帶入reader對象,獲取一個(gè)動(dòng)態(tài)代理實(shí)例,即SqlSessionFactory會(huì)話工廠,通過會(huì)話工廠得到一個(gè)會(huì)話SqlSession().   

  其中,在獲取會(huì)話工廠獲取實(shí)例的時(shí)候,底層實(shí)現(xiàn)源碼是將帶入的參數(shù)read作為key,找到Map中對應(yīng)的value值,即MapperProxyFactory。

以上所述是小編給大家介紹的Mybatis接口式編程的原理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 使用proguard對maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式

    使用proguard對maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式

    文章介紹了如何使用ProGuard對Maven構(gòu)建的Spring Boot項(xiàng)目進(jìn)行混淆,并解決混淆后可能遇到的版本兼容性問題和類名沖突問題,主要步驟包括下載高版本的ProGuard、配置POM文件、添加ProGuard配置文件、修改Spring Boot啟動(dòng)文件以避免類名沖突
    2024-11-11
  • ApplicationListenerDetector監(jiān)聽器判斷demo

    ApplicationListenerDetector監(jiān)聽器判斷demo

    這篇文章主要為大家介紹了ApplicationListenerDetector監(jiān)聽器判斷demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • java使用pdfbox操作pdf文件示例

    java使用pdfbox操作pdf文件示例

    有時(shí)候PDF中的文字無法復(fù)制,這可能是因?yàn)镻DF文件加密了,不過使用PDFBox開源軟件就可以把它讀出來,下面是使用示例
    2014-03-03
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 完美解決idea突然間很卡的問題

    完美解決idea突然間很卡的問題

    這篇文章主要介紹了完美解決idea突然間很卡的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • JavaCV攝像頭實(shí)戰(zhàn)之實(shí)現(xiàn)口罩檢測

    JavaCV攝像頭實(shí)戰(zhàn)之實(shí)現(xiàn)口罩檢測

    這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)口罩檢測,功能是檢測攝像頭內(nèi)的人是否帶了口罩,把檢測結(jié)果實(shí)時(shí)標(biāo)注在預(yù)覽窗口。感興趣的可以試一試
    2022-01-01
  • Spring中的BeanFactory對象實(shí)例化工廠詳解

    Spring中的BeanFactory對象實(shí)例化工廠詳解

    這篇文章主要介紹了Spring中的BeanFactory對象實(shí)例化工廠詳解,BeanFactory及其子類是Spring IOC容器中最重要的一個(gè)類,BeanFactory由類名可以看出其是一個(gè)Bean工廠類,其實(shí)它確實(shí)是一個(gè)Bean工廠類,完成Bean的初始化操作,需要的朋友可以參考下
    2023-12-12
  • Spring之兩種任務(wù)調(diào)度Scheduled和Async詳解

    Spring之兩種任務(wù)調(diào)度Scheduled和Async詳解

    這篇文章主要介紹了Spring之兩種任務(wù)調(diào)度Scheduled和Async,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JAVA接入DeepSeek滿血版的詳細(xì)指南(問答接入、流式接入雙模式)

    JAVA接入DeepSeek滿血版的詳細(xì)指南(問答接入、流式接入雙模式)

    硅基流動(dòng)推出了功能完備的DeepSeek滿血版,然而眾多用戶在嘗試接入大型模型時(shí)仍面臨諸多挑戰(zhàn),特別是在流式接入方面,今天,我將引領(lǐng)大家通過Java實(shí)現(xiàn)雙模式接入DeepSeek滿血版,需要的朋友可以參考下
    2025-03-03
  • springMvc和mybatis-plus中枚舉值和字段的映射

    springMvc和mybatis-plus中枚舉值和字段的映射

    這篇文章主要為大家介紹了springMvc和mybatis-plus中枚舉值和字段的映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論

中西区| 团风县| 岑巩县| 宜君县| 沁水县| 长岛县| 丹阳市| 寻甸| 宝清县| 邳州市| 临高县| 日喀则市| 军事| 上林县| 三江| 肇东市| 策勒县| 涟水县| 祁东县| 昂仁县| 延吉市| 文昌市| 凤阳县| 乌鲁木齐市| 霍州市| 新化县| 沾益县| 小金县| 清镇市| 裕民县| 施秉县| 三江| 商丘市| 崇仁县| 肇州县| 定结县| 荔浦县| 长岛县| 福泉市| 佛学| 云梦县|