zoukankan      html  css  js  c++  java
  • 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,更能发挥出接口式编程的强大潜力
  • 相关阅读:
    第六周总结
    第五周总结
    第四周总结
    7-1 抓老鼠啊~亏了还是赚了?
    春季学期第八周作业
    春季学期第七周作业
    春季学期第六周作业
    春季学期第五周作业
    春季学期第四周作业
    春季学期第三周作业
  • 原文地址:https://www.cnblogs.com/roxy/p/7576343.html
Copyright © 2011-2022 走看看