全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Mybatis接口式编程的原理

Mybatis 有两种实现方式

其一:通过xml配置文件实现

其二:面向接口编程的实现

           前者原理在Mybatis运行套路里面大致说了一下,此节说的是后者,面向接口的编程,可以解决掉 namespace / 传入参数 / 返回值 / 与Sql关联Id 等四处风险

           意思就是,Mybatis配置文件Dao.xml找了一个接口作为自己的代言人,并告诉其他的Java对象,以后访问数据库不要再骚扰我这个Dao.xml文件了,你去找我的代言人助理它会全权负责的。

           如果接口助理要全权负责Dao.xml文件的所有工作,那么,Dao.xml文件肯定要和代言接口交接清楚工作任务,不能然接口乱搞。

仍旧以访问数据库信息列表为例:

首先要定义一个接口IMessage和Dao.xml文件里面的各种配置项一一对应:

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"/> <!--主键标签--> 
  <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);           
      //方式二:通过接口调用配置文件里面的sql语句 
      IMessageimessage=sqlSession.getMapper(IMessage.class); 
      messageList=imessage.queryMessageList(message); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    finally{ 
      if(sqlSession!=null) 
      { 
        sqlSession.close(); //要关闭数据库会话 
      } 
    } 
    return messageList; 
  } 

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

            第二,接口定义代言的sql语句对应的方法:queryMessageList(),方法名要和代言的sql语句配置项的id:queryMessageList相同,方便接口根据自己声明的方法映射到对应的配置项id。

            第三,接口声明的方法带入的形参Message要和Dao.xml文件对应配置项需要的参数保持一致。

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

            这样就完成了接口的代理工作,配置文件会告诉其他的Java代码,以后通过这个接口就可以完成我本来要完成的工作,执行Sql语句对数据库完成交互工作;很明显,这种接口式编程比以前的直接调用配置文件方便多了,以前直接调用配置文件,每次使用配置文件,都需要写配置文件的命名空间、id、参数和返回值,这些地方有时候会手滑写不一致,如果出错,编译器不会出现提示,开发者只能根据执行结果错误提示推敲错误的地方慢慢调试。如果使用接口式编程,通过将配置文件dao.xml和定义的接口一一匹配对应,通过接口代理配置文件,以后不管谁使用都可以直接调用接口下,不用管配置文件里面的命名空间和sql配置ID,调用接口时如果出错,会自动提示,更有利于错误的查找。

            但是,如果仅仅在Mybatis中使用接口式编程,并没有什么显著的效果,但是当Mybatis遇到spring的时候,效果就显著了。

            当Mybatis遇到Spring,Mybatis的核心配置文件Configuration.xml中连接数据库的配置,就会取代了Spring中的DB层,Mybatis中的SqlSession会话将会托管给Spring,上述的MessageDao.xml部分带入参数调用接口的部分都会托管给Spring的Service来完成。此时我们定义的IMessage接口将会替代原来的Dao层,此时的Dao层只剩下接口文件和JavaDao.xml配置文件. 

Mybatis接口式编程的原理

第一个问题,明天为什么接口Imssage.queryMessageList()没有实现类,但是却可以调用对应的方法?

            首先要有一个创建代理实例的类,类里面有个方法invoke();

MapperProxy implements InvocationHandler
{
 MapperProxy.invoke();
}

            当我们调用接口的时候,走的是Invoke()方法,会通过Proxy.NewProxyInstance()加载一个代理实例,实际上也就是通过sqlSession.getMapper()来获取代理实例,即

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

            这样,即使IMessage自身没有实现类,但是通过SqlSession的getMapper方法带入接口类IMessage.class,就可以获取一个IMessage类型的代理实例,很明显,这里是泛型在起作用,带入什么样的类型,就得到一个什么类型的接口,原因是Mybatis已经利用泛型做了强转了; 

第二个问题,既然是通过invoke()方法,它是怎么知道我们要调用sqlSession.selectList()方法?

            因为刚初始化sqlSession的时候,加载了Configuration.xml文件,并在改文件中加载了各个JavaDao.xml文件,而这个Configuration.xml文件对应了Mybatis中相关的类:Configuration,接口的全名称在Invoke()方法里面都可以拿到, 接口全名称.方法名==namespace.id,所以可以拿到配置文件中的查询方法。 

SqlSession的获取

public SqlSession getSqlSession() throws IOException 
{ 
    //1、通过配置文件获取数据库连接相关信息 
    Readerreader=Resources.getResourceAsReader("hdu/terence/config/Configuration.xml"); 
    //2、通过配置信息构建SqlSessionFactory 
    SqlSessionFactorySSF=newSqlSessionFactoryBuilder().build(reader); 
    //3、通过SqlSessionFactory打开数据库会话 
    SqlSessionsqlSession=SSF.openSession(); 
    return sqlSession; } 

    SqlSession通过上述配置实现,首先通过Resources.getResourceAsReader(“配置文件路径”)方法加载配置文件包装一个reader对象,然后通过SqlSessionFactory这个接口带入reader对象,获取一个动态代理实例,即SqlSessionFactory会话工厂,通过会话工厂得到一个会话SqlSession().   

  其中,在获取会话工厂获取实例的时候,底层实现源码是将带入的参数read作为key,找到Map中对应的value值,即MapperProxyFactory。

以上所述是小编给大家介绍的Mybatis接口式编程的原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# mybatis接口编程  # MyBatis接口的简单实现原理分析  # Mybatis 简介与原理  # mybatis原理概述入门教程  # Java的MyBatis框架中Mapper映射配置的使用及原理解析  # TKmybatis的框架介绍和原理解析  # 配置文件  # 的是  # 加载  # 将会  # 返回值  # 其他的  # 直接调用  # 很明显  # 小编  # 就可以  # 自己的  # 可以拿到  # 有什么  # 就会  # 有个  # 第一个  # 在此  # 说了  # 要有  # 并在 


相关文章: 专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  高防服务器租用首荐平台,企业级优惠套餐快速部署  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  实惠建站价格推荐:2025年高性价比自助建站套餐解析  建站之星×万网:智能建站系统+自助建站平台一键生成  大同网页,大同瑞慈医院官网?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站之星下载版如何获取与安装?  如何构建满足综合性能需求的优质建站方案?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何用已有域名快速搭建网站?  如何用PHP工具快速搭建高效网站?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  广州商城建站系统开发成本与周期如何控制?  中山网站制作网页,中山新生登记系统登记流程?  c# 在ASP.NET Core中管理和取消后台任务  北京制作网站的公司,北京铁路集团官方网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  青岛网站建设如何选择本地服务器?  C++中引用和指针有什么区别?(代码说明)  婚礼视频制作网站,学习*后期制作的网站有哪些?  建站10G流量真的够用吗?如何应对访问高峰?  如何自定义建站之星网站的导航菜单样式?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  建站主机与虚拟主机有何区别?如何选择最优方案?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何在阿里云域名上完成建站全流程?  如何选择PHP开源工具快速搭建网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  建站主机无法访问?如何排查域名与服务器问题  MySQL查询结果复制到新表的方法(更新、插入)  建站之星CMS建站配置指南:模板选择与SEO优化技巧  创业网站制作流程,创业网站可靠吗?  动图在线制作网站有哪些,滑动动图图集怎么做?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  潮流网站制作头像软件下载,适合母子的网名有哪些?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  建站主机如何选?高性价比方案全解析  导航网站建站方案与优化指南:一站式高效搭建技巧解析  三星网站视频制作教程下载,三星w23网页如何全屏?  常州企业建站如何选择最佳模板? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。