MyBatis的接口绑定:

  参考链接:http://blog.csdn.net/chris_mao/article/details/48836039

  接口映射就是在IBatis中任意定义接口,然后把接口里边的方法和SQL语句绑定,我们可以直接调用接口方法,比起SqlSession提供的方法我们可以有更加灵活的选择和设置

iBatis:
  iBatis是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性

  iBatis不同于一般的OR映射框架(将数据库表、字段映射到类、属性,是一种元数据映射(meta-data))

  iBatis是将sql查询的参数和结果集映射到类

  因此可以说,iBatis做的是SQL Mapping的工作。它把SQL语句看成输入以及输出,结果集就是输出,而where后面的条件参数则是输入

    iBatis能将输入的普通POJO对象、Map、XML等映射到SQL的条件参数上,同时也可以将查询结果映射到普通POJO对象(集合)、Map、XML等上面
  
  iBatis使用xml文件来映射这些输入以及输出。能大大减少数据库存储部分的代码量,而且可以非常方便的利用SQL中的一些小技巧
  易百教程:http://www.yiibai.com/ibatis/ibatis_overview.html

  在不使用接口映射的情况下,我们经常使用SqlSession实例的selectXXX(selectOne, selectList, selectMap)方法来执行映射文件中相应的SQL语句的,这些方法都有一个String类型的参数,用来指明调用的是哪一个映射文件下的哪一条sql语句,所以通常是包名+类名+id,如:

    <select id="selectBlog" parameterType="int" resultType="Blog">
select *
from blog where id = #{id}
</select>
      SqlSession session = MyBatisUtil.getSqlsession();
   
   //加载com.roxy.mybatis.mapper包下的BlogMapper.xml文件中id为selectBlog的sql语句
   //传递的参数为1
   Blog blog = session.selectOne("com.roxy.mybatis.mapper.BlogMapper.selectBlog", 1);
        
   session.close();

 而这存在一些潜在的问题:

  • 为了确保名称空间的唯一性,通常会使用相对较长的、且有一定含义的字符串来作为其值,这样就很难保证我们在代码不出现拼写错误的情况,即使是直接从映射文件拷贝过来的,也存在不经意间被修改的可能性
  • 从selectXXX方法的签名可以看到,它的第二个参数是Object类型,那么如果我们传入的参数类型与映射文件中由parameterType属性指定的类型不一致时,将会出现不可预知的错误
  • 同样,selectXXX方法返回值使用了泛型,我们须确保用于接收其返回值的变量类型与映射文件中属性resultType指定的类型相一致

在引入了接口映射之后:

  接口式编程,我们可以简单的理解为Mybatis为映射文件定义了一个代理接口,以后全部通过这个接口来和映射文件交互,而不再是使用以前方法

  映射文件如何知道自己被哪个接口代理呢?

    这里就是通过名称空间来实现的,映射文件的名称空间再也不是随心所欲的定义的了,而是要使用代理接口的全限定名作为其名称空间。所谓全限定名,就是接口所在的包名加上接口名称

//指明此映射文件的代理接口是com.roxy.mybatis.mapper包下的BlogMapper接口
<mapper namespace="com.roxy.mybatis.mapper.BlogMapper">
  
  <select id="selectBlog" parameterType="int" resultType="Blog">
        select *
        from blog where id = #{id}
    </select> </mapper>

  接口定义好了,那么如何将映射文件中的select / insert / update / delete 等元素与代理接口中的方法绑定呢?

    其实很简单,只需要在代理接口中定义一些方法,并以相应元素的id属性值做为方法名,parameterType属性值做为方法参数类型,属性resultType值做为方法的返回值即可

public interface BlogMapper {

    //单条语句查询
Blog selectBlog(Integer id);
}

  接口定义好了,是不是还要再定义一个实现类呢?

    答案是否定的。Mybatis会使用动态代理机制来帮助我们完成额外的工作,我们需要做的就是把这个接口注册到Mybatis中。在Mybatis的总配置文件中进行配置

    <!-- 定义映射文件 -->
<mappers>
<package name="com.roxy.mybatis.mapper"/>
</mappers>

  之后就可以在项目中直接调用代理接口中的方法了

        SqlSession session = MyBatisUtil.getSqlsession();

        BlogMapper blogMapper = session.getMapper(BlogMapper.class);

        Blog blog = blogMapper.selectBlog(1);

        session.close();

  接口式编程与之前的调用方式相比较,有以下优点:

  • 调用方法明确,因为我们调用的是接口中的某个具体方法,而不再是通过一个字符串来指定执行映射文件中的某个SQL语句了
  • 传入参数和返回值都不再是Object了,这样就可以在代码编写阶段确保传入的参数类型是正确的,也不再需要对返回值进行强类型转换了
  • 最主要的一点,就是将来Mybatis遇到了Spring,更能发挥出接口式编程的强大潜力

