《MyBatis用户指南》----Part 2

P8


关于命名空间的提示

è命名空间在前面的例子中是可选的,也是令人糊涂和没有益处的。现在是需要命名空间的,它的目的不仅仅是用长长的全限定名字来隔离语句。
   如你所见,命名空间使绑定接口成为可能,即使你认为现在不会用到它们,但你仍然应该遵从这些实践以防你将来改变主意。一次使用命名空间、把它放在一个合适的Java包命名空间中,会使你的代码整洁、干净,在相当长的时间内,提高MyBatis的可用性。

è名字解析:为了减少输入量,MyBatis为命名配置元素,包括语句,结果映射,缓存等等使用如下的名字解析方案:
   会直接查找全限定名(如“com.mypackage.MyMapper.selectAllThings”),如果存在就使用。
   短名(如“selectAllThings”)会被直接用来引用无歧义的项。但如果有两个以上的短名(如“com.foo.selectAllThings 、 com.bar.selectAllThings”),程序会抛出一个错误,告诉你这个短名有歧义,必须使用全限定名。
  
   对于映射者类(Mapper)如BlogMapper,还有一个容易迷惑的地方。它们的映射语句可以根本不用xml。相反它们可以使用Java注解。比如,上面的xml可以替换成如下的内容:
     
P9
  对于简单的语句,这个注解非常简洁,但是,Java注解不仅功能上有限制而且对于复杂的语句会显得非常乱。如果你需要处理复杂的情况,最好使用xml映射语句。
  哪个对你是对的、映射语句定义成一致的方式对你们有多重要,这取决于你和你的项目组。也就是说,永远不要把自己锁定到一种方式。你能够非常容易地把xml映射语句迁移到注解上,反之亦然。
 
作用域和生命周期
   理解我们讨论过的多种作用域和生命周期类是非常重要的,错误的使用会导致严重的并发问题。
  
SqlSessionFactoryBuilder
  这个类可以被初始化、使用然后丢弃。一旦你创建了SqlSessionFactory,就没有必要再保存SqlSessionFactoryBuilder。因此,它的实例的最好作用域就是方法作用域(如一个本地方法变量)。可以使用SqlSessionFactoryBuilder创建多个SqlSessionFactory实例,但最好不要保存SqlSessionFactoryBuilder实例,以确保为了更重要的事情,所有xml解析资源都是可用的。
 
SqlSessionFactory
  一旦创建,SqlSessionFactory应该存在于整个应用程序的执行期。极少有或根本没有理由去销毁或重建它。最佳实践是在一个程序运行期中,避免多次重建SqlSessionFactory,那么做是非常“恶心的”。因此SqlSessionFactory的作用域最好是应用程序作用域。有好几种办法可以做到这点。最简单的一种是使用单例或静态单例模式。但是,这二者没有一个是作为最佳实践而被广泛接受的。相反,你也许更喜欢研究一下依赖注入容器,如Google Guide或Spring。这样的框架允许你创建提供者来管理SqlSessionFactory单例生命周期。
 
SqlSession
  每个线程都应该有自己的SqlSession实例。SqlSession实例不会共享,而且也不是线程安全的。因此最好的作用域是请求(request scope)或方法作用域。永远不要在类的静态字段甚至实例字段保持SqlSession实例的引用。永远不要在任何受管理域,如Servlet框架的HttpSession,保持SqlSession实例的引用。如果正在使用任何web框架,请考虑使用与HTTP request相似的作用域(译者注:原文是consider the SqlSession to follow a similar scope to that of an HTTP request,实在看的有些不知所云,但基本意思应该和我说的一样)。换句话说,收到HTTP请求时,可以打开一个SqlSession,当返回响应的时候,关闭这个SqlSession。关闭SqlSession非常重要。应确保在finally语句块中关闭它。下面是一个确保SqlSession被关闭的标准模式:
   

 
P10
  如此一直使用可以确保所有数据库资源被正确地关闭掉(假定你之前没有使用过自己的连接用来告诉MyBatis你想自己管理连接资源)。
 
映射者实例
  映射者是用来绑定映射语句的一组接口。映射者接口的实例可以从SqlSession获得。这样的话,从理论上来说,它的实例作用域和发出请求的SqlSession是一样的。也就是说,它们应该在应该使用的方法里被请求,然后废弃。不必显式关闭它们。在一个请求中不必保持这些实例,和SqlSession是类似的,你会发现如果在这个级别上管理太多资源,事情很快便会无法控制。保持简单,在方法作用域中保持映射者。下面的例子说明了这点。

 
映射者xml配置 
  MyBatis配置文件包含了拥有强大能力的设置和属性。下面是xml文档的高级结构:

· configuration

properties

settings

typeAliases

typeHandlers

objectFactory

plugins

environments

§ environment

· transactionManager

· dataSource

mappers

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章