能发这个给我吗,风流相师txt全集下载龙生下载.谢谢了

mybatis+insert+返回主键id
mybatis+insert+返回主键id
以下内容已过滤百度推广
mybatis中insert中返回主键id的方法分类:mysql (21213) (2) 1、xyzmapper.xml &insertid=“dosomething&parametertype=&map&usegeneratedkeys=&true&keyproperty=“...&&普通
在使用mybatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能针对sequence...&&普通
日&-&需求:使用mybatis往mysql数据库中插入一条记录后,需要返回该条记录的自增主键值。
方法:在mapper中指定keyproperty属性,示例如下: &insert id=&ins...&&普通
日&-&但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前sql语句影响的行数。。。 接下来,我们看看mybatis如何在使用mysql和...&&普通
使用mybatis插入记录后返回该记录id... 摘要: 使用mybatis插入记录后返回该记录id
mybatis insert语句书写 &insert id=&insertselective& usegeneratedkeys=&true& keyp...&&普通
最佳答案: 设置一个实体类,有一个成员变量,id insert标签里有一个属性usegeneratedkeys=&true&; 然后插入。 调用实体类getid();获得id 这是我常用的方法,也可以...&&百度知道
日&-&1.修改mybatis xml
insert into test (name) values (#{name}) usegeneratedkeys=true :设置是否使用jdbc的getgenereatedkeys方法获取主键并...&&普通
日&-&需求:使用mybatis往mysql数据库中插入一条记录后,需要返回该条记录的自增主键值。 方法:在mapper中指定keyproperty属性,示例如下: &insert id=&insert...&&普通
日&-&mybatis insert 插入的主键
xml代码: &insert id=&insertsystem& parametertype=&com.uniquedu.bean.uniquedusystemnamebean& usegeneratedkeys=&tru...&&普通
日&-&在插入数据到数据库时,很多时候都需要把其主键返回,这里就说一下mybatis是怎么...&insert id=&insert& parametertype=&com.yitop.admin.domain.user& ...&&普通
11:42&&&&4784746
mybatis中更新时数据库中原来值加上传入参数
15:39&&&&5702041
求解答mybatis 存储过程多个结果集
12:38&&&&9100689
李兴华mybatis视频下载mybatis中的不同的namespace下面,为什么不能定义相同的id
mybatis中的不同的namespace下面,为什么不能定义相同的id
mapper.xml 1
&mapper namespace="customer"&
&select id="select_by_id"&&/select&
mapper.xml 2
&mapper namespace="user"&
&select id="select_by_id"&&/select&
不同的xml文件,不同的namespace, 都定义了一个相同的id,请问,这样为什么不行
Caused by: java.lang.IllegalArgumentException: selectAccountById is ambiguous in Mapped Statements collection (try using the full name including the namespace, or rename one of the entries)
at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:835)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:665)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:658)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:119)
... 49 more
xml像那样写本身没有问题,问题来自你调用的那里对不对
引用来自“青苗”的评论
命名空间与 Mapper 接口对应例如:
&?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="com.baomidou.mapper.customerMapper"&
&select id="select_by_id"&&/select&
推荐使用 mybatis-plus 简化开发
引用来自“西夏一品堂”的评论请问,这个namespace到底是干啥的,有什么用?
你也说了:mybatis 会根据接口方法执行对应 xml 配置。
那为什么我随便填写,也没有问题?
--- 共有 1 条评论 ---
没有问题那你为什么会报错呢? 想知道为什么要这么配置就去 看 mybatis 的源码
可以。楼上已经解答过你的错误了
引用来自“青苗”的评论
命名空间与 Mapper 接口对应例如:
&?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="com.baomidou.mapper.customerMapper"&
&select id="select_by_id"&&/select&
推荐使用 mybatis-plus 简化开发
请问,这个namespace到底是干啥的,有什么用?
--- 共有 1 条评论 ---
namespace 理解为 dao 层接口类映射
id 为接口方法名,调用mybatis 会根据接口方法执行对应 xml 配置
命名空间与 Mapper 接口对应例如:
&?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="com.baomidou.mapper.customerMapper"&
&select id="select_by_id"&&/select&
推荐使用 mybatis-plus 简化开发
引用来自“筱恕”的评论id需要映射java接口方法名称不同的接口可以有相同的方法,但是,不同的namespace为啥不能有相同的id
id需要映射java接口方法名称MyBatis3 用户指南(附JavaDB实例)
MyBatis 3用户指南 V 1.0罗利辉 译
关于从本文档复制代码的警告其实,这不是一个什么法律警告,这仅仅是一个提示。现代文字处理器做了出色 的工作,以非常优美的方式使文本具有可读性和具有良好格式化。然而,有时看起来 是一个您完全想要的代码示例,也往往完全毁于插入了特殊字符。 “引号”和连字符 就是一个很好的例子,在文档中看到引号和连字符,拷贝到 IDE 或编辑器中却不能很 好工作,至少不是您期望的方式。 因此,阅读这份文档指南并享受它,希望它有助于您。当您拷贝的代码来自本文 档代码示例时,最好找出附带下载的例子(包括单元测试等),或是网站或邮件列表 的例子。如何更好地使用本文档…如果您发现这个文档存在任何不足,或者缺少了对某个特性的描述,最好的方式是先 学习它,然后自己写一份文档。 我们接受公众撰写的文档,并通过下列网址上传: /confluence/oss/display/IBATIS/Contribute+Documentatio n 如果您的文档写的很棒,人们将会喜欢您并阅读您的文档!关于本文本文是《MyBatis3 用户指南》中文版,为学习与研究从《MyBatis-3-User-Guide》翻译而 来,仅供大家参考,最权威的应以官方英文文档为准。如果发现翻译有错误,欢迎指正,请发送 邮件到 lihui.。谢谢。 翻译过程中,直接对英文版进行了勘误,或者添加了一些帮助理解的注释。同时,文档最后 也增加了几节附录的内容,希望对学习 MyBatis3有用。 本文翻译的内容可任意复制、传播和使用。 ContentsMyBatis 是什么?.............................................................................................................................6 准备开始........................................................................................................................................ 6 从 XML 中创建 SqlSessionFactory 实例.................................................................................... 6 如何不使用 XML 来创建 SqlSessionFactory................................................................................7 从 SqlSessionFactory 获取 SqlSession .................................................................................... 7 探索映射 SQL 语句...................................................................................................................... 8 关于命名空间.......................................................................................................................... 9 作用域和生命周期.................................................................................................................... 10 Mapper XML 配置...........................................................................................................................11 properties 元素....................................................................................................................... 12 Settings 元素...........................................................................................................................13 typeAliases 元素..................................................................................................................... 14 typeHandlers 元素................................................................................................................... 15 objectFactory 元素..................................................................................................................16 Plugins 元素............................................................................................................................ 17 Environments 元素................................................................................................................... 18 事务管理器............................................................................................................................20 dataSource 元素................................................................................................................... 21 Mappers 元素............................................................................................................................ 23 SQL 映射 XML 文件...................................................................................................................... 23 Select 元素.............................................................................................................................. 24 Insert、 update、 delete 元素..............................................................................................25 Sql 元素....................................................................................................................................28 MyBatis 3 - User Guide 参数(Parameters).................................................................................................................28 resultMap 元素......................................................................................................................... 30 高级结果映射........................................................................................................................ 32 id, result 元素................................................................................................................... 34 支持的 JDBC 类型...................................................................................................................35 Constructor 元素..................................................................................................................35 Association 元素..................................................................................................................36 Collection 元素................................................................................................................... 40 Discriminator 元素.............................................................................................................. 42 Cache 元素................................................................................................................................ 43 cache-ref 元素......................................................................................................................... 46 动态 SQL(Dynamic SQL)............................................................................................................ 46 if 元素..................................................................................................................................... 46 choose, when, otherwise 元素................................................................................................47 trim, where, set 元素............................................................................................................ 48 Foreach 元素............................................................................................................................ 50 Java API...................................................................................................................................... 52 目录结构...................................................................................................................................52 SqlSessions ............................................................................................................................. 53 SqlSessionFactoryBuilder .................................................................................................. 53 SqlSessionFactory ............................................................................................................... 55 SqlSession ............................................................................................................................57 SelectBuilder ............................................................................................................................. 64 SqlBuilder ...................................................................................................................................67 结束语.......................................................................................................................................... 69 4 MyBatis 3 - User Guide 附录 1 对象模型...........................................................................................................................70 附录 2 创建数据库........................................................................................................................ 73 附录 3 MyBatis 实例.................................................................................................................... 77 ? ? ? ? ? ? ? ? 简单 select ........................................................................................................................77 update,delete,insert ...................................................................................................84 自动生成主键.....................................................................................................................85 处理 NULL 值.......................................................................................................................87 使用接口映射类................................................................................................................. 88 使用 Constructor 元素...................................................................................................... 90 使用 Association 元素...................................................................................................... 92 使用 Collection 元素...................................................................................................... 100附录 4 XML 中的特殊字符........................................................................................................... 1045 MyBatis 3 - User GuideMyBatis 是什么?MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消 除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的 XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到 数据库中的记录。准备开始所有的 MyBatis 应用都以 SqlSessionFactory 实例为中心。SqlSessionFactory 实例通过 SqlSessionFactoryBuilder 来获得,SqlSessionFactoryBuilder 能够从 XML 配置文件或者通过自 定义编写的配置类(Configuration class),来创建一个 SqlSessionFactory 实例。从 XML 中创建 SqlSessionFactory 实例从 XML 中创建 SqlSessionFactory 实例非常简单。建议您使用类资源路径(classpath resource)来加载配置文件,但是您也能够使用任何方式,包括文本文件路径或者以 file:// 开 头 URL 的方式。MyBatis 包括一个叫做 Resources 的工具类(utility class),其中包含了一系 列方法,使之能简单地从 classpath 或其它地方加载配置文件。String resource = &org/mybatis/example/Configuration.xml&; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader);XML 配置文件包含 MyBatis 框架的核心设置,包括获取数据库连接的 DataSource 实例,和包 括决定事务作用域范围和控制的事务管理等。您将能够在后面的章节中找到详细的 XML 配置,在 这里我们先展示一个简单的例子:&?xml version=&1.0& encoding=&UTF-8& ?& &!DOCTYPE configuration PUBLIC &-//mybatis.org//DTD Config 3.0//EN& &http://mybatis.org/dtd/mybatis-3-config.dtd&& &configuration& &environments default=&development&& &environment id=&development&& &transactionManager type=&JDBC&/& &dataSource type=&POOLED&& &property name=&driver& value=&${driver}&/& &property name=&url& value=&${url}&/& &property name=&username& value=&${username}&/& &property name=&password& value=&${password}&/& &/dataSource& &/environment& &/environments&6 MyBatis 3 - User Guide&mappers& &mapper resource=&org/mybatis/example/BlogMapper.xml&/& &/mappers& &/configuration&虽然 XML 配置文件中还有很多其它的配置细节,但是,上面的示例显示了最重要的部分。注 意 XML 配置文件的头部,会使用 DTD 验证文档来验证该 XML 配置文件。body 部分的 environment 元素,包含了事务管理和连接池配置。Mappers 元素指定了映射配置文件--包含 SQL 语句和映射 定义的 XML 文件。如何不使用 XML 来创建 SqlSessionFactory如果您喜欢直接通过 java 代码而不是通过 XML 创建配置选项,或者想创建您自己的配置生成 器。MyBatis 提供了一个完整的配置类(Configuration class),它提供了与 XML 文件相同的配 置选项。TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment(&development&, transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(BlogMapper.class); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);请注意,这种方式下的配置添加一个映射类(mapper class)。映射类是包含 SQL 映射注解 的 Java 类,从而避免了使用 XML。但是,由于注解的一些局限性以及 MyBatis 映射的复杂性, XML 仍然是一些高级的映射功能(如嵌套连接映射,Nested Join Mapping)所必须的方式。基于 这个原因,如果存在 XML 文件,MyBatis 自动寻找并加载这个 XML 文件。在这种情况下, BlogMapper.xml 将会被类路径下名称为 BlogMapper.class 的类加载。详述请见后面章节。从 SqlSessionFactory 获取 SqlSession现在您已经创建了一个 SqlSessionFactory(指上面的 sqlMapper),正如它名字暗示那样, 您可以通过它来创建一个 SqlSession 实例。SqlSession 包含了所有执行数据库 SQL 语句的方 法。您能够直接地通过 SqlSession 实例执行映射 SQL 语句。例如:SqlSession session = sqlMapper.openSession(); try { Blog blog = (Blog) session.selectOne( &org.mybatis.example.BlogMapper.selectBlog&, 101); } finally { session.close();} 虽然这种方法很有效,MyBatis 以前版本的用户对此也可能很熟悉,但现在有一个更简便的 方式,那就是对给定的映射语句,使用一个正确描述参数与返回值的接口(如 BlogMapper.class),您就能更清晰地执行类型安全的代码,从而避免错误和异常。 如:7 MyBatis 3 - User GuideSqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); } finally { session.close();} 现在,让我们一起探索它们究竟是如何执行的。探索映射 SQL 语句此时,您可能想知道 SqlSession 或者映射器类(Mapper class)是怎样执行的。映射 SQL 语句是一个很大的主题,该主题将可能占据本文档的大部分内容。但是,为了让您看到它是怎样 运行的,这里举两个例子。 在上面的例子中,映射语句已经在 XML 配置文件或注解中定义。让我们首先来看看 XML 配置 文件,所有 MyBatis 提供的功能特性都可以通过基于 XML 映射配置文件配置来实现。如果您以前 使用过 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 声明,但该文件余下的部分 是自解(self explanatory,可理解为不加解释就能明白)的。它定义了映射语句的名称 “selectBlog”,在命名空间“org.mybatis.example.BlogMapper”,允许您通过指定完整类名 “org.mybatis.example.BlogMapper”来访问上面的例子:Blog blog = (Blog) session.selectOne( &org.mybatis.example.BlogMapper.selectBlog&, 101);这非常类似 java 中通过完整类名来调用方法,而这样做是有原因的。这个名称可以直接映射 到一个具在相同命名空间的映射类,这个映射类有一个方法的名称、参数及返回类型都与 select 映射语句相匹配。正如您前面看到的,这使您很简单地调用映射类里的方法,下面是另外的一个 例子:8 MyBatis 3 - User GuideBlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101);第二种方法有很多好处。第一,它不依赖于字符串,所以更安全。第二,如果您的 IDE 有自 动完成功能,您可以利用这功能很快导航到您的映射 SQL 语句。第三,您不需要关注返回类型, 不需要进行强制转换,因为使用 BlogMapper 接口已经限定了返回类型,它会安全地返回。关于命名空间? 命名空间:在以前的版本中是可选的、复杂的且没多大用处。但在这个版本中,命名空间是必 须的,并且不仅仅是简单地使用完整类名来隔离区分语句。 正如您看到的那样,命名空间能够进行接口绑定,即使您认为现在不会使用到它,但您应该 按照这些准则来做。一旦使用了命名空间并且放入适当的 java 包命名空间中将会使您的代码清 晰,并提高 MyBatis 的长期可用性。 ? 名称解析: 为了减少大量地输入, MyBatis 对所有的配置元素,包括 statements、result maps、 caches 等使用下面的名称解析规则: ? 完整类名 :(例如: “com.mypackage.MyMapper.selectAllThings”)可用来直接查找并 使用。 短名称: (例如: “selectAllThings”)可用来引用明确的实体对象。但是,如果出现有 两个或更多(例如“com.foo.selectAllThings 和 com.bar.selectAllThings”)实体对 象,您将收到一个错误报告(短名称含糊不清),因此,这时就必须使用完整类名。?对映射类还有一个更好的方法,就像前面的 BlogMapper。它们的映射语句不需要完全在 XML 中配置。相反,它们可以使用 Java 注解。例如上面的 XML 配置可以替换为:package org.mybatis. public interface BlogMapper { @Select(&SELECT * FROM blog WHERE id = #{id}&) Blog selectBlog(int id); }对简单的映射语句,使用注解可以显得非常地清晰。但是 java 注解本身的局限难于应付更复 杂的语句。如果您准备要做某些复杂的事情,最好使用 XML 文件来配置映射语句。9 MyBatis 3 - User Guide 这将由您和您的项目小组来确定哪种方式是适合的,以一致的方式来定义映射语句是非常重 要的。也就是说,您不会被限于仅用一种方式。您能够非常容易地从基于注解的映射语句移植到 XML 配置文件中,反之亦然。作用域和生命周期理解到目前为止所讨论的类的作用域和生命周期是非常重要的。如果使用不当可导致严重的 并发性问题。SqlSessionFactoryBuilder这个类可以在任何时候被实例化、使用和销毁。一旦您创造了 SqlSessionFactory 就不需要 再保留它了。所以 SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法 变量)。您能重用 SqlSessionFactoryBuilder 创建多个 SqlSessionFactory 实例,但最好不要把 时间、资源放在解析 XML 文件上,而是要从中解放出来做最重要事情。SqlSessionFactory一旦创建,SqlSessionFactory 将会存在于您的应用程序整个运行生命周期中。很少或根本 没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建 SqlSessionFactory。 这样做会被视为“没品味”。所是 SqlSessionFactory 最好的作用域范围是一个应用的生命周期 范围。这可以由多种方式来实现,最简单的方式是使用 Singleton 模式或静态 Singleton 模式。 但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像 Google Guice 或 Spring 的依赖注 入方式。这些框架允许您创造一个管理器,用于管理 SqlSessionFactory 的生命周期。SqlSession每个线程都有一个 SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全 的。因此最好的作用域是 request 或者 method。决不要用一个静态字段或者一个类的实例字段来 保存 SqlSession 实例引用。也不要用任何一个管理作用域,如 Servlet 框架中的 HttpSession, 来保存 SqlSession 的引用。如果您正在用一个 WEB 框架,可以把 SqlSession 的作用域看作类似 于 HTTP 的请求范围。也就是说,在收到一个 HTTP 请求,您可以打开一个 SqlSession,当您把 response 返回时,就可以把 SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一 个 finally 块中被关闭。SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }10 MyBatis 3 - User Guide 在您的代码里都使用这一模式将保证所有的数据库资源被正确地关闭(假如您没有把您自己 的数据库连接传递给 MyBatis 管理,这就对 MyBatis 表明您希望自己管理连接)。Mapper 实例Mappers 是创建来绑定映射语句的接口,该 Mapper 实例是从 SqlSession 得到的。因此,所 有 mapper 实例的作用域跟创建它的 SqlSession 一样。但是,mapper 实例最好的作用域是 method,也就是它们应该在方法内被调用,使用完即被销毁。并且 mapper 实例不用显式地被关 闭。虽然把 mapper 实例保持在一个 request 范围(与 SqlSession 相似)不会产生太大的问题, 但是您可能会发现,在这个层次上管理太多资源可能会失控。保持简单,就是让 Mappers 保持在 一个方法内。下面的例子演示了这种做法。SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }Mapper XML 配置MyBatis 的 XML 配置文件包含了设置和影响 MyBatis 行为的属性。XML 配置文件的层次结构如 下: ? configuration o o o o o o o properties settings typeAliases typeHandlers objectFactory plugins environments ? environment ? ? transactionManager dataSource11 MyBatis 3 - User Guide o mappersproperties 元素它们都是外部化,可替代的属性。可以配置在一个典型的 Java 属性文件中,或者通过 properties 元素的子元素进行配置。例如:&properties resource=&org/mybatis/example/config.properties&& &property name=&username& value=&dev_user&/& &property name=&password& value=&F2Fa3!33TYyg&/& &/properties& &/properties&在整个配置文件中,这些属性能够被可动态替换(即使用占位符)的属性值引用,例如:&dataSource &property &property &property &property type=&POOLED&& name=&driver& value=&${driver}&/& name=&url& value=&${url}&/& name=&username& value=&${username}&/& name=&password& value=&${password}&/&&/dataSource& 示例中的 username 和 password 将会被替换为配置在 properties 元素中的相应值。driver 和 url 属性则会被 config.properties 文件中的相应值替换。这里提供了大量的配置选项。 这些属性也可以传递给 sqlSessionFactoryBuilder.build()方法。例如:SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, props); // ... or ... SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment, props);如果一个属性存在于多个地方,MyBatis 将使用下面的顺序加载: ? ? 首先读入 properties 元素主体中指定的属性。 然后会加载类路径或者 properties 元素中指定的 url 的资源文件属性。它会覆盖前面已 经读入的重复属性。 通过方法参数来传递的属性将最后读取(即通过 sqlSessionFactoryBuilder.build),同样也 会覆盖从 properties 元素指定的和 resource/url 指定的重复属性。?因此最优先的属性是通过方法参数来传递的属性,然后是通过 resource/url 配置的属性,最 后是在 MyBatis 的 Mapper 配置文件中,properties 元素主体中指定的属性。12 MyBatis 3 - User GuideSettings 元素Setting 元素下是些非常重要的设置选项,用于设置和改变 MyBatis 运行中的行为。下面的 表格列出了 Setting 元素支持的属性、默认值及其功能。 设置选项 cacheEnabled lazyLoadingEnabled aggressiveLazyLoading 描述 全局性地启用或禁用所有在 mapper 配 置文件中配置的缓存。 全局性地启用或禁用延迟加载。当禁用 时,所有关联的配置都会立即加载。 当启用后,一个有延迟加载属性的对象 的任何一个延迟属性被加载时,该对象 的所有的属性都会被加载。否则,所有 属性都是按需加载。 允许或禁止从单一的语句返回多个结果 集(需要驱动程序兼容)。 使用列的标签而不是列的名称。在这方 面,不同的驱动程序可能有不同的实 现。参考驱动程序的文档或者进行测试 来确定您所使用的驱动程的行为 允许 JDBC 自动生成主键。需要驱动程 序兼容。如果设置为 true 则会强行自 动生成主键,然而有些则不会自动生成 主键(驱动程序不兼容),但依旧会工 作(如 Derby)。 指定 MyBatis 是否以及如何自动将列映 射到字段/属性。 PARTIAL: 只是自动映射简单、非嵌套 的结果集。 FULL: 将会自动映射任何复杂的(嵌套 或非嵌套)的结果集。 配置默认的执行器(executor)。 SIMPLE :简单的执行器。 REUSE :重用 prepared statements 的 执行器。 BATCH:重用 statements 并且进行批量 更新的执行器。 设置查询数据库超时时间。 可用值 true | false true | false true | false 默认值 true true truemultipleResultSetsEnabled useColumnLabeltrue | false true | falsetrue trueuseGeneratedKeystrue | falseFalseautoMappingBehaviorNONE, PARTIAL, FULLPARTIALdefaultExecutorTypeSIMPLE REUSE BATCHSIMPLEdefaultStatementTimeout任何正整数Not Set (null)一个 Settings 元素完整的配置例子如下:&settings& &setting name=&cacheEnabled& value=&true&/& &setting name=&lazyLoadingEnabled& value=&true&/&13 MyBatis 3 - User Guide&setting name=&multipleResultSetsEnabled& value=&true&/& &setting name=&useColumnLabel& value=&true&/& &setting name=&useGeneratedKeys& value=&false&/& &setting name=&enhancementEnabled& value=&false&/& &setting name=&defaultExecutorType& value=&SIMPLE&/& &setting name=&defaultStatementTimeout& value=&25000&/& &/settings&typeAliases 元素别名是一个较短的 Java 类型的名称。这只是与 XML 配置文件相关联,减少输入多余的完整类 名。例如:&typeAliases& &typeAlias alias=&Author& type=&domain.blog.Author&/& &typeAlias alias=&Blog& type=&domain.blog.Blog&/& &typeAlias alias=&Comment& type=&ment&/& &typeAlias alias=&Post& type=&domain.blog.Post&/& &typeAlias alias=&Section& type=&domain.blog.Section&/& &typeAlias alias=&Tag& type=&domain.blog.Tag&/& &/typeAliases&在这个配置中,您就可以在想要使用&domain.blog.Blog&的地方使用别名“Blog”了。 对常用的 java 类型,已经内置了一些别名支持。这些别名都是不区分大小写的。注意 java 的基本数据类型,它们进行了特别处理,加了“_”前缀。 别名 _byte _long _short _int _integer _double _float _boolean string Byte Long short Int integer double Float boolean Date decimal 对应的 java 类型 byte long short int int double float boolean String Byte Long Short Integer Integer Double Float Boolean Date BigDecimal14 MyBatis 3 - User Guide bigdecimal object Map hashmap List arraylist collection iterator BigDecimal Object Map HashMap List ArrayList Collection IteratortypeHandlers 元素每当 MyBatis 设置参数到 PreparedStatement 或者从 ResultSet 结果集中取得值时,就会使 用 TypeHandler 来处理数据库类型与 java 类型之间转换。下表描述了默认的 TypeHandlers。 Type Handler BooleanTypeHandler ByteTypeHandler ShortTypeHandler IntegerTypeHandler LongTypeHandler FloatTypeHandler DoubleTypeHandler BigDecimalTypeHandler StringTypeHandler ClobTypeHandler NStringTypeHandler NClobTypeHandler ByteArrayTypeHandler BlobTypeHandler DateTypeHandler DateOnlyTypeHandler TimeOnlyTypeHandler SqlTimestampTypeHandler SqlDateTypeHadler SqlTimeTypeHandler ObjectTypeHandler EnumTypeHandler Java Types Boolean, boolean Byte, byte Short, short Integer, int Long, long Float, float Double, double BigDecimal String String String String byte[] byte[] Date (java.util) Date (java.util) Date (java.util) Timestamp (java.sql) Date (java.sql) Time (java.sql) Any Enumeration Type JDBC Types 任何兼容的 BOOLEAN 任何兼容的 NUMERIC 或 BYTE 任何兼容的 NUMERIC 或 SHORT INTEGER 任何兼容的 NUMERIC 或 INTEGER 任何兼容的 NUMERIC 或 LONG INTEGER 任何兼容的 NUMERIC 或 FLOAT 任何兼容的 NUMERIC 或 DOUBLE 任何兼容的 NUMERIC 或 DECIMAL CHAR, VARCHAR CLOB, LONGVARCHAR NVARCHAR, NCHAR NCLOB 任何兼容的 byte stream type BLOB, LONGVARBINARY TIMESTAMP DATE TIME TIMESTAMP DATE TIME OTHER, or unspecified VARCHAR C任何与 string 兼容的类型,储存 的是编码而不是索引。15 MyBatis 3 - User Guide 您能够重写类型处理器(type handlers),或者创建您自己的类型处理器去处理没有被支持 的或非标准的类型。要做到这一点,只要实现 TypeHandler 接口(org.mybatis.type),并且将您 的 TypeHandler 类映射到 java 类型和可选的 JDBC 类型即可。例如:// ExampleTypeHandler.java public class ExampleTypeHandler implements TypeHandler { public void setParameter( PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, (String) parameter); } public Object getResult( ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } public Object getResult( CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } } // MapperConfig.xml &typeHandlers& &typeHandler javaType=&String& jdbcType=&VARCHAR& handler=&org.mybatis.example.ExampleTypeHandler&/&&/typeHandlers& 使用上面的 TypeHandler 将会重写已经存在的用来处理 java 的 String 属性、VARCHAR 参数 和结果集的类型处理器。注意,MyBatis 并不会通过数据库的元数据来确认类型,所以您必须指 定它的一个类型处理器,用于将 VARCHAR 字段的参数和结果映射到正确的类型上。这是因为 MyBatis 在语句的执行之前都不知道它要处理的数据类型是什么。objectFactory 元素MyBatis 每次创建一个结果对象实例都会使用 ObjectFactory 实例。使用默认的 ObjectFactory 与使用默认的构造函数(或含参数的构造函数)来实例化目标类没什么差别。如 果您想重写 ObjectFactory 来改变其默认行为,那您能通过创造您自己的 ObjectFactory 来做 到。看下面的例子:// ExampleObjectFactory.java public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(16 MyBatis 3 - User GuideClass type, List&Class& constructorArgTypes, List&Object& constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } } // MapperConfig.xml &objectFactory type=&org.mybatis.example.ExampleObjectFactory&& &property name=&someProperty& value=&100&/& &/objectFactory&ObjectFactory 接口非常简单,它包含两个 create 的方法,一个是默认构造器,还有一个是 含参数的构造器。最后的 setProperties 方法用来配置 ObjectFactory。在初始化您自己的 ObjectFactory 实例之后,定义在 objectFactory 元素主体中的属性会以参数的形式传递给 setProperties 方法。Plugins 元素MyBatis 允许您在映射语句执行的某些点拦截方法调用。默认情况下,MyBatis 允许插件 (plug-ins)拦截下面的方法: ? Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (handleResultSets, handleOutputParameters) StatementHandler (prepare, parameterize, batch, update, query)???通过寻找完整的方法特征能够发现这些类方法的细节,以及在每个 MyBatis 发布版本中的源 代码中找到。假如您要做的不仅仅是监视方法的调用情况,您就应该清楚您将重写的方法的行为 动作。如果您试图修改或者重写给定的方法,您很可能会改变 MyBatis 的核心行为。这些都是比 较底层的类和方法,所以要小心使用插件。// ExamplePlugin.java @Intercepts({@Signature( type= Executor.class, method = &update&,17 MyBatis 3 - User Guideargs = {MappedStatement.class,Object.class})}) public class ExamplePlugin implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties) { } } // MapperConfig.xml &plugins& &plugin interceptor=&org.mybatis.example.ExamplePlugin&& &property name=&someProperty& value=&100&/& &/plugin& &/plugins&上面定义的插件将会拦截所有对 Executor 实例 update 方法的调用。Executor 实例是一个负 责底层映射语句执行的内部对象。 重写配置类(Configuration Class) 除了能用插件方式修改 MyBatis 的核心行为,您也可以完全重写配置类(Configuration Class)。简单地扩展它和重写内部的任何方法,然后作为参数传递给 sqlSessionFactoryBuilder.build(myConfig)方法。再次提醒,这可能对 MyBatis 行为产生严重 影响,因此要小心。Environments 元素MyBatis 能够配置多套运行环境,这有助于将您的 SQL 映射到多个数据库上。例如,在您的 开发、测试、生产环境中,您可能有不同的配置。或者您可能有多个共享同一 schema 的生产用数 据库,或者您想将相同的 SQL 映射应用到两个数据库等等许多用例。 但是请记住:虽然您可以配置多个运行环境,但是每个 SqlSessionFactory 实例只能选择一 个运行环境。 因此,如果您想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,一个数据库对 应一个 SqlSessionFactory 实例。如果是三个数据库,那就创建三个实例,如此类推。这真的非 常容易记住: ? 每个数据库对应一个 SqlSessionFactory 实例。 要指定哪个运行环境被创建,只需要简单地将运行环境作为可选参数传递给 SqlSessionFactoryBuilder,下面是两个接受运行环境的方法:18 MyBatis 3 - User Guide SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties); 如果环境参数被忽略,那默认的环境配置将被加载,如下面: SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties); environments 元素定义了运行环境是怎么配置的:&environments default=&development&& &environment id=&development&& &transactionManager type=&JDBC&& &property name=&...& value=&...&/& &/transactionManager& &dataSource type=&POOLED&& &property name=&driver& value=&${driver}&/& &property name=&url& value=&${url}&/& &property name=&username& value=&${username}&/& &property name=&password& value=&${password}&/& &/dataSource& &/environment& &/environments&注意这里关键的部分: ? 默认的运行环境 ID,引用一个已经定义好的运行环境 ID(例如: default=“development”) 每个定义的运行环境 ID(例如:id=“development”) 事务管理器配置(例如: type=“JDBC”) 数据源配置(例如:type=“POOLED”)? ? ?默认的环境和环境 ID 是自解(self explanatory)的,只要您喜欢,就可以随意取一个名 字,只要确保默认的运行环境引用一个已定义的运行环境就可以了。译者注: &environments default=&test&& &environment id=&development&& …… &/environment& &environment id=&production&&19 MyBatis 3 - User Guide…… &/environment& &environment id=&test&& …… &/environment& &/environments&上面例子中,&environments default=&test&&配置表明,目前使用的是 test 的运行环境。 当然,您也可以修改为使用 production 的运行环境:&environments default=&production&&。事务管理器MyBatis 有两种事务管理类型(即 type=”[JDBC|MANAGED]”): ? JDBC C 这个配置直接使用 JDBC 的提交和回滚功能。它依赖于从数据源获得连接来管理 事务的生命周期。 MANAGED C 这个配置基本上什么都不做。它从不提交或者回滚一个连接的事务。而是让 容器(例如:Spring 或者 J2EE 应用服务器)来管理事务的生命周期 。默认情况下,它 会关闭连接,但是一些容器并不会如此,因此,如果您需要通过关闭连接来停止事务,将 属性 closeConnection 设置为 false。例如:&transactionManager type=&MANAGED&& &property name=&closeConnection& value=&false&/& &/transactionManager&?这两个事务管理类型都不需要任何属性。然而它们都是类型别名,换句话说,您可以设置成 指向己实现了 TransactionFactory 接口的完整类名或者别名。public interface TransactionFactory { void setProperties(Properties props); Transaction newTransaction(Connection conn, boolean autoCommit); }实例化后,任何在 XML 文件配置的属性都将传递给 setProperties()方法。在您的实现中还 需要创建一个非常简单的 Transaction 接口的实现:public interface Transaction { Connection getConnection(); void commit() throws SQLE void rollback() throws SQLE void close() throws SQLE }20 MyBatis 3 - User Guide通过这两个接口,您能够完全自定义 MyBatis 如何来处理事务。dataSource 元素dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象源。? 大部分 MyBatis 应用都像上面例子那样配置一个数据源,但这不是必须的。需要认清的 是,只有使用了延迟加载才需要数据源。 MyBatis 内置了三种数据源类型 (如: type=”????”): UNPOOLED C 这个类型的数据源实现只是在每次需要的时候简单地打开和关闭连接。虽然有点 慢,但是对于不需要立即响应的简单的应用来说,不失为一种好的选择。不同的数据库在性能方 面也会有所不同,因此对于一些数据库,不使用连接池时,这个配置就是比较理想的。 UNPOOLED 数据源有四个配置属性: ? ? ? ? driver C 指定 JDBC 驱动器。 url C 连接数据库实例的 JDBC URL。 username C登陆数据库的用户名。 password - 登陆数据库的密码。? defaultTransactionIsolationLevel C 指定连接的默认事务隔离级别。 另外,您也可以通过在属性前加前缀“driver”的方式,把属性传递给数据库驱动器,例 如: ? driver.encoding=UTF8 这将会通过 DriverManager.getConnection(url, driverProperties) 方法,将值是 “UTF8”的属性“encoding”传递给数据库驱动器。 POOLED C 这个数据源的实现缓存了 JDBC 连接对象,用于避免每次创建新的数据库连接时都初始 化和进行认证,加快程序响应。并发 WEB 应用通常通过这种做法来获得快速响应。 另外,除了上面(UNPOOLED)的属性外,对 POOLED 数据源,还有很多属性可以设置。 ? poolMaximumActiveConnections C 在任何特定的时间内激活(能够被使用)的连接数 量,默认是 10。 poolMaximumIdleConnections C在任何特定的时间内空闲的连接数。?21 MyBatis 3 - User Guide ? poolMaximumCheckoutTime C 在连接池被强行返回前,一个连接能够“检出”的总时 间。默认是 20000ms(20 秒)。 poolTimeToWait C 这是一上比较底层的设置,如果连接占用了很长时间,能够给连接池 一个机会去打印日志,并重新尝试连接。默认是 20000ms(20 秒)。 poolPingQuery CPing Query 是发送给数据库的 Ping 信息,测试数据库连接是否良好 和是否准备好了接受请求。默认值是“NO PING QUERY SET”,让大部分数据库都不使用 Ping,返回一个友好的错误信息(译者注:MyBatis 通过向数据执行 SQL 语句来确定与数 据库连接状况)。 poolPingEnabled C 这是允许或者禁 ping query 的开关。如果允许,您同时也要用一 条可用的(并且应该是最高效的)SQL 语句来设置 poolPingQuery 属性的值。默认是: false(即禁止)。 poolPingConnectionsNotUsedFor C 这个属性配置执行 poolPingQuery 的间隔时间。通 常设置为与数据库连接的超时时间,来避免不必要的 pings 。默认是:0(允许所有连接 随时进行 ping 测试,当然只有 poolPingEnabled 设置为 true 才会生效)。????JNDI C 这个数据源的配置是为了准备与像 Spring 或应用服务器能够在外部或者内部配置数据 源的容器一起使用,然后在 JNDI 上下文中引用它。这个数据源只需配置两个属性: ? initial_context C 这个属性被用来从 InitialContext 中查找一个上下文。如: initialContext.lookup(initial_context) 这个属性是可选的,如果忽略,那么数据源就会直接从 InitialContext 中查找。 ? data_source C 这个属性是引用一个能够被找到的数据源实例的上下文路径。它会查找 根据 initial_context 从 initialContext 中搜寻返回的上下文。或者在 initial_context 没有提供的情况下直接在 InitialContext 中进行查找。 译者注: Context context = (Context) initialContext.lookup(initial_context);//返回 一个上下文 //Context context = (Context)initContext.lookup(&java:/comp/env&); DataSource ds = (DataSource) context.lookup(data_source); //返回一个数据源 Connection conn = ds.getConnection(); //DataSource ds = (DataSource)context.lookup(&jdbc/myoracle&);22 MyBatis 3 - User Guide 如果 initial_context 没有配置,那么数据源就会直接从 InitialContext 进行查 找,如: DataSource ds = (DataSource) initialContext.lookup(data_source);跟数据源的其它属性配置一样,可以通过在属性名前加“env.”的方式直接传递给 InitialContext。例如: ? env.encoding=UTF8 这将会把属性“encoding”及它的值“UTF8”在 InitialContext 实例化的时候传递给它的构 造器。Mappers 元素现在,MyBatis 的行为属性都已经在上面的配置元素中配置好了,接下来开始定义映射 SQL 语句。但首先,我们需要告诉 MyBatis 在哪里能够找到我们定义的映射 SQL 语句。在这方面, JAVA 自动发现没有提供好的方法,因此最好的方法是告诉 MyBatis 在哪里能够找到这些映射文 件。您可以使用类资源路径或者 URL(包括 file:/// URLs),例如:// Using classpath relative resources &mappers& &mapper resource=&org/mybatis/builder/AuthorMapper.xml&/& &mapper resource=&org/mybatis/builder/BlogMapper.xml&/& &mapper resource=&org/mybatis/builder/PostMapper.xml&/& &/mappers& // Using url fully qualified paths &mappers& &mapper url=&file:///var/sqlmaps/AuthorMapper.xml&/& &mapper url=&file:///var/sqlmaps/BlogMapper.xml&/& &mapper url=&file:///var/sqlmaps/PostMapper.xml&/& &/mappers&这些配置告诉 MyBatis 在哪里找到 SQL 映射文件。而其它的更详细的信息配置在每一个 SQL 映射文件里。这些将在下一章节里讨论。SQL 映射 XML 文件MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在。对于它的强大功能,SQL 映 射文件的配置却非常简单。如果您比较 SQL 映射文件配置与 JDBC 代码,您很快可以发现,使用 SQL 映射文件配置可以节省 95%的代码量。MyBatis 被创建来专注于 SQL,但又给您自己的实现极 大的空间。23 MyBatis 3 - User Guide SQL 映射 XML 文件只有一些基本的元素需要配置,并且要按照下面的顺序来定义(in the order that they should be defined): ? cache C在特定的命名空间配置缓存。 ? ? ? cache-ref C 引用另外一个命名空间配置的缓存. resultMap C 最复杂也是最强大的元素,用来描述如何从数据库结果集里加载对象。 parameterMap C 不推荐使用! 在旧的版本里使用的映射配置,这个元素在将来可能会被 删除,因此不再进行描述。 sql C 能够被其它语句重用的 SQL 块。 insert CINSERT 映射语句 update CUPDATE 映射语句 delete CDELEETE 映射语句 select CSELECT 映射语句? ? ? ? ?接下来的章节将会对每一个元素进行描述。Select 元素Select 是 MyBatis 中最常用的元素之一。除非您把数据取回来,否则把数据放在数据库是没 什么意义的,因此大部分的应用查询数据远多于修改数据。对每一次插入、修改、删除数据都可 能伴有大量的查询。这是 MyBatis 基本设计原则之一,也就是为什么把这么多的焦点和努力放在 查询和结果集映射上。对简单的查询,select 元素的配置是相当简单的,如:&select id=”selectPerson” parameterType=”int” resultType=”hashmap”& SELECT * FROM PERSON WHERE ID = #{id} &/select&这条语句叫做 selectPerson,以 int 型(或者 Integer 型)作为参数,并返回一个以数据库 列名作为键值的 HashMap。 注意这个参数的表示方法:#{id} 它告诉 MyBatis 生成 PreparedStatement 参数。对于 JDBC,像这个参数会被标识为“?”, 然后传递给 PreparedStatement,像这样:// Similar JDBC code, NOT MyBatis… String selectPerson = “SELECT * FROM PERSON WHERE ID=?”; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);当然,如果单独使用JDBC 去提取这个结果集并把结果集映射到对象上的话,则需要更多的代24 MyBatis 3 - User Guide 码,而这些,MyBatis 都已经为您做到了。关于参数和结果集映射,还有许多要学的,以后有专 门的章节来讨论。 select 语句有很多的属性允许您详细配置每一条语句。&select id=”selectPerson” parameterType=”int” parameterMap=”deprecated” resultType=”hashmap” resultMap=”personResultMap” flushCache=”false” useCache=”true” timeout=”10000” fetchSize=”256” statementType=”PREPARED” resultSetType=”FORWARD_ONLY” &Attribute id parameterType parameterMap resultTyperesultMapflushCache useCache timeout fetchSize statementTyperesultSetTypeDescription 在这个命名空间下唯一的标识符,可被其它语句引用 传给此语句的参数的完整类名或别名 不推荐使用。这个参数将来可能被删除。 语句返回值类型的完整类名或别名。注意,如果返回的是集合 (collections),那么应该是集合所包含的具体子类型,而不是集 合本身。resultType 与 resultMap 不能同时使用 引用的外部定义的 resultMap。结果集映射是 MyBatis 中最强大的特性,同时 又非常好理解。许多复杂的映射都可以轻松解决。resultType 与 resultMap 不能同时使用 如果设为 true,则会在每次语句调用的时候就会清空缓存。select 语句默认 设为 false 如果设为 true,则语句的结果集将被缓存,select 语句默认设为 false 设置超时时间,默认没有设置,由驱动器自己决定 设置从数据库获得记录的条数,默认没有设置,由驱动器自己决定 可设置为STATEMENT,PREPARED 或CALLABLE 中的任意一个,告诉MyBatis 分 别使用Statement,PreparedStatement或者CallableStatement。默认: PREPARED FORWARD_ONLY 、SCROLL_SENSITIVE 、SCROLL_INSENSITIVE 三个中的任意一 个。默认没有设置,由驱动器自己决定Insert、 update、 delete 元素数据修改语句 insert、update 和 delete 的配置使用都非常相似:&insert id=&insertAuthor& parameterType=&domain.blog.Author& flushCache=&true&25 MyBatis 3 - User GuidestatementType=&PREPARED& keyProperty=&& useGeneratedKeys=&& timeout=&20000&& &update id=&insertAuthor& parameterType=&domain.blog.Author& flushCache=&true& statementType=&PREPARED& timeout=&20000&& &delete id=&insertAuthor& parameterType=&domain.blog.Author& flushCache=&true& statementType=&PREPARED& timeout=&20000&&Attribute id parameterType parameterMap flushCacheDescription 在这个命名空间下唯一的标识符,可被其它语句引用。 传给此语句的参数的完整类名或别名。 不推荐使用,将来可能删除。 如果设为 true,则会在每次语句调用的时候就会清空缓存。select 语句默 认设为 false timeout 设置超时时间,默认没有设置,由驱动器自己决定。 statementType 可设置为 STATEMENT,PREPARED 或 CALLABLE 中的任意一个告诉 MyBatis 分 别使用 Statement,PreparedStatement 或者 CallableStatement。默认: PREPARED useGeneratedKeys (仅限 insert 语句时使用)告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方 法来获取数据库自动生成主键(如:MySQL、SQLSERVER 等关系型数据库会有 自增的字段)。默认:false keyProperty (仅限 insert 语句时使用)设置自动生成主键的字段,这个字段的值由 getGeneratedKeys 方法返回,或者由 insert 元素的 selectKey 子元素返 回。默认不设置。 下面是一些 insert、update 和 delete 语句例子。&insert id=&insertAuthor& parameterType=&domain.blog.Author&& insert into Author (id,username,password,email,bio) values (#{id},#{username},#{password},#{email},#{bio}) &/insert& &update id=&updateAuthor& parameterType=&domain.blog.Author&& update Author set username = #{username}, password = #{password},26 MyBatis 3 - User Guideemail = #{email}, bio = #{bio} where id = #{id} &/update& &delete id=&deleteAuthor” parameterType=&int&& delete from Author where id = #{id} &/delete&正如您看到,insert 元素有更多一些的扩展属性及子元素,允许您使用多种方式自动生成主 键。 首先,如果您使用的数据库支持自动生成主键(如:MySQL 和 SQL Server),那么您就可以 简单地将 useGeneratedKeys 设置为”true”,然后使用 keyProperty 设置您希望自动生成主键 的字段就可以了。例如,如果上面提到的 Author 表使用一个字段自动生成主键,那么配置语句就 可以修改为:&insert id=&insertAuthor& parameterType=&domain.blog.Author& useGeneratedKeys=”true” keyProperty=”id”& insert into Author (username,password,email,bio) values (#{username},#{password},#{email},#{bio}) &/insert&MyBatis 还有另外一种方式为不支持自动生成主键的数据库及 JDBC 驱动来生成键值。 下面展示一个能够随机生成 ID 的例子(也许您不会这么做,这仅仅是演示 MyBatis 的功 能):&insert id=&insertAuthor& parameterType=&domain.blog.Author&& &selectKey keyProperty=&id& resultType=&int& order=&BEFORE&& select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 &/selectKey& insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR} ) &/insert&在上面的例子中,selectKey 语句首先会执行,Author 表的 ID 首先会被设值,然后才会调用 insert 语句。这相当于在您的数据库中自动生成键值,不需要编写复杂的 java 代码。 selectKey 元素描述如下:&selectKey keyProperty=&id& resultType=&int&27 MyBatis 3 - User Guideorder=&BEFORE& statementType=&PREPARED&&Attribute keyProperty resultType orderstatementTypeDescription 设置需要自动生成键值的列。 结果类型,MyBatis 通常可以自己检测到,但这并不影响给它一个确切的类 型。MyBatis 允许使用任何基本的数据类型作为键值,也包括 String 类型。 可以设成 BEFORE 或者 AFTER,如果设为 BEFORE,那它会先选择主键,然后设 置 keyProperty,再执行 insert 语句;如果设为 AFTER,它就先执行 insert 语句再执行 selectKey 语句,像数据库如 Oracle 那样在 insert 语句中调用 内嵌的序列机制一样。 像前面一样, MyBatis 支持 STATEMENT、PREPARED 和 CALLABLE 语句类型, 分别对应 Statement, PreparedStatement 和 CallableStatement 。Sql 元素这个元素用来定义能够被其它语句引用的可重用 SQL 语句块。例如:&sql id=”userColumns”& id,username,password &/sql&这个 SQL 语句块能够被其它语句引用,如:&select id=”selectUsers” parameterType=”int” resultType=”hashmap”& select &include refid=”userColumns”/& from some_table where id = #{id} &/select&参数(Parameters)在前面的语句中,我们可以看到一些例子中简单的参数(用于代入 SQL 语句中的可替换变 量,如#{id})。参数是 MyBatis 中非常强大的配置属性,基本上,90%的情况都会用到,如:&select id=”selectUsers” parameterType=”int” resultType=”User”& select id, username, password from users where id = #{id} &/select&上面的例子演示了一个非常简单的命名参数映射,parameterType 被设置为“int”。参数可 以设置为任何类型。像基本数据类型或者像 Integer 和 String 这样的简单的数据对象,(因为没 有相关属性)将使用全部参数值。而如果传递的是复杂对象(一般是指 JavaBean),那情况就有 所不同。例如::&insert id=”insertUser” parameterType=”User” & insert into users (id, username, password)28 MyBatis 3 - User Guidevalues (#{id}, #{username}, #{password}) &/insert&如果参数对象 User 被传递给 SQL 语句,那么将会搜寻 PreparedStatement 里的 id,username 和 password 属性,并被 User 对象里相应的属性值替换。 这种传递参数到语句的方式非常优雅和简单。但参数映射还在很多特性。 首先,像 MyBatis 其它部分一样,参数可以指定许多的数据类型。#{property,javaType=int,jdbcType=NUMERIC}像 MyBatis 的其它部分一样,这个 javaType 是由参数对象决定,除了 HashMap 以外。然后 这个 javaType 应该确保指定正确的 TypeHandler 被使用。 ? Note:如果传递了一个空值,那这个JDBC Type 对于所有JDBC 允许为空的列来说是必须的。 您可以研读一下关于PreparedStatement.setNull()的JavaDocs 文档。 对于需要自定义类型处理,您也可以指定一个特殊的 TypeHandler 类或者别名,如:#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}当然,这看起来更加复杂了,不过,这种情况比较少见。 对于数据类型,可以使用 numericScale 来指定小数位的长度。#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}最后,mode属性允许您指定IN、 OUT 或 INOUT 参数。如果参数是OUT 或 INOUT,参数对象 属的实际值将会改变,正如您希望调用一个输出参数。如果mode=OUT (或者 INOUT),并且 jdbcType=CURSOR (如Oracle 的REFCURSOR),您必须指定一个resultMap映射结果集给这个参数类 型。注意这里的javaType 类型是可选的,如果为空值而jdbcType =CURSOR 的话,则会自动地设 给ResultSet。#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}MyBatis 也支持像 structs 这样高级的数据类型,但当您把 mode 设置为 out 的时候,您必须 把类型名告诉执行语句。例如:#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}29 MyBatis 3 - User Guide 尽管有这些强大的选项,但是大多数情况下您只需指定属性名,MyBatis 将会识别其它部分 的设置。最多就是给可以为 null 值的列指定 jdbcType:#{firstName} #{middleInitial,jdbcType=VARCHAR} #{lastName}字符串替换 默认的情况下,使用#{}语法会促使MyBatis 生成PreparedStatement并且安全地设置 PreparedStatement 参数(=?)值。尽量这是安全、快捷并且是经常使用的,但有时候您可能想 直接未更改的字符串代入到SQL 语句中。比如说,对于ORDER BY,您可以这样使用ORDER BY ${columnName}这样 MyBatis 就不会修改这个字符串了。 ? 警告: 这种不加修改地接收用户输入并应用到语句的方式,是非常不安全的。这使用户能够 进行SQL注入,破坏代码。所以,要么这些字段不允许用户输入,要么用户每次输入后都进行检测 和规避。resultMap 元素resultMap元素是MyBatis中最重要最强大的元素。与使用JDBC从结果集获取数据相比,它可 以省掉90%的代码,也可以允许您做一些JDBC不支持的事。事实上,要写一个类似于连结映射 (join mapping)这样复杂的交互代码,可能需要上千行的代码。设计ResultMaps 的目的,就是 只使用简单的配置语句而不需要详细地处理结果集映射,对更复杂的语句除了使用一些必须的语 句描述以外,就不需要其它的处理了。 您可能已经看到过这样简单映射语句,它并没有使用 resultMap,例如:&select id=”selectUsers” parameterType=”int” resultType=”hashmap”& select id, username, hashedPassword from some_table where id = #{id} &/sql&像上面的语句,所有结果集将会自动地映射到以列表为key 的HasMap(由resultType指定) 中。虽然这对许多场合下有用,但是HashMap 却不是非常好的域模型。更多的情况是使用 JavaBeans或者POJOs作为域模型。MyBatis支持这两种域模型。考虑下面的JavaBean:package com.someapp. public class User { private S private String hashedP public int getId() {30 MyBatis 3 - User Guide } public void setId(int id) { this.id = } public String getUsername() { } public void setUsername(String username) { this.username = } public String getHashedPassword() { return hashedP } public void setHashedPassword(String hashedPassword) { this.hashedPassword = hashedP } }基于 JavaBeans 规范,上面的类有 3 个属性: id、username,和 hashedPassword 。这 3 个 属性对应 select 语句的列名。 这样的 JavaBean 可以像 HashMap 一样简单地映射到 ResultSet 结果集。&select id=”selectUsers” parameterType=”int” resultType=”com.someapp.model.User”& select id, username, hashedPassword from some_table where id = #{id} &/sql&别忘了别名是您的朋友,使用别名您不用输入那长长的类路径。例如:&!-- In Config XML file --& &typeAlias type=”com.someapp.model.User” alias=”User”/& &!-- In SQL Mapping XML file --& &select id=”selectUsers” parameterType=”int” resultType=”User”& select id, username, hashedPassword from some_table where id = #{id} &/sql&这种情况下,MyBatis 在后台自动生成 ResultMap,将列名映射到 JavaBean 的相应属性。如 果列名与属性名不匹配,可以使用 select 语法(标准的 SQL 特性)中的将列名取一个别名的方式 来进行匹配。例如&select id=”selectUsers” parameterType=”int” resultType=”User”&31 MyBatis 3 - User Guideselect user_id user_name hashed_password from some_table where id = #{id} &/sql& as “id”, as “userName”, as “hashedPassword”ResultMaps 的知识您可能已经学到了许多,但还有一个您从没见到过。为了举例,让我们看 看最后一个例子,作为另一种解决列名不匹配的方法。&resultMap id=&userResultMap& type=&User&& &id property=&id& column=&user_id& /& &result property=&username& column=&username&/& &result property=&password& column=&password&/& &/resultMap&这个语句将会被 resultMap 属性引用(注意,我们没有使用 resultType)。如:&select id=”selectUsers” parameterType=”int” resultMap=”userResultMap”& select user_id, user_name, hashed_password from some_table where id = #{id} &/sql&一切就是这么简单!高级结果映射MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的。虽然我们希望所有的数 据库遵守第三范式或BCNF(修正的第三范式),但它们不是。如果有一个数据库能够完美映射到 所有应用数据模型,也将是非常棒的,但也没有。结果集映射就是MyBatis为解决这些问题而提供 的解决方案。例如,我们如何映射下面这条语句?&!-- Very Complex Statement --& &select id=&selectBlogDetails& parameterType=&int& resultMap=&detailedBlogResultMap&& select B.id as blog_id, B.title as blog_title, B.author_id as blog_author_id, A.id as author_id, A.username as author_username, A.password as author_password, A.email as author_email, A.bio as author_bio, A.favourite_section as author_favourite_section, P.id as post_id, P.blog_id as post_blog_id, P.author_id as post_author_id, P.created_on as post_created_on, P.section as post_section, P.subject as post_subject,32 MyBatis 3 - User GuideP.draft as draft, P.body as post_body, C.id as comment_id, C.post_id as comment_post_id, C.name as comment_name, C.comment as comment_text, T.id as tag_id, T.name as tag_name from Blog B left outer join Author A on B.author_id = A.id left outer join Post P on B.id = P.blog_id left outer join Comment C on P.id = C.post_id left outer join Post_Tag PT on PT.post_id = P.id left outer join Tag T on PT.tag_id = T.id where B.id = #{id} &/select&您可能想要把它映射到一个智能的对象模型,包括由一个作者写的一个博客,有许多文章 (Post,帖子),每个文章由0个或者多个评论和标签。下面是一个复杂ResultMap 的完整例子 (假定作者、博客、文章、评论和标签都是别名)。仔细看看这个例子,但是不用太担心,我们 会一步步地来分析,一眼看上去可能让人沮丧,但是实际上非常简单的&!-- Very Complex Result Map --& &resultMap id=&detailedBlogResultMap& type=&Blog&& &constructor& &idArg column=&blog_id& javaType=&int&/& &/constructor& &result property=&title& column=&blog_title&/& &association property=&author& column=&blog_author_id& javaType=& Author&& &id property=&id& column=&author_id&/& &result property=&username& column=&author_username&/& &result property=&password& column=&author_password&/& &result property=&email& column=&author_email&/& &result property=&bio& column=&author_bio&/& &result property=&favouriteSection& column=&author_favourite_section&/& &/association& &collection property=&posts& ofType=&Post&& &id property=&id& column=&post_id&/& &result property=&subject& column=&post_subject&/& &association property=&author& column=&post_author_id& javaType=&Author&/& &collection property=&comments& column=&post_id& ofType=& Comment&& &id property=&id& column=&comment_id&/& &/collection& &collection property=&tags& column=&post_id& ofType=& Tag& & &id property=&id& column=&tag_id&/& &/collection& &discriminator javaType=&int& column=&draft&& &case value=&1& resultType=&DraftPost&/& &/discriminator& &/collection& &/resultMap&这个resultMap 的元素的子元素比较多,讨论起来比较宽泛。下面我们从概念上概览一下这33 MyBatis 3 - User Guide 个resultMap的元素。 resultMap ? constructor C 实例化的时候通过构造器将结果集注入到类中 o idArg C ID 参数; 将结果集标记为 ID,以方便全局调用 o arg C 注入构造器的结果集 ? id C结果集 ID,将结果集标记为 ID,以方便全局调用 ? result C 注入一个字段或者 javabean 属性的结果 ? association C 复杂类型联合; 许多查询结果合成这个类型 o 嵌套结果映射 C associations 能引用自身, 或者从其它地方引用 ? collection C 复杂类型集合 o 嵌套结果映射C collections 能引用自身, 或者从其它地方引用 ? discriminator C使用一个结果值以决定使用哪个 resultMap o case C 基于不同值的结果映射 ? 嵌套结果映射 Ccase 也能引用它自身, 所以也能包含这些同样的元 素。它也可以从外部引用 resultMap ? 最佳实践: 逐步地生成 resultMap,单元测试对此非常有帮助。如果您尝试一下子就 生成像上面这样巨大的 resultMap,可能会出错,并且工作起来非常吃力。从简单地开 始,再一步步地扩展,并且进行单元测试。使用框架开发有一个缺点,它们有时像是一个 黑盒子。为了确保达到您所预想的行为,最好的方式就是进行单元测试。这对提交 bugs 也非常有用。 下一节,我们一步步地查看这些细节。id, result 元素&id property=&id& column=&post_id&/& &result property=&subject& column=&post_subject&/&这是最基本的结果集映射。id 和 result 将列映射到属性或简单的数据类型字段 (String, int, double, Date 等)。 这两者唯一不同的是,在比较对象实例时 id 作为结果集的标识属性。这有助于提高总体性 能,特别是应用缓存和嵌套结果映射的时候。 id、result 属性如下: Attribute property Description 映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就会使用 匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您都可以使用 逗点的属性形式。比如,您可以映射到“username”,也可以映射到 “address.street.number”。 数据库的列名或者列标签别名。与传递给 resultSet.getString(columnName)的 参数名称相同。 完整 java 类名或别名 (参考上面的内置别名列表)。如果映射到一个 JavaBean, 那 MyBatis 通常会自行检测到。然而,如果映射到一个 HashMap,那您应该明确column javaType34 MyBatis 3 - User Guide 指定 javaType 来确保所需行为。 这张表下面支持的 JDBC 类型列表列出的 JDBC 类型。这个属性只在 insert, update 或 delete 的时候针对允许空的列有用。JDBC 需要这项,但 MyBatis 不 需要。如果您直接编写 JDBC 代码,在允许为空值的情况下需要指定这个类型。 我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理 器。它的值可以是一个 TypeHandler 实现的完整类名,也可以是一个类型别名。jdbcTypetypeHandler支持的 JDBC 类型MyBatis 支持如下的 JDBC 类型:BIT TINYINT SMALLINT INTEGER BIGINT FLOAT REAL DOUBLE NUMERIC DECIMAL CHAR VARCHAR LONGVARCHAR DATE TIME TIMESTAMP BINARY VARBINARY LONGVARBINARY NULL OTHER BLOB CLOB BOOLEAN CURSOR UNDEFINED NVARCHAR NCHAR NCLOBConstructor 元素&constructor& &idArg column=&id& javaType=&int&/& &arg column=”username” javaType=”String”/& &/constructor&当属性与DTO,或者与您自己的域模型一起工作的时候,许多场合要用到不变类。通常,包含 引用,或者查找的数据很少或者数据不会改变的的表,适合映射到不变类中。构造器注入允许您 在类实例化后给类设值,这不需要通过public方法。MyBatis 同样也支持private 属性和 JavaBeans 的私有属性达到这一点,但是一些用户可能更喜欢使用构造器注入。构造器元素可以 做到这点。 考虑下面的构造器:public class User { //… public User(int id, String username) { //… } //… }为了将结果注入构造器,MyBatis 需要使用它的参数类型来标记构造器。Java 没有办法通过 参数名称来反射获得。因此当创建 constructor 元素,确保参数是按顺序的并且指定了正确的类 型。&constructor& &idArg column=&id& javaType=&int&/& &arg column=”username” javaType=”String”/& &/constructor&35 MyBatis 3 - User Guide 其它的属性与规则与 id、result 元素的一样。 Attribute column javaType Description 数据库的列名或者列标签别名。与传递给 resultSet.getString(columnName)的 参数名称相同。 完整 java 类名或别名 (参考上面的内置别名列表)。如果映射到一个 JavaBean, 那 MyBatis 通常会自行检测到。然而,如果映射到一个 HashMap,那您应该明确 指定 javaType 来确保所需行为。 支持的 JDBC 类型列表中列出的 JDBC 类型。这个属性只在 insert,update 或 delete 的时候针对允许空的列有用。JDBC 需要这项,但 MyBatis 不需要。如果 您直接编写 JDBC 代码,在允许为空值的情况下需要指定这个类型。 我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理 器。它的值可以是一个 TypeHandler 实现的完整类名,也可以是一个类型别名。jdbcTypetypeHandlerAssociation 元素&association property=&author& column=&blog_author_id& javaType=& Author&& &id property=&id& column=&author_id&/& &result property=&username& column=&author_username&/& &/association&Association 元素处理“has-one”(一对一)这种类型关系。比如在我们的例子中,一个 Blog 有一个 Author。联合映射与其它的结果集映射工作方式差不多,指定 property、column、 javaType(通常 MyBatis 会自动识别)、jdbcType(如果需要)、typeHandler。 不同的地方是您需要告诉 MyBatis 如何加载一个联合查询。MyBatis 使用两种方式来加载: ? ? Nested Select: 通过执行另一个返回预期复杂类型的映射 SQL 语句(即引用外部定义好 的 SQL 语句块)。 Nested Results: 通过嵌套结果映射(nested result mappings)来处理联接结果集 (joined results)的重复子集。首先,让我们检查一下元素属性。正如您看到的,它不同于普通只有 select 和 resultMap 属 性的结果映射。Attribute propertycolumnDescription 映射数据库列的字段或属性。如果 JavaBean 的属性与给定的名称匹配,就会使 用匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您都可以使 用逗点的属性形式。比如,您可以映射到”username”,也可以映射到更复杂点 的”address.street.number”。 数据库的列名或者列标签别名。与传递给 resultSet.getString(columnName)的 参数名称相同。 注意: 在处理组合键时, 您可以使用 column= “{prop1=col1,prop2=col2}” 这样的语法,设置多个列名传入到嵌套查询语句。这就会把 prop1 和 prop2 设置36 MyBatis 3 - User Guide 到目标嵌套选择语句的参数对象中。 完整 java 类名或别名 (参考上面的内置别名列表)。如果映射到一个 JavaBean, 那 MyBatis 通常会自行检测到。然而,如果映射到一个 HashMap,那您应该明确 指定 javaType 来确保所需行为。 支持的 JDBC 类型列表中列出的 JDBC 类型。这个属性只在 insert,update 或 delete 的时候针对允许空的列有用。JDBC 需要这项,但 MyBatis 不需要。如果 您直接编写 JDBC 代码,在允许为空值的情况下需要指定这个类型。 我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理 器。它的值可以是一个 TypeHandler 实现的完整类名,也可以是一个类型别名。javaTypejdbcTypetypeHandler联合嵌套选择(Nested Select for Association) select 通过这个属性,通过 ID 引用另一个加载复杂类型的映射语句。从指定列属性中返 回的值,将作为参数设置给目标 select 语句。表格下方将有一个例子。注意: 在处理组合键时,您可以使用 column=”{prop1=col1,prop2=col2}”这样的语 法,设置多个列名传入到嵌套语句。这就会把 prop1 和 prop2 设置到目标嵌套语 句的参数对象中。例如:&resultMap id=”blogResult” type=”Blog”& &association property=&author& column=&blog_author_id& javaType=&Author& select=”selectAuthor”/& &/resultMap& &select id=”selectBlog” parameterType=”int” resultMap=”blogResult”& SELECT * FROM BLOG WHERE ID = #{id} &/select& &select id=”selectAuthor” parameterType=”int” resultType=&Author&& SELECT * FROM AUTHOR WHERE ID = #{id} &/select&我们使用两个 select 语句:一个用来加载 Blog,另一个用来加载 Author。Blog 的 resultMap 描述了使用“selectAuthor”语句来加载 author 的属性。 如果列名和属性名称相匹配的话,所有匹配的属性都会自动加载。 译者注: 上面的例子,首先执行&select id=“selectBlog”&,执行结果存放到 &resultMap id=“blogResult”&结果映射中。“blogResult”是一个 Blog 类型, 从&select id=“selectBlog”&查出的数据都会自动赋值给”blogResult”的与列 名匹配的属性,这时 blog_id,title 等就被赋值了。同时“blogResult”还有一 个关联属性&Author&,执行嵌套查询 select=”selectAuthor”后,Author 对象的 属性 id,username,password,email,bio 也被赋于与数据库匹配的值。 Blog{37 MyBatis 3 - User Guideblog_ Author author { } }建议不要使用 Batatis 的自动赋值,这样不能够

我要回帖

更多关于 风流相师下载 的文章

 

随机推荐