Mybatis XML 文件的学习详解(一)

来源:互联网 发布:360借壳中昌数据 编辑:程序博客网 时间:2024/05/16 05:28
Mybatis XML 文件的学习详解(一)
 

MyBatis真正的力量是在映射语句中。这里是奇迹发生的地方。对于所有的力量,SQL映射的 XML 文件是相当的简单。当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 95%的代码量。MyBatis的构建就是聚焦于 SQL ,使其远离于普通的方式。

SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

·        cache– 配置给定命名空间的缓存。

·        cache-ref– 从其他命名空间引用缓存配置。

·        resultMap– 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。

·        parameterMap– 已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。这里不会记录。

·        sql– 可以重用的 SQL,也可以被其他语句引用。

·        insert– 映射插入语句

·        update– 映射更新语句

·        delete– 映射删除语句

·        select– 映射查询语句

下一部分将从语句本身开始来描述每个元素的细节。

select

查询语句是使用 MyBatis时最常用的元素之一。直到你从数据库取出数据时才会发现将数据存在数据库中是多么的有价值, 所以许多应用程序查询要比更改数据多的多。对于每次插入,更新或删除,那也会有很多的查询。这是 MyBatis的一个基本原则,也是将重心和努力放到查询和结果映射的原因。对简单类别的查询元素是非常简单的。比如:

<select id="selectPerson" parameterType="int" resultType="hashmap">  SELECT * FROM PERSON WHERE ID = #{id}</select>

这个语句被称作 selectPerson,使用一个 int ( Integer) 类型的参数, 并返回一个 HashMap类型的对象,其中的键是列名,值是列对应的值。

注意参数注释:

#{id}

这就告诉 MyBatis创建一个预处理语句参数。使用 JDBC, 这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:

// Similar JDBC code, NOT MyBatis… String selectPerson = "SELECT * FROM PERSON WHERE ID=?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);

当然,这需要很多单独的 JDBC 的代码来提取结果并将它们映射到对象实例中, 这就是 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">

Select Attributes

属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType

将会传入这条语句的参数类的完全限定名或别名。

parameterMap

这是引用外部 parameterMap的已经被废弃的方法。使用内联参数映射和 parameterType属性。

resultType

从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用 resultType resultMap,但不能同时使用。

resultMap

命名引用外部的 resultMap。返回 map MyBatis最具力量的特性,对其有一个很好的理解的话,许多复杂映射的情形就能被解决了。使用 resultMap resultType,但不能同时使用。

flushCache

将其设置为true,不论语句什么时候被带哦用,都会导致缓存被清空。默认值:false

useCache

将其设置为 true,将会导致本条语句的结果被缓存。默认值: true

timeout

这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

fetchSize

这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)

statementType

STA TEMENT,PREPARED CALLABLE的一种。这会让 MyBatis使用选择使用 Statement,PreparedStatement CallableStatement。默认值:PREPARED

resultSetType

FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)

databaseId

In case there is a configured databaseIdProvider, MyBatis will load all statements with no databaseId attribute or with a databaseId that matches the current one. If case the same statement if found with and without the databaseId the latter will be discarded.

insert, update and delete

数据变更语句 insert,update delete 在它们的实现中非常相似:

<insert  id="insertAuthor"   parameterType="domain.blog.Author"  flushCache="true"   statementType="PREPARED"   keyProperty=""  keyColumn=""   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">

Insert, Update and Delete Attributes

属性

描述

id

在命名空间中唯一的标识符,可以被用来引用这条语句。

parameterType

将会传入这条语句的参数类的完全限定名或别名。

parameterMap

这是引用外部 parameterMap的已经被废弃的方法。使用内联参数映射和 parameterType属性。

flushCache

将其设置为true,不论语句什么时候被带哦用,都会导致缓存被清空。默认值:false

timeout

这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

statementType

STA TEMENT,PREPARED CALLABLE的一种。这会让 MyBatis使用选择使用 Statement,PreparedStatement CallableStatement。默认值:PREPARED

useGeneratedKeys

( insert ) MyBatis使 JDBC getGeneratedKeys方法来取出由数据(比如: MySQL SQL Server这样的数据库管理系统的自动递增字段)内部生成的主键。默认值:false

keyProperty

(仅对 insert 有用)标记一个属性, MyBatis会通过 getGeneratedKeys或者通过 insert语句的 selectKey子元素设置它的值。默认:不设置。

keyColumn

