声明:文章内容只作为学习和交流使用,不得用于商业转载,如需使用,请通过站内短信与本人联系,获得许可。
探索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)等等。
还有一种映射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映射的方式,反之亦然。