Mybatis框架--小结

在学习MyBatis框架的过程中,有一些相对比较底层的问题不是特别理解,在这里总结一下:

  

  1. 什么是MyBatis的接口绑定,有什么好处?

1. 什么是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,更能发挥出接口式编程的强大潜力

  

时间: 2024-10-07 17:08:46

Mybatis框架--小结的相关文章

Mybatis框架之动态SQL书写方式小结

动态SQL简介 动态SQL是Mybatis框架中强大特性之一.在一些组合查询页面,需要根据用户输入的查询条件生成不同的查询SQL,这在JDBC或其他相似框架中需要在代码中拼写SQL,经常容易出错,在Mybatis框架中可以解决这种问题. 使用动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句.常用元素为: 判断元素:if,choose 关键字元素:where,set,trim 循环元素:foreach if元素 if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQ

Mybatis 框架文档 超详细笔记

1      Mybatis入门 1.1    单独使用jdbc编程问题总结 1.1.1  jdbc程序 Public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver&q

Mybatis 框架学习

Mybatis 一. 入门 1. JDBC 回顾 (1). 准备数据库 新建 mybatis_learn 数据库 执行 sql 脚本 1 -- ---------------------------- 2 -- Table structure for `Blog` 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `Blog`; 5 CREATE TABLE `Blog` ( 6 `id` int(11) NOT NULL AUTO

Mybatis框架01

概述 MyBadis是一个优秀的基于Java的持久层框架,内部封装了Jdbc,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动.创建连接.创建statement等繁杂的过程. Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过Java对象和statement中SQL的动态参数进行映射生成最终执行的SQL,最后由mybatis框架执行SQL并将结果映射为Java对象并返回. 采用ORM思想解决了实体和数据库映射的问题,对Jdbc进行了封装,屏蔽了J

MyBatis框架之第一篇

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.2013年11月迁移到Github. ●[GitHub] GitHub就是一个互联网上的超大SVN库,里面维护着许多开源项目的代码.任何人都可以把自己好多项目代码放上去共享,同时接受其他人的共同开发. 2.2.什么是MyBatis MyBatis是使用java语言编写的一个优秀的持久层框架,是对JDBC操

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

MyBatis框架(一)

MyBatis介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动.创建connection.创建statement.手动设置参数.结果集检索等jdbc繁杂的过程代

MyBatis框架中Mapper映射配置的使用及原理解析(三) 配置篇 Configuration

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder> 我们知道XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象. Configuration类主要是用来存储对Mybatis的配置文件及mapper文件解析后的数据,Configuration对象会贯穿整个Mybatis的执行流程,为Mybatis的执行过程提供必要的配

MyBatis框架中Mapper映射配置的使用及原理解析(二) 配置篇 SqlSessionFactoryBuilder,XMLConfigBuilder

在 <MyBatis框架中Mapper映射配置的使用及原理解析(一) 配置与使用> 的demo中看到了SessionFactory的创建过程: SqlSessionFactory sessionFactory = null; String resource = "mybatisConfig.xml"; try { sessionFactory = new SqlSessionFactoryBuilder().build(Resources .getResourceAsRea