计算机专业毕业设计外文翻译-中文.docx
计算机专业毕业设计外文翻译-中文 入门 每一个MyBatis应该都是以一个SqlSessionFactory实例为中心。一个SqlSessionFactory实例可以使用SqlSessionFactoryBuilder来创造。从配置类中创造的定制SqlSessionFactoryBuilder 实例,可以使用XML配置文件来生成一个SqlSessionFactory实例。 从XML中创造SqlSessionFactory 从XML文件中创造SqlSessionFactory实例是非常简单的。推荐使用一个类路径资源来进行配置,你也可以使用一个Reader实例,甚至使用URL路径。 MyBatis有一个Resources通用类,类中有许多方法可以简单地从类路径和其他地址中加载资源。 Stringresource="org/mybatis/example/Configuration.xml"Readerreader=Resources.getResourc eAsReader(resource);sqlMapper=newSqlSessionFactoryBuilder().build(reader);XML文件包含了许多MyBatis的核心设置,包括一个获取数据库连接(Connection)实例的数据源(DataSource),和一个决定事务作用域和操作的TransactionManager。全部的XML配置文件的内容将在以后提到,先给出一个简单的样子。 XML配置文件中还有其它许多内容,上面的例子只是指出了最重要的部分。注意这个XML的标头,需要一个DTD验证文档。environment项里包含了事务管理和连接池的环境配置。mappers项中包含了一系列SQL语句映射定义的XML文件。 不使用XML文件新建SqlSessionFactory 如果你更想直接使用Java语言而不是XML来生成这些配置,更或者你想使用自己的配置生成器,MyBatis提供了一个完整的配置类来完成XML文件一样的配置。 DataSourcedataSource=BlogDataSourceFactory.getBlogDataSource();TransactionFactorytransa ctionFactory=newJdbcTransactionFactory(); Environmentenvironment= newEnvironment("development",transactionFactory,dataSource);Configurationconfiguration=n ewConfiguration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactorysqlS essionFactory= newSqlSessionFactoryBuilder().build(configuration); 这个配置里,加载了一个映射类。映射类是包含了SQL映射注解的Java类,可以用来取代XML。然而,由于Java注解的一些限制和MyBatis映射的复杂性,一些高级的映射还是要用XML来配置,比如嵌套映射等。由于这个原因,MyBatis会自动查找和加载已经存在的XML。比如说上面的代码,BlogMapper.xml将会被类路径中BlogMapper.class加载。以后会详细讨论这些。 使用SqlSessionFactory获取SqlSession 假设你有一个SqlSessionFactory,你就可以来获取一个SqlSession实例,SqlSession包含了针对数据库执行语句的每一个方法。你可以直接使用SqlSession执行已经映射的每一个SQL 语句。比如: SqlSessionsession=sqlMapper.openSession();try Blogblog=(Blog)session.select( "org.mybatis.example.BlogMapper.selectBlog",101);finally session.close();上述步骤对于使用MyBatis的上一个版本(即iBatis2)的用户来说比较熟悉。现在,有一个更加清晰的方式。使用一个有正确参数和返回值的接口,你就可以更加清晰和安全地编写代码,从而避免出错。像这样: SqlSessionsession=sqlSessionFactory.openSession();try BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101); finally session.close(); 现在,让我们开始探究一下步骤的执行细节。 探究SQL映射语句 对于上面所说的,你可能很好奇SqlSession或Mapper类具体是什么执行的。这是一个很复杂的话题,如果要讨论,可能要用占据这个文档的绝大部分。为了给你一个执行过程的概括,现在给出两个例子。在上面的例子中,语句已经由XML或注解所定义。我们先来看一下XML,以前,MyBatis提供的的所有特性,都是基于XML的映射语句来实现。如果你以前使用过MyBatis,那你对这些概念会非常熟悉。但是XML的映射配置文档有了许多改进,以后将会变得越来越简单清晰。下面这个基于XML映射语句可以完成上面的SqlSession调用。 select*fromBlogwhereid=#id 虽然这个简单的例子有点生涩,但是却非常简约。你可以定义多个文件,也可以在一个XML文件里定义任意个映射语句,这样可以省去XML标头。文件的其它部分,都是自身的描述。它定义了一个org.mybatis.example.BlogMapper命名空间,在这个空间里再定义了一个selectBlog语句。也可以使用org.mybatis.example.BlogMapper.selectBlog全名称来调用。我们可以将这样来调用上面这个文件 Blogblog=(Blog)session.select( "org.mybatis.example.BlogMapper.selectBlog",101);这和调用一个普通的JA V A类非常相似。这个名字可以直接映射为一个与命名空间相同名称的Mapper类,语句名对应类的方法名,参数和返回值也相对应。你可以用下列语句简单地针对Mapper接口进行调用,代码如下:BlogMappermapper=session.getMapper(BlogMapper.class);Blogblog=mapper.selectBlog(101); 第二种方式有许多优点。一、它不依赖字符串,可以减少出错。二、如果你的IDE有代码自动完成功能,你可以很快导航到你的SQL语句(因为已经转化为方法名)。三、你不再需要设定返回值类型,因为接口限定了返回值和参数。 还有一个关于Mapper类的技巧。它们的映射语句完全不需要使用XML来配置,可以使用JA V A注解方式来取代。比如,上面的XML语句可以替换为: packageorg.mybatis.example;publicinterfaceBlogMapper Select("SELECT*FROMblogWHEREid=#id")BlogselectBlog(intid); 注解是非常简单明了的,但是JA V A注解既有局限性,在语句比较复杂的情况下又比较容易混乱。所以,如果你的语句比较复杂,最好还是使用XML来映射语句。 这主要取决于你和你的项目团队,决定哪个更适合于你,主要还是以稳健为主。也就是说,你不需要制约于哪一种方式,你可以很容易的把注解转为XML,也可以把XML转化为注解。 作用域和生命周期 理解作用域和生命周期类非常重要,如果使用不当,会造成各种各样的问题。 SqlSessionFactoryBuilder 这个类可以被初始、使用和丢弃,如果你已经创建好了一个SqlSessionFactory后就不用再保留它。因此,SqlSessionFactoryBuilder的最好作用域是方法体内,比如说定义一个方法变量。你可以重复使用SqlSessionFactoryBuilder生成多个SqlSessionFactory实例,但是最好不要强行保留,因为XML的解析资源要用来做其它更重要的事。 SqlSessionFactory 一旦创建,SqlSessionFactory就会在整个应用过程中始终存在。所以没有理由去销毁和再创建它,一个应用运行中也不建议多次创建SqlSessionFactory。如果真的那样做,会显得很拙 劣。因此SqlSessionFactory最好的作用域是Application。可以有多种方法实现。最简单的方法是单例模式或者是静态单例模式。然而这既不是广泛赞成和好用的。反而,使用GoogleGuice 或Spring来进行依赖反射会更好。这些框架允许你生成管理器来管理SqlSessionFactory的单例生命周期。 SqlSession 每个线程都有自己的SqlSession实例,SqlSession实例是不能被共享,也是不是线程安全的。因此最好使用Request作用域或者方法体作用域。不要使用类的静态变量来引用一个SqlSession实例,甚至不要使用类的一个实例变更来引用。永远不要在一个被管理域中引用SqlSession,比如说在Servlet中的HttpSession中。如果你正在使用WEB框架,应该让SqlSession 跟随HTTP请求的相似作用域。也就是说,在收到一个HTTP请求过后,打开SqlSession,等返回一个回应以后,立马关掉这个SqlSession。关闭SqlSession是非常重要的。你必须要确保SqlSession在finally方法体中正常关闭。可以使用下面的标准方式来关闭:SqlSessionsession=sqlSessionFactory.openSession();try /doworkfinally session.close(); 使用这种模式来贯穿你的所有代码,以确保所有数据库资源都被完全关闭。这是假定不是使用你自己的数据库连接,而是使用MyBatis来管理你的数据库连接资源 Mapper实例 Mapper是一种你创建的用于绑定映射语句的接口。Mapper接口的实例是用SqlSession来获得的。同样,从技术上来说,最广泛的Mapper实例作用域像SqlSession一样,使用请求作用域。确切地说,在方法被调用的时候调用Mapper实例,然后使用后,就自动销毁掉。不需要使用明确的注销。当一个请求执行正确无误的时候,像SqlSession一样,你可以轻而易举地操控这一切。保持简单性,保持Mapper在方法体作用域内。下面演示了如果来操作:SqlSessionsession=sqlSessionFactory.openSession();try BlogMappermapper=session.getMapper(BlogMapper.class);/doworkfinally session.close(); Mapper的XML配置文件 Mapper的XML配置文件包含一些设置和属性,用于增强MyBatis的动作。文档的深层次结果如下:configuration |-properties|-settings|-typeAliases|-typeHandlers|-objectFactory|-plugins |-environments|-|-environment |-|-|-transactionManager|-|-|_dataSource|_mappers 一、属性(properties) JA V A属性文件就可以配置直观的、可代替的属性,或者是属性项的子项。比如: 通过动态配置,这些属性都可以用替换整个文件的值。例如: 例子中的usrname和password将被属性文件中设置的值所替换,driver和value属性也将被config.properties文件中值所替换,这为配置提供了多种选择。属性值也可以设入到SqlSessionBuilder.build()方法中,例如: SqlSessionFactoryfactory= sqlSessionFactoryBuilder.build(reader,props);/.or. SqlSessionFactoryfactory= sqlSessionFactoryBuilder.build(reader,environment,props); 如果一个属性项在多个地方出现,那MyBatis将按以下顺序加载: 属性文件中的属性项首先被读取 在类路径或URL资源中读取的属性项第二顺序加载,并且可以覆盖第一顺序加载 的值 在方法体中给定的参数值最好加载,但是以后覆盖上述两种加载的值。 也就是说,最高级别的属性值是方法体中设定的参数值,接下来是类路径和URL,最后才是属性文件。 对象工厂(ObjectFactory) 每次MyBatis为结果对象创建一个新实例,都会用到ObjectFactory。默认的ObjectFactory 与使用目标类的构造函数创建一个实例毫无区别,如果有已经映射的参数,那也可能使用带参数的构造函数。如果你重写ObjectFactory的默认操作,你可以创建一下你自己的。比如:/ExampleObjectFactory.java publicclassExampleObjectFactoryextendsDefaultObjectFactorypublicObjectcreate(Classtype) returnsuper.create(type); publicObjectcreate(Classtype, ListconstructorArgTypes,ListconstructorArgs) returnsuper.create(type,constructorArgTypes,constructorArg publicvoidsetProperties(Propertiesproperties)super.setProperties(properties); /MapperConfig.xml ObjectFactory接口非常简单,只包含两个方法,一个是构造函数,一个是带参数的构造函数。最后,setProperties方法也可以使用ObjectFactory来配置。可以在ObjectFactory实例化后,通过setProperties方法,在对象工厂中定义属性。 插件(plugins) MyBatis允许你在映射语句执行过程中某点上拦截调用。默认的,MyBatis允许插件拦截以下调用: Executor(update,query,flushStatements,commit,rollback,getTransaction,close,isClosed) ParameterHandler (getParameterObject,setParameters) ResultSetHandler (handleResultSets,handleOutputParameters) StatementHandler (prepare,parameterize,batch,update,query) 这些类的细节在每个方法签名中均可以找到,源代码在MyBatis每次发布时都可以下载。如果你要做的事不仅仅是调用,而是重写(overriding)方法,那你需要了解你要重写的方法的动作。如果你试图修改或者重写既定方便的动作,你最好深入到MyBatis的核心。因为这些方法和类都底层的架构,所以使用插件时要格外小心。 使用插件是非常简单而又有用的。只需要简单地实现这个Interceptor接口,确定好你要拦截的标识即可。 /ExamplePlugin.javaIntercepts(Signature(type=Executor.class, method="update", args=MappedStatement.class,Object.class) publicclassExamplePluginimplementsInterceptor publicObjectintercept(Invocationinvocation)throwsThrowablereturninvocation.proceed();publ icObjectplugin(Objecttarget)returnPlugin.wrap(target,this); publicvoidsetProperties(Propertiesproperties) /MapperConfig.xml 上面的这个插件可以在执行器上拦截所有“update”方法的调用,这里的执行器,是一个映射语句内部对象的深架构的执行器。 重写Configuration类 附加说明一下,对于使用插件修改MyBatis的内核动作,你也可以重写整个Configuration 类。简单地继承或者重写所有的方法,然后把它做为参数代入 sqlSessionFactoryBuilder.build(myConfig)中。再次强调,这会引起MyBatis动作的严重冲突,慎用。