全网整合营销服务商

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

免费咨询热线: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的框架介绍和原理解析  # 配置文件  # 的是  # 加载  # 将会  # 返回值  # 其他的  # 直接调用  # 很明显  # 小编  # 就可以  # 自己的  # 可以拿到  # 有什么  # 就会  # 有个  # 第一个  # 在此  # 说了  # 要有  # 并在 


相关文章: 模具网站制作流程,如何找模具客户?  代购小票制作网站有哪些,购物小票的简要说明?  如何在宝塔面板中修改默认建站目录?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  无锡营销型网站制作公司,无锡网选车牌流程?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机选哪家性价比最高?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  在线教育网站制作平台,山西立德教育官网?  制作营销网站公司,淘特是干什么用的?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何实现建站之星域名转发设置?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站主机选购指南:核心配置优化与品牌推荐方案  建站之星价格显示格式升级,你的预算足够吗?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何通过二级域名建站提升品牌影响力?  小程序网站制作需要准备什么资料,如何制作小程序?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  临沂网站制作公司有哪些,临沂第四中学官网?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何在万网主机上快速搭建网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  建站主机与服务器功能差异如何区分?  SQL查询语句优化的实用方法总结  浅谈Javascript中的Label语句  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  黑客入侵网站服务器的常见手法有哪些?  建站之星好吗?新手能否轻松上手建站?  个人网站制作流程图片大全,个人网站如何注销?  建站三合一如何选?哪家性价比更高?  如何快速打造个性化非模板自助建站?  已有域名如何快速搭建专属网站?  网站制作需要会哪些技术,建立一个网站要花费多少?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  如何快速生成专业多端适配建站电话?  如何在腾讯云服务器快速搭建个人网站?  大连 网站制作,大连天途有线官网?  建站之星后台管理如何实现高效配置?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何在新浪SAE免费搭建个人博客?  建站之星与建站宝盒如何选择最佳方案?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何在香港免费服务器上快速搭建网站?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  ,交易猫的商品怎么发布到网站上去? 

您的项目需求

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