MyBatis3 User Guide 第二部分

声明:文章内容只作为学习和交流使用,不得用于商业转载,如需使用,请通过站内短信与本人联系,获得许可。

 

探索SQL映射 (Exploring Mapped SQL Statements)

       此刻,你可能很想知道SqlSession或者映射类究竟执行了些什么操作。然而SQL映射(Mapped SQL Statements)是一个很大的话题,如果展开来谈,会占用很大篇幅,但为了能让你对所执行的内容有个整体的认识,下面给出几个例子。

      上面展示的任何一个例子,都可以通过XML或注解二者中的任何一种语法来定义。让我们先来看下XML方式的定义。MyBatis提供的全部特性都可以通过基于XML的映射来实现,这也正是这些年来MyBatis如此受欢迎的原因。如果你之前使用过MyBatis,它的概念对你来说并不陌生,但在XML映射文件上做了大量改进,以便以后的使用上更加清晰。这个例子是一个基于XML的映射,可以适用于上面SqlSession的调用过程。

<?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="org.mybatis.example.BlogMapper">  
  <select id="selectBlog" parameterType="int" resultType="Blog"> 
    select * from Blog where id = #{id}  
  </select>  
</mapper> 

      对这个简单的例子来说,看起来好像有点杀鸡用牛刀了,但实际上它非常轻巧。在一个XML映射文件中,你可以定义任意多的映射语句,可以对得起你定义一个XML头和DOCTYPE 声明付出的辛劳,呵呵。该文件的剩余部分几乎不用过多的解释就可以看明白。给这个映射起了个名字“selectBlog”,而命名空间“org.mybatis.example.BlogMapper”则允许你用全限定的名字来调用它“org.mybatis.example.BlogMapper.selectBlog”。下面看到的这个例子,就和我们上面做的一样:

Blog blog = (Blog) session.selectOne( "org.mybatis.example.BlogMapper.selectBlog", 101); 

       注意看,这种调用和我们调用一个全限定的类上的方法何其的相似,这其中肯定有原因的。这个名字可以直接映射到和命名空间名字相同的一个类上,它可以匹配方法名,参数,它的返回值就是这个映射的select语句的返回值。因此你可以用一种非常简单的方式,就像你上面看到的那样来调用你所映射的这个类上的方法,但是这里再次出现在下面的示例当中:

BlogMapper mapper = session.getMapper(BlogMapper.class); 
Blog blog = mapper.selectBlog(101); 

        第二种方式有许多优势,首先,它不再依赖于一个字符串常量,因此更加安全;其次,如果你的IDE有代码自动完成功能的话,你可以利用它在那些已经映射了的SQL语句之间进行方便的导航;第三,你无须对返回值进行强制转换,因为BlogMapper接口有清晰的、类型安全的返回值(和类型安全的参数)。

 

关于命名空间(Namespaces)的说明

→命名空间(Namespaces) 在MyBatis之前的版本中,命名空间是可选的,也因此造成了很多的混乱和无助。在现在这版中,命名空间是必须的,而且它的用途不再仅仅是用较长的,全限定的名称来完成简单的隔离。正如你所看到的,命名空间可以用来进行接口绑定(interface bindings),即便你认为你现在还用不上它,但你也必须要遵守这些实践,以免你后来改变主意。一但你使用了命名空间,并且将其置于一个合适的java包命名空间中,将会使你的代码非常干净,并且从长远来看,将会大大提高MyBatis的可用性。                                                                                                     

→命名策略(Name Resolution)  为了减少打字数量,MyBatis采用下面的命名规则来命名所有的配置元素,包括语句(statements)、结果映射(result maps)、缓存(caches)等等。

  • 全限定名(Fully qualified names )可以直接进行查询和使用,比如:“com.mypackage.MyMapper.selectAllThings”,
  • 短名字,比如:“selectAllThings”,可以用来引用名字唯一的对象。然而如果该名字有两个,比如:“com.foo.selectAllThings 和“com.bar.selectAllThings”,那么你就会收到一个错误报告,表名该名字语意不清,因此必须要使用全限定的名称。

         还有一种映射BlogMapper类的窍门。那些Sql语句根本不需要通过XML来进行映射,而可以直接通过Java的注解(Java Annotations)来实现。例如,上面的那些XML可以完全用下面的写法代替:

package org.mybatis.example; 
public interface BlogMapper { 
  @Select("SELECT * FROM blog WHERE id = #{id}") 
  Blog selectBlog(int id); 
}

          对于简单的Sql来说,用注解要清晰的多,然而,对于复杂的语句,注解就会显得既混乱,又不灵活。所以如果你想做一些复杂的事,你最好还是用XML来做映射。

         使用哪种方式取决于你和你的项目组认为哪种更适合于你们,以及用一种统一的方式来定义语句对你们来说有多么重要。也就是说你们没有必要死守一种方式,你们可以非常简单的从注解映射的方式迁移到XML映射的方式,反之亦然。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值