一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Mybatis接口式編程的原理

Mybatis接口式編程的原理

2020-08-29 11:36Terence_Jing Java教程

mybatis有兩種實現(xiàn)方式,一種可以通過xml配置文件實現(xiàn),其二是面向接口編程的實現(xiàn)。本文重點給大家介紹mybatis接口編程的原理,需要的的朋友參考下

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
package hdu.terence.dao;
import java.util.List;
import hdu.terence.bean.Message;
public interface IMessage {
    publicList<Message> queryMessageList(Message message);
}

Dao.xml文件配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.terence.dao.IMessage"
 <resultMap type="hdu.terence.bean.Message" id="MessageResult"
  <id column="id" jdbcType="INTEGER"property="id"/> <!--主鍵標簽-->
  <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>

測試:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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ù)庫會話
      }
    }
    return messageList;
  }

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

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

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

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

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

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

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

Mybatis接口式編程的原理

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

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

?
1
2
3
4
MapperProxy implements InvocationHandler
{
 MapperProxy.invoke();
}

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

?
1
2
3
sqlSession.getMapper()==Proxy.newProxyInstance();
IMessage imessage=sqlSession.getMapper(IMessage.class);
messageList=imessage.queryMessageList(message);

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

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

            因為剛初始化sqlSession的時候,加載了Configuration.xml文件,并在改文件中加載了各個JavaDao.xml文件,而這個Configuration.xml文件對應(yīng)了Mybatis中相關(guān)的類:Configuration,接口的全名稱在Invoke()方法里面都可以拿到, 接口全名稱.方法名==namespace.id,所以可以拿到配置文件中的查詢方法。 

SqlSession的獲取

?
1
2
3
4
5
6
7
8
9
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ù)庫會話
    SqlSessionsqlSession=SSF.openSession();
    return sqlSession; }

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

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

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

原文鏈接:http://blog.csdn.net/csdn_terence/article/details/62216226

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产成人精品视频一区二区不卡 | 91传媒制片厂果冻有限公司 | 日本激情网站 | 成人在线视频在线观看 | 亚洲精品永久免费 | 亚洲网站在线 | 5g996未满十八| 丫鬟粗大狠狠贯穿h | 欧美一区二区福利视频 | 欧美在线看片a免费观看 | 特色特色大片在线 | 亚洲国产网址 | 国内精品一区视频在线播放 | 女同性互吃奶乳免费视频 | 俄罗斯激情性孕妇孕交大全 | 国产一区二区在线免费观看 | 国产精自产拍久久久久久 | 青青青草免费 | 91专区| 我被黑人彻底征服的全文 | 蜜桃成熟时1997在线看免费看 | 17个农民工婉莹第一部 | 成年视频在线播放 | 手机看片1024日韩 | 18videossex性欧美69 | 4s4s4s4s色大众影视 | 欧美国产日韩1区俺去了 | 国产美女屁股直流白浆视频无遮挡 | 国产精品免费久久久久影院小说 | 污网站免费观看在线高清 | 国产成人在线播放 | 亚洲黄色天堂 | 韩国甜性涩爱在线播放 | 好大好硬好深好爽想要之黄蓉 | 国产欧美一区二区三区久久 | 97国产蝌蚪视频在线观看 | 热99re久久精品国产首页 | 毛片免费毛片一级jjj毛片 | 日韩免费毛片视频杨思敏 | 天码毛片一区二区三区入口 | 2018天天拍拍拍免费视频 |