因为最初设计时,MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。而到了 MyBatis 3,有新的可用的选择了。
MyBatis3 构建在基于全面而且强大的 Java 配置 API 之上。这个配置 API 是基于 XML 的 MyBatis 配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。
注意:不幸的是,Java 注解限制了它们的表现和灵活。尽管很多时间都花调查,设计和实验上,最强大的 MyBatis 映射不能用注解来构建,那并不可笑。C#属性(做示例)就没有这些限制,因此 MyBatis.NET 将会比 XML 有更丰富的选择。也就是说,基于 Java 注解的配置离不开它的特性。
MyBatis 提供了如下注解:
注解 | 目标 | 相对应的 XML | 描述 |
@CacheNamespace | 类 | <cache> | 为给定的命名空间(比如类)配置缓存。属性:implemetation, eviction, flushInterval, size 和 readWrite。 |
@CacheNamespaceRef | 类 | <cacheRef> | 参照另外一个命名空间的缓存来使用。属性:value 应该是一个名空间的字符串值(也就是类的完全限定名)。 |
@ConstructorArgs | 方法 | <constructor> | 收集一组结果传递给一个对象的构造方法。属性:value 是形式参数的数组。 |
@Arg | 方法 | <arg> <idArg> | 单独的构造方法参数,是 ConstructorArgs 集合的一部分。属性:id,column,javaType,typeHandler。 id 属性是布尔值,来标识用于比较的属性,和<idArg> XML 元素相似。 |
@TypeDiscriminator | 方法 | <discriminator> | 一组实例值被用来决定结果映射的表现。属性:column,javaType,jdbcType,typeHandler,cases。 |
@Case | 方法 | <case> | 单独实例的值和它对应的映射。属性:value,type,results。Results 属性是结果数组,因此这个注解和实际的 ResultMap 很相似,由下面的 Results 注解指定。 |
@Results | 方法 | <resultMap> | 结果映射的列表,包含了一个特别结果列如何被映射到属性或字段的详情。属性:value,是 Result 注解的数组。 |
@Result | 方法 | <result> <id> | 在列和属性或字段之间的单独结果映射。属性:id,column,property,javaType,jdbcType,type Handler,one,many。id 属性是一个布尔值,表示了应该被用于比较(和在 XML 映射中的<id>相似)的属性。one 属性是单独的联系,和<association>相似,而many 属性是对集合而言的,和<collection>相似。它们这样命名是为了避免名称冲突。 |
@One | 方法 | <association> | 复杂类型的单独属性值映射。属性:select,已映射语句(也就是映射器方法)的完全限定名,它可以加载合适类型的实例。注意:联合映射在注解 API中是不支持的。这是因为 Java 注解的限制,不允许循环引用。 |
@Many | 方法 | <collection> | 复杂类型的集合属性映射。属性:select,是映射语句(也就是映射器方法)的完全限定名,它可以加载合适类型的一组实例。注意:联合映射在 Java注解中是不支持的。这是因为 Java 注解的限制,不允许循环引用。 |
@Options | 方法 | 映射语句的属性 | 这个注解提供访问交换和配置选项的宽广范围,它们通常在映射语句上作为属性出现。而不是将每条语句注解变复杂,Options 注解提供连贯清晰的方式来访问它们。属性: useCache=true, flushCache=false , resultSetType=FORWARD_ONLY , statementType=PREPARED , fetchSize=-1 , timeout=-1 , useGeneratedKeys=false , keyProperty="id" 理解 Java 注解是很重要的,因为没有办法来指定“null”作为值。因此,一旦你使用了 Options 注解,语句就受所有默认值的支配。要注意什么样的默认值来避免不期望的行为。 |
@Insert @Update @Delete | 方法 | <insert> <update> <delete> | 这些注解中的每一个代表了执行的真实 SQL。它们每一个都使用字符串数组(或单独的字符串)。如果传递的是字符串数组,它们由每个分隔它们的单独空间串联起来。这就当用 Java 代码构建 SQL 时避免了“丢失空间”的问题。然而,如果你喜欢,也欢迎你串联单独的字符串。属性:value,这是字符串数组用来组成单独的 SQL 语句。 |
@InsertProvider @UpdateProvider @DeleteProvider @SelectProvider | 方法 | <insert> <update> <delete> <select> | 这些可选的 SQL 注解允许你指定一个类名和一个方法在执行时来返回运行的 SQL。基于执行的映射语句,MyBatis会实例化这个类,然后执行由 provider 指定的方法.这个方法可以选择性的接受参数对象作为它的唯一参数,但是必须只指定该参数或者没有参数。属性:type,method。type 属性是类的完全限定名。method 是该类中的那个方法名。注意:这节之后是对 SelectBuilder 类的讨论,它可以帮助你以干净,容于阅读的方式来构建动态 SQL。 |
@Param | 参数 | N/A | 如果你的映射器的方法需要多个参数,这个注解可以被应用于映射器的方法参数来给每个参数一个名字。否则,多参数将会以它们的顺序位置来被命名(不包括任何 RowBounds 参数)。比如 #{1} ,#{2} 等,这是默认的。使用@Param(“person”),参数应该被命名为 #{person}。 |