Mybatis 接口绑定的更多相关文章

  1. mybatis 接口绑定 和 动态SQL

    一.MyBatis 接口绑定方案及多参数传递 1.作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql 2.后面 ...

  2. MyBatis系列(二) MyBatis接口绑定与多参数传递

    前言 通过上一篇博文的,已经可以做到通过MyBatis连接数据库,现在再来介绍一种方法通过接口绑定SQL语句. 不使用接口绑定的方式 不使用接口绑定的方式,是通过调用SqlSession中的selec ...

  3. MyBatis之接口绑定方案及多参数传递

    1.说明   所谓的MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql.在SS ...

  4. mybatis之接口绑定

    接口绑定方案 mybatis中,提供了一套接口绑定方案,程序员可以提供一个接口,然后提供对应接口的一个mapper.xml文件.MyBatis会自动将接口和xml文件进行绑定.实际上就是mybatis ...

  5. Mybatis实现了接口绑定,使用更加方便。

    1.Mybatis实现了接口绑定,使用更加方便. 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生 ...

  6. 什么是 MyBatis 的接口绑定?有哪些实现方式?

    接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑 定, 我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可 以有更加灵活的选择和 ...

  7. MyBatis接口式编程

    MyBatis使用接口连接数据库 之前学习了如何传统的使用MyBatis连接数据库,今天学习如何使用更方便快捷的方式练级数据库.使用接口连接数据库 https://www.cnblogs.com/li ...

  8. http80端口转发(实现微信公众号接口绑定IP时,同时支持多个公众号)

    http80端口转发 背景 微信公众平台接口绑定服务器时,如果使用IP需要使用80端口,此组件可实现一个IP上绑定多个公众平台接口 使用方法 http://(IP)/WeixinMP/(转发的地址Ba ...

  9. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

随机推荐

  1. HackPwn:TCL智能洗衣机破解细节分析

    上周结束的Hackpwn上,黑客们脑洞大开,破解了比亚迪汽车.小米手环.乐小宝.长虹电视.TCL洗衣机和九阳豆浆机等一系列最新的智能硬件,据黑客介绍,TCL是一家把家门“砌死”的企业,由于得到了将要被 ...

  2. iOS plist文件的读写

    原帖:http://blog.csdn.net/totogo2010/article/details/7634185 在做iOS开发时,经常用到到plist文件,  那plist文件是什么呢? 它全名 ...

  3. nodejs 安装出错总结

    1.npm无法安装模块,重新安装nodejs之前要 删除node下的文件(主要是npm包,不然安装是徒劳) 2.npm config list -l 查看git配置 3. Downloading bi ...

  4. Spring MVC - 拦截器实现 和 用户登陆例子

    1.拦截器 SpringMvc中的拦截器实现了HandlerInterceptor接口,通常使用与身份认证,授权和校验,模板视图,统一处理等: public class HanderIntercept ...

  5. xdoj 1044---炸红花 (话说 小时候经常玩这个被虐。。。。qwq)

    // 我真的好笨 只会枚举 话说那个ac的370b到底是怎么做的 /(ㄒoㄒ)/~~ #include <iostream> #include <algorithm> usin ...

  6. Omar Loves Candies

    题目大意:在一个N * M的格子中,放有一些糖,这些糖有的会损害健康,有的对健康有益.有损害的被记为负数,有益的会记为正数.另外,对于每一个糖而言,他都比左边的糖和上面的糖更健康. 现在我要在在N*M ...

  7. Windows Server2008 R2性能优化方法

    经常使用的是Windows 2008R2企业版的服务器,简单总结一下性能优化的方法 ========================================================== ...

  8. LG2023 [AHOI2009]维护序列

    题意 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数 ...

  9. systemd学习笔记

    一.systemd介绍 systemd即为system daemon,是linux下的一种init软件与多数发行版使用的System V风格init相比,systemd采用了以下新技术: (1) 采用 ...

  10. grandstack graphql 开发模型

    当前grandstack 支持两类开发方式 js (使用Neo4j-graphql-js) 插件模型 js 模型 参考https://github.com/rongfengliang/grand-st ...