Mybatis 接口绑定
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 接口绑定的更多相关文章
- mybatis 接口绑定 和 动态SQL
一.MyBatis 接口绑定方案及多参数传递 1.作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql 2.后面 ...
- MyBatis系列(二) MyBatis接口绑定与多参数传递
前言 通过上一篇博文的,已经可以做到通过MyBatis连接数据库,现在再来介绍一种方法通过接口绑定SQL语句. 不使用接口绑定的方式 不使用接口绑定的方式,是通过调用SqlSession中的selec ...
- MyBatis之接口绑定方案及多参数传递
1.说明 所谓的MyBatis接口绑定,指的是实现创建一个接口后,把mapper.xml 由mybatis 生成接口的实现类,通过调用接口对象就可以获取mapper.xml 中编写的sql.在SS ...
- mybatis之接口绑定
接口绑定方案 mybatis中,提供了一套接口绑定方案,程序员可以提供一个接口,然后提供对应接口的一个mapper.xml文件.MyBatis会自动将接口和xml文件进行绑定.实际上就是mybatis ...
- Mybatis实现了接口绑定,使用更加方便。
1.Mybatis实现了接口绑定,使用更加方便. 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生 ...
- 什么是 MyBatis 的接口绑定?有哪些实现方式?
接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑 定, 我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可 以有更加灵活的选择和 ...
- MyBatis接口式编程
MyBatis使用接口连接数据库 之前学习了如何传统的使用MyBatis连接数据库,今天学习如何使用更方便快捷的方式练级数据库.使用接口连接数据库 https://www.cnblogs.com/li ...
- http80端口转发(实现微信公众号接口绑定IP时,同时支持多个公众号)
http80端口转发 背景 微信公众平台接口绑定服务器时,如果使用IP需要使用80端口,此组件可实现一个IP上绑定多个公众平台接口 使用方法 http://(IP)/WeixinMP/(转发的地址Ba ...
- 生成跨语言的类型声明和接口绑定的工具(Djinni )
Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...
随机推荐
- HackPwn:TCL智能洗衣机破解细节分析
上周结束的Hackpwn上,黑客们脑洞大开,破解了比亚迪汽车.小米手环.乐小宝.长虹电视.TCL洗衣机和九阳豆浆机等一系列最新的智能硬件,据黑客介绍,TCL是一家把家门“砌死”的企业,由于得到了将要被 ...
- iOS plist文件的读写
原帖:http://blog.csdn.net/totogo2010/article/details/7634185 在做iOS开发时,经常用到到plist文件, 那plist文件是什么呢? 它全名 ...
- nodejs 安装出错总结
1.npm无法安装模块,重新安装nodejs之前要 删除node下的文件(主要是npm包,不然安装是徒劳) 2.npm config list -l 查看git配置 3. Downloading bi ...
- Spring MVC - 拦截器实现 和 用户登陆例子
1.拦截器 SpringMvc中的拦截器实现了HandlerInterceptor接口,通常使用与身份认证,授权和校验,模板视图,统一处理等: public class HanderIntercept ...
- xdoj 1044---炸红花 (话说 小时候经常玩这个被虐。。。。qwq)
// 我真的好笨 只会枚举 话说那个ac的370b到底是怎么做的 /(ㄒoㄒ)/~~ #include <iostream> #include <algorithm> usin ...
- Omar Loves Candies
题目大意:在一个N * M的格子中,放有一些糖,这些糖有的会损害健康,有的对健康有益.有损害的被记为负数,有益的会记为正数.另外,对于每一个糖而言,他都比左边的糖和上面的糖更健康. 现在我要在在N*M ...
- Windows Server2008 R2性能优化方法
经常使用的是Windows 2008R2企业版的服务器,简单总结一下性能优化的方法 ========================================================== ...
- LG2023 [AHOI2009]维护序列
题意 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数 ...
- systemd学习笔记
一.systemd介绍 systemd即为system daemon,是linux下的一种init软件与多数发行版使用的System V风格init相比,systemd采用了以下新技术: (1) 采用 ...
- grandstack graphql 开发模型
当前grandstack 支持两类开发方式 js (使用Neo4j-graphql-js) 插件模型 js 模型 参考https://github.com/rongfengliang/grand-st ...