(仅对 insert 有用)标记一个属性, MyBatis会通过 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},

   email = #{email},

   bio = #{bio}

 where id = #{id}</update> <delete id="deleteAuthor" parameterType="int">  delete from Author where id = #{id}</delete>

如前所述,插入语句有一点多,它有一些属性和子元素用来处理主键的生成。

首先,如果你的数据库支持自动生成主键的字段(比如 MySQL SQL Server) ,那么你可以设置 useGeneratedKeys=true,而且设置 keyProperty到你已经做好的目标属性上。例如,如果上面的 Author 表已经对 id 使用了自动生成的列类型,那么语句可以修改为:

<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 处理问题的灵活性,因为它并不真的关心 ID 的生成):

<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 会被设置,然后插入语句会被调用。这给你了一个简单的行为在你的数据库中来处理自动生成的主键,而不需要使你的 Java 代码变得复杂。

selectKey元素描述如下:

<selectKey  keyProperty="id"   resultType="int"   order="BEFORE"  statementType="PREPARED">

selectKey Attributes

属性

描述

keyProperty

selectKey语句结果应该被设置的目标属性。

resultType

结果的类型。MyBatis通常可以算出来,但是写上也没有问题。 MyBatis 允许任何简单类型用作主键的类型,包括字符串。

order

这可以被设置为BEFORE AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle数据库相似,可以在插入语句中嵌入序列调用。

statementType

和前面的相,MyBatis支持 STA TEMENT ,PREPARED CALLABLE语句的映射类型,分别代表 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

在之前的语句中,你已经看到了一些简单参数的示例。 MyBatis 中参数是非常强大的在元素。对于简单的做法,大概 90%的情况,是不用太多的,比如:

<select id="selectUsers" parameterType="int" resultType="User">  select id, username, password

 from users

 where id = #{id}</select>

上面的这个示例说明了一个非常简单的命名参数映射。参数类型被设置为“int ,因此这个参数可以被设置成任何内容。原生的类型或简单数据类型,比如整型和没有相关属性的字符串,因此它会完全用参数来替代。然而,如果你传递了一个复杂的对象,那么 MyBatis的处理方式就会有一点不同。比如:

<insert id="insertUser" parameterType="User" >  insert into users (id, username, password)

 values (#{id}, #{username}, #{password})</insert>

如果 User类型的参数对象传递到了语句中, username password 属性将会被查找, id、然后它们的值就被传递到预处理语句的参数中。

这点对于传递参数到语句中非常好。但是对于参数映射也有一些其他的特性。

首先, MyBatis的其他部分,参数可以指定一个确定的数据类型。

#{property,javaType=int,jdbcType=NUMERIC}

MyBatis的剩余部分,javaType 通常可以从参数对象中来去顶,除非对象是一个 HashMap。那么 javaType应该被确定来保证使用正确类型处理器。

注意 如果 null被当作值来传递,对于所有可能为空的列,JDBC Type 是需要的。以可以自己通过阅读预处理语句的 setNull()方法的 JavaDocs文档来研究这个。

为了自定义类型处理器,你可以指定一个确定的类型处理器类(或别名),比如:

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

尽管它看起来繁琐,但是实际上是你很少设置它们其中之一。

对于数值类型,对于决定有多少数字是相关的,有一个数值范围。

#{height,javaType=double,jdbcType=NUMERIC,numericScale=2}

最后,mode属性允许你指定 IN,OUT INOUT 参数。如果参数为 OUT INOUT, 参数对象属性的真实值将会被改变,就像你期望你需要你个输出参数。如果 mode OUT ( INOUT) ,而且 jdbcType CURSOR(也就是 Oracle REFCURSOR) ,你必须指定一个 resultMap 来映射结果集到参数类型。要注意这里的 javaType属性是可选的,如果左边的空白是 jdbcType CURSOR 类型,它会自动地被设置为结果集。

#{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}

MyBatis也支持很多高级的数据类型,比如结构体,但是当注册 out参数时你必须告诉语句类型名称。比如(再次提示,在实际中不要像这样换行):

#{middleInitial, mode=OUT, jdbcType=STRUCT, jdbcTypeName=MY_TYPE, resultMap=departmentResultMap}

尽管所有这些强大的选项很多时候你只简单指定属性名,MyBatis会自己计算剩余的。最多的情况是你为 jdbcType 指定可能为空的列名。

#{firstName} #{middleInitial,jdbcType=VARCHAR} #{lastName}

字符串替换

默认情况下,使用#{}格式的语法会导致 MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?) 。这样做很安全,很迅速也是首选做法,有时你只是想直接在 SQL语句中插入一个不改变的字符串。比如, ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里 MyBatis不会修改或转义字符串。

重要 接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的 SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

Result Maps

resultMap元素是 MyBatis中最重要最强大的元素。它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上, 编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。 ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。

你已经看到简单映射语句的示例了,但没有明确的 resultMap。比如:

<select id="selectUsers" parameterType="int" resultType="hashmap">  select id, username, hashedPassword

 from some_table

 where id = #{id}</select>

这样一个语句简单作用于所有列被自动映射到 HashMap的键上,这由 resultType 属性指定。这在很多情况下是有用的,但是 HashMap不能很好描述一个领域模型。那样你的应用程序将会使用 JavaBeans POJOs(Plain Old Java Objects,普通 Java对象)来作为领域模型。MyBatis 对两者都支持。看看下面这个 JavaBean:

package com.someapp.model; public class User {  private int id;   private String username;   private String hashedPassword;  

 public int getId() {     return id;   }   public void setId(int id) {     this.id = id;   }  public String getUsername() {     return username;   }   public void setUsername(String username) {     this.username = username;  }   public String getHashedPassword() {     return hashedPassword;  }   public void setHashedPassword(String hashedPassword) {    this.hashedPassword = hashedPassword;   } }

基于 JavaBean的规范,上面这个类有 3 个属性:id,username hashedPassword。这些在 select语句中会精确匹配到列名。

这样的一个 JavaBean可以被映射到结果集,就像映射到 HashMap 一样简单。

<select id="selectUsers" parameterType="int" resultType="com.someapp.model.User">  select id, username, hashedPassword

 from some_table

 where id = #{id}</select>

要记住类型别名是你的伙伴。使用它们你可以不用输入类的全路径。比如:

<!-- In mybatis-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}</select>

