mybatis中文官网文档
mybatis中官方使用的东西目录什么是 My Batis?入门从XML中构建 SqIsession Factory不使用XML构建 Sqlsession Factory.6从 Sqlsession Factory中获取 Sqisession.探究已映射的SQL语句…命名空间的一点注释““泡围和生命周期8Sqlsession factory BuilderSalsession factorySqIscssion映射器实例XML映射配置文件…….properties.·····Settings........................................typeAllasestypeHandlers......13objectFactory14plugins15environments………16transactionManager.17dataSource17app“..“·SQL映射的ⅩML文件19select………………20insert, update, dc IctcParameters24resultMap高级结果映射.id, result29支持的JDBC类型..30构造方法.关联集合34鉴别器.36缓存.中··.····使用自定义缓存参照缓存动态SQL.39ifB··,。··。····垂choose, when, otherwisetrim. where. sct.Toreach43Java APi应用目录结构Sqisessions.,,…,…SqlsessionFactory BuilderSqlsession Factory.…..………qlscssi48Select Builder53Salbuilda56什么是 MyBatis?My Balis是支持普通SαL査询,存储过程和高缴映射的优秀持久层框架。 MyAtis消除了几乎所有的JBC代码和参数的于工设置以及对结果集的检索。 My Bat is可以使用简单的ⅪML或注解用于配置和原始映射,将接口和Java的POJO( Plain old Java objects,普通的Java对象)映射成数据库中的记录入门每一个 My Batis的应用程序都以一个 Sqlsession Factory对象的实例为核心Sqlsessionfactory对象的实例可以通过 Sqlsession Factory Builder对象米获得Sqisession Factory Builder对象可以通过XML配置文件,或从以往使用惯例中准备好的Configuration类实例中来构建 SqIscssion Factory对象。从XML中构建 Sqlsession Factory从XML文件中构建 Sqlisession Factory的实例非常简单。这里建议你使用类路径卜的资源文件来配冒,但是你可以使用任意的 Reader实例,这个实例包括由文字形式的文件路径或URL形式的文件路径fle/来创建。 My Batis包含了一些工具类,称作为资源,这些工具类包含一些方法,这些方法使得从类路径或其它位置加载资源文件更加简单String resource ="org/mybatis/example/Configuration xml";Reader reader= Resources. getResourceAsReader(resource)islaPperew sqlSessionFactoryBuilder(). build(reader)iXML配置文件包含对 My Batis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。关于ⅹML配置文件的详细内睿可以在文档后白找到这里给出一个简单的示例< DOCTYPE confiquration PUBLIC -//mykatis. org//DTD Config 3.0//ENnhttp://mybatis.crg/dtd/mybatis-3-config.dtd"> > nappers>/configuration>当然,在ⅹML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分。要注意ⅫML头部的声明,需要用来验证XML文档正确性。 environment元素体中包含对事务管坦和连接池的环境配置。 mappers元素是包含所有 mapper(映射器)的列衣,这些 mapper的XML文件包含SQL代码和映射定义信息。不使用XML构建Sq| SessionFactory如果你喜欢从Java程序而不是ⅩM文件中直接创建配置实例,或创建你自己的配置构建器, My Batis也提供完整的配置类,提供所有从XML文件中加载配置信息的选项DataSource dataSource= BlogdacaSourceFactory getBlogDataSource()ifransactionfactory transactionFactory =newJabcTransactionFactory(Environment environmentnew Environment( deve l. ,transactionFactory, datasource)iConfiquration configuration new Confiquration(environment)ionfi ducation. addMapper(BlogMapper. cl ass)SylSessicnFactory sqlsessionFactcrynew SclSessionFactoryBuilder(). build(configuration)注意这种情况下配置是添加映射器类。映射器类是Java类,这些类包含SQL映射语句的注解从而避免了XML文件的依赖,ⅹML映射仍然在大多数高级映射(比如:嵌套Join块射)时需要。出于这样的原因,如果存在XML配置文件的话, My Batis将会自动查找和加载一个对等的ⅹML文件(这种情况下,基于类路径下的 Blog Mapper: class类的类名,那么 Blog Mapper. xml将会被加载)。后面我们会了解更多。从 SqIsession Factory中获取 Sqlsession现在,我们已经知道如何获取 SqlsessionFactory对象了,基于同样的启示,我们就可以获得 Sqlsession的实例了。 Sqlsession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以用 Sqlsession实例来直接执行已映射的SQL语句。例如SylSessicn session sqlMapper oper Session()try iBlogblog -(Blog session selectone('crg mybatis. example. BlogMapper selectBlog, 101)is finally tsession. close()这种方法起到的作用,和我们使用之前的 My Batis版木是相似的,现在有一种更简洁的方法。使用合理描述参数和SQL语句返回值的接口(比如 Blog Mapper:lass),这样现在就可以执行更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。例如SaI Sessicn session sql Session Factory. openSession()itry iBlogMapper mapper- session. getMapper(BlcgMapper class)iBlogblog- mapper. selectBlog(101)is finallysession. close()现在我们来探究一下这里到底执行了什么。探究已映射的SQL语句这里你也许想知道通过 Sqisession和 Mapper对象到底执行了什么操作。已映射的SQL语句是一个很大的主题,而且这个主题会贯穿本文档的大部分内容。为了给出一个宏观的概念,这里有一些示例。上面提到的任何一个小例,语句是通过XML或注解定义的。我们先来看看XML。使用基于XML的映射语言,在过去的几年中使得 MyBatis非常流行,它为 My Bat is提供所有的特性设置。如果你以前用过 My Batis,这个概念就应该很熟悉了,但是XML映射文件也有很多的改进,后面我们会详细来说。这里给出一个基于XML映射语句的示例,这些语句应该可以满足上述示例中 Sqlsession对象的调用。< DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3. 0//EN"Whttp://mybatis.crg/dtd/mybatis-3-mapper.dtd">select from Blog where id =fiid)mappe这个简单的例子中看起来有很多额外的东西,但是也相当简洁了。如果你喜欢,你可以在一个单独的XML映射文件中定义很多的映射语句,除XML头部和文档类型声明之外,你可以得到很多方便之处。在文件的剩余部分是很好的自我解释。在命名空间“ com. mybatis. example. Blog Mapper”中,它定义了一个名为“ select Blog”的映射语句,这样它允许你使用完全限定名“ org. mybatis. example. Blog Mapper. select Blog”来调用映射语句我们下面示例中所有的写法也是这样的。Blog blog -(Blog) session. selectororg. mybatis. example. BlogMapper selectBlcg", 101)i要注意这个使用完全限定名调用Java对象的方法是相似的,这样做是有原因的。这个命名可以直接映射相同命名空间卜的映射器类,使用一个名称,参数和返回值和凵映射的查询语句都一样的方法即可。这就允许你非常容易地调用映射器接口中的方法,这和你前面看到的是·样的,下面这个示例中它又出现了。BlogMapper mapper session, getMapper(BlogMapper classBlog blog- mapper. selectBlog(101)i第二种方式有很多的优点,首先它不是基于文字的,那就更安全了。第二,如果你的IDF有代码补全功能,那么你可以利用它来操纵已映射的SQL语句。第三,不需要强制类型转换,同时 Blog Mapper接口可以保持简洁,返回值类型很安全(参数类型也很安全)命名空间的一点注释命名空间在之前版本的 MyBatis中是可选项,非常混乱在使用上也没有帮助。现在,命名空间是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句。命名空间使得接口绑定成为可能,就像你看到的那样,如果之前不了解,那么现在你就会使用它们了,你应该按照下面给出示例的来练习,以免改变自己的想法。使用命名空间,并将它放在合适的Java包空间之下,这将会使你的代码变得简洁,在很长的时间内提高 My Batis的作用。命名解析:为了减少输入量, MyBatis对所有的命名配置元素使用如下的命名解析规则,包括语句,结果映射,缓存等直接查找完全限定名(比如“ com. mypac kage. MyMapper. selectAllThings”),如果发现就使用。短名称(比如“ selectAllThings”)可以用米引用任意含糊的对象。而如果有两个或两个以上的(比如“ com.foo. selectAllThings”和“com. bar. selectAllThings”),那么就会得到错诶报告,说短名称是含糊的,因此就必须使用完全限定名对 BlogMapper这样的映射器类来说,还有一个妙招。它们中间映射的语句可以不需要在ⅹML中来写,而可以使用Java注解米替换。比如,上面的ⅹML示例可以如下米替换package crc mybatis exampleipublic interface BlogMapper taSelect( seleCt from blog Where id t[id]")Blog selectBlog(int id)i}对于简单语句来说,使用注解代码会更加清晰,然而Java注解对于复杂语句来说就会混乱,应该限制使用。因此,如果你不得不做复杂的事情,那么最好使用ⅩML来映射语句。当然这也取决于你和你的项目团队的决定,看哪种更适合你来使用,还有以长久方式来使用映射语句的重要性。也就是说,不要将自己局限在一种方式中。你可以轻松地将注解换成XML映射语句,反之亦然。范围和生命周期理解我们目前已经讨论过的不同范围和生命周期类是很重要的。不正确的使用它们会导致严重的并发问题Sqlsession Factory Builder这个类可以被实例化,使用和丢弃。一旦你创建了 SqlsessionFactory后,这个类就不需要存在了。因此 Sqlsession Factory Builder实例的最佳范围是方法范制(也就是本地方法变量)。你可以重用 Sqlsession Factory Builder来创建多个 Sqlsession Factory实例,但是最好的方式是不需要保持它·直存在来保证所有ⅹML解析资源,因为还有更重要的事情要做Sqsessionfactory旦被创建, Sqisession Factory实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用 Sqlsession Factory的最佳实践是在应用程序运行期间不要重复创建多次。这样的作将被视为是非常糟糕的。因比 SqlsessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如 Google Guice或 Spring。这样的框架允许你创建支持程序米管理单例 Sqlsession factory的生命周期。Salsession每个线程都应该有它自己的 Sqlsession实例。 SqIsession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将 Sqlsession实例的引用放在个类的静态字段甚至是实例字段中。也绝不能将 Sqlsession实例的引用放在任何类型的管理范围中,比如 Serlvet架构中的 HLLpSession。如果你现在止用任意的web框架,要考虑SqIscssion放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTP请求你可以打廾了一个 Sqlsession,然后返回响应,就可以关闭它了。关闭 Session很重要,你应该确保使用 finally来关它。下面的示例就是一个确保 SqIscssion关闭的基本模式SqISessicn session- sqlSessionFactory openSession(// dc worky finally isession. close()在你的代码中一贯地使用这种模式,将会侏证所有数据库资源都正确地关闭(假设你没有通过你自己的连接关闭,这会给 MyBatis造成一种迹象表明你要自己管理连接资源)。映射器实例映射器是你创建绑定映射语句的接∏。映射器接∏的实例可以从 SqIsession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和 Sqisession是相同的。然而,呋射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和SqIscssion相似。你也许会发现,在这个水平上管理太多的资源的话会尖控。保持简单,将射器放在方法范围内。下面的示例就展示了这个实例:SalSessicn session- sqlSessionFactory opensession ()itry 1BlogMapper mapper session. getMapper(BlcgMapper class)i//dc worky finally isession. close()iXML映射配置文件My Balis的ⅩML配置文件包含了影响 My Balis行为甚深的设置和属性信息。XML文栏的高层级结构如下configuration配置properties属性settings设置type Aliases类型命名typcHandlcrs类型处理器objecLFactory对象工plugins插件environments环境environment环境变量transactionManager事务管理器● dala Source数据源●映射器properties这些是外部化的,可替代的属性,这些属性也可以配置在典型的Java属性配置文件中,或者通过 properties元素的了元素来传递。例如 property name=password" value=F2Fa3! 33TYyg/>< /properties>其中的属性就可以在整个酉置文件中使用,使用叮替换的属性来实现动态配置。比如:property name="driver value=driver"7> property name="password" value="sipasswcrd]"/> 这个例子中的 username和 password将会由 properties元素中设置的值来替换。 driver和um属性将会从包含进来的 config. propcrtics文件山的值来替换。这里提供很多配置的选项属性也可以被传递到 Sqlsession Builder: builde()方法中。例如:SylSessicnFactory factorysalSessionFactoryBuilder. buila(reader, props)iorsaIsessicnFactory factorysqlSessionFactoryBuilder. build(reader, environment props)如果在这些地方,属性多于一个的话, My Batis按照如下的顺序加载它们在 properties元素体内指定的属性首先被读取。
用户评论