这些情况下,MyBatis会在幕后自动创建一个 ResultMap,基于属性名来映射列到 JavaBean 的属性上。如果列名没有精确匹配,你可以在列名上使用 select字句的别名(一个基本的 SQL 特性)来匹配标签。比如:

<select id="selectUsers" parameterType="int" resultType="User">  select

   user_id             as "id",

   user_name           as "userName",

   hashed_password     as "hashedPassword"

 from some_table

 where id = #{id}</select>

ResultMap最优秀的地方你已经了解了很多了,但是你还没有真正的看到一个。这些简单的示例不需要比你看到的更多东西。只是出于示例的原因,让我们来看看最后一个示例中外部的 resultMap 是什么样子的,这也是解决列名不匹配的另外一种方式。

<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}</select>

如果世界总是这么简单就好了。

高级结果映射

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,

      P.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>

你可能想把它映射到一个智能的对象模型,包含一个作者写的博客,有很多的博文,每篇博文有零条或多条的评论和标签。下面是一个完整的复杂结果映射例子 (假设作者, 博客, 博文, 评论和标签都是类型的别名)我们来看看, 。但是不用紧张, 我们会一步一步来说明。当天最初它看起来令人生畏,但实际上非常简单。

<!-- 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" 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" javaType="Author"/>     <collection property="comments" ofType=" Comment">      <id property="id" column="comment_id"/>     </collection>    <collection property="tags" ofType=" Tag" >       <id property="id" column="tag_id"/>    </collection>     <discriminator javaType="int" column="draft">      <case value="1" resultType="DraftPost"/>     </discriminator>  </collection> </resultMap>

resultMap元素有很多子元素和一个值得讨论的结构。下面是 resultMap元素的概念视图

resultMap

·        constructor -类在实例化时,用来注入结果到构造方法中

·        idArg - ID参数;标记结果作为 ID可以帮助提高整体效能

·        arg -注入到构造方法的一个普通结果

·        id– 一个 ID结果;标记结果作为 ID 可以帮助提高整体效能

·        result– 注入到字段或 JavaBean属性的普通结果

·        association– 一个复杂的类型关联;许多结果将包成这种类型

·        嵌入结果映射 – 结果映射自身的关联,或者参考一个

·        collection– 复杂类型的集

·        嵌入结果映射 – 结果映射自身的集,或者参考一个

·        discriminator– 使用结果值来决定使用哪个结果映射

·        case– 基于某些值的结果映射

·        嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相 同的元素,或者它可以参照一个外部的结果映射。

最佳实践 通常逐步建立结果映射。单元测试的真正帮助在这里。如果你尝试创建一次创建一个向上面示例那样的巨大的结果映射,那么可能会有错误而且很难去控制它来工作。开始简单一些,一步一步的发展。而且要进行单元测试!使用该框架的缺点是它们有时是黑盒(是否可见源代码)。你确定你实现想要的行为的最好选择是编写单元测试。它也可以你帮助得到提交时的错误。

下面一部分将详细说明每个元素。

id & result

<id property="id" column="post_id"/> <result property="subject" column="post_subject"/>

这些是结果映射最基本内容。id result 都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。

这两者之间的唯一不同是id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射)

每个都有一些属性:

Id and Result Attributes

属性

描述

property

映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的 JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称 property的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西: “username” ,或者映射到一些复杂的东西: “address.street.number”

column

从数据库中得到的列名,或者是列名的重命名标签。这也是通常和会传递给 resultSet.getString(columnName)方法参数中相同的字符串。

javaType

一个 Java类的完全限定名,或一个类型别名(参加上面内建类型别名的列表)。如果你映射到一个 JavaBean,MyBatis通常可以断定类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType来保证所需的行为。

jdbcType

在这个表格之后的所支持的 JDBC类型列表中的类型。JDBC类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC jdbcType 的需要,而不是 MyBatis 的。如果你直接使用 JDBC编程,你需要指定这个类型-但仅仅对可能为空的值。

typeHandler

我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。

支持的 JDBC类型

为了未来的参考,MyBatis通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型。

BIT

FLOAT

CHAR

TIMESTAMP

OTHER

UNDEFINED

TINYINT

REAL

VARCHAR

BINARY

BLOG

NVARCHAR

SMALLINT

DOUBLE

LONGVARCHAR

VARBINARY

CLOB

>NCHAR

INTEGER

NUMERIC

DATE

LONGVARBINARY

BOOLEAN

NCLOB

BIGINT

DECIMAL

TIME

NULL

CURSOR

ARRAY

构造方法

<constructor>   <idArg column="id" javaType="int"/>    <arg column="username" javaType="String"/> </constructor>

对于大多数数据传输对象(Data Transfer Object,DTO)类型,属性可以起作用,而且像你绝大多数的领域模型,指令也许是你想使用一成不变的类的地方。通常包含引用或查询数据的表很少或基本不变的话对一成不变的类来说是合适的。构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。MyBatis也支持私有属性和私有 JavaBeans 属性来达到这个目的,但是一些人更青睐构造方法注入。构造方法元素支持这个。

看看下面这个构造方法:

public class User {   //...    public User(int id, String username) {      //...   } //... }

为了向这个构造方法中注入结果,MyBatis需要通过它的参数的类型来标识构造方法。 Java 没有自查(反射)参数名的方法。所以当创建一个构造方法元素时,保证参数是按顺序排列的,而且数据类型也是确定的。

<constructor>   <idArg column="id" javaType="int"/>    <arg column="username" javaType="String"/> </constructor>

剩余的属性和规则和固定的 id result 元素是相同的。

属性

描述

column

来自数据库的类名,或重命名的列标签。这和通常传递给 resultSet.getString(columnName)方法的字符串是相同的。

javaType

一个 Java类的完全限定名,或一个类型别名(参加上面内建类型别名的列表)。如果你映射到一个 JavaBean,MyBatis 通常可以断定类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType来保证所需的行为。

jdbcType

在这个表格之前的所支持的 JDBC类型列表中的类型。JDBC类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC的需要, jdbcType而不是 MyBatis的。如果你直接使用 JDBC编程,你需要指定这个类型-但仅仅对可能为空的值。

typeHandler

我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。

select

The ID of another mapped statement that will load the complex type required by this property mapping. The values retrieved from columns specified in the column attribute will be passed to the target select statement as parameters. See the Association element for more.

resultMap

This is the ID of a ResultMap that can map the nested results of this argument into an appropriate object graph. This is an alternative to using a call to another select statement. It allows you to join multiple tables together into a single ResultSet. Such a ResultSet will contain duplicated, repeating groups of data that needs to be decomposed and mapped properly to a nested object graph. To facilitate this, MyBatis lets you "chain" result maps together, to deal with the nested results. See the Association element below for more.

 

0 0
原创粉丝点击