MyBatis 教程

SELECT DTD定义

在学习 MyBatis 的 <select> 之前,我们需要先看看 mybatis-3-mapper.dtd 的定义。<select> 定义如下:

<!ELEMENT select (#PCDATA | include | trim | where |
    set | foreach | choose | if | bind)*>
<!ATTLIST select
    id CDATA #REQUIRED
    parameterMap CDATA #IMPLIED
    parameterType CDATA #IMPLIED
    resultMap CDATA #IMPLIED
    resultType CDATA #IMPLIED
    resultSetType (FORWARD_ONLY | SCROLL_INSENSITIVE | SCROLL_SENSITIVE) #IMPLIED
    statementType (STATEMENT|PREPARED|CALLABLE) #IMPLIED
    fetchSize CDATA #IMPLIED
    timeout CDATA #IMPLIED
    flushCache (true|false) #IMPLIED
    useCache (true|false) #IMPLIED
    databaseId CDATA #IMPLIED
    lang CDATA #IMPLIED
    resultOrdered (true|false) #IMPLIED
    resultSets CDATA #IMPLIED >

上面的 DTD 定义了 <select> 元素,并且为 <select> 元素定义了很多属性,如:id、parameterMap、parameterType、resultMap等常用参数。<select> 元素是对 SQL 语句 select 子语句的映射,可以使用该元素从数据库查询数据。下面将逐一介绍 <select> 标签的各个元素的作用:

id

设置该 SQL 语句的唯一标识符,用于调用该 SQL 语句。例如:

<select id="getUserById" parameterType="int" resultType="hashmap">
   select `user_id`, `name`, `sex`, `age`, `salary`, `borthday`, `face`
   from `user`
   where `user_id`=#{userId,jdbcType=INTEGER}
</select>

上面定义的“getUserById”就是该 <select> 元素的唯一标识符ID。我们可以使用该ID来调用这个 SQL 语句,在后续章节将详细介绍怎样调用 SQL。

parameterMap

设置该 SQL 语句参数的映射对象类型。例如:自定义的JavaBean,需要使用 <parameterMap> 元素来维护,如下:

<!--  定义SQL语句参数类型 -->
<parameterMap id="paramMap" type="com.hxstrive.mybatis.paramter.UserParameter">
   <parameter property="userId"/>
</parameterMap>

<!--  定义SQL语句 -->
<select id="getUserById" parameterMap="paramMap"
   resultMap="RESULT_MAP">
   select `user_id`, `name`, `sex`, `age`, `salary`, `borthday`, `face`
   from `user`
   where `user_id`=#{userId,jdbcType=INTEGER}
</select>

parameterType

设置传递给该 SQL 语句的参数的 Java 类型。例如:hashmap、int、float 等

<select id="getUserById" parameterType="int" resultType="hashmap">
   select `user_id`, `name`, `sex`, `age`, `salary`, `borthday`, `face`
   from `user`
   where `user_id`=#{userId,jdbcType=INTEGER}
</select>

resultMap

设置返回结果集映射到的 JavaBean 类型。例如:自定义的 JavaBean,需要使用 <resultMap> 元素来维护,如下:

<!-- 将数据库行映射到 UserBean JavaBean -->
<resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.model.UserBean">
   <id column="user_id" jdbcType="INTEGER" property="userId" />
   <result column="name" jdbcType="VARCHAR" property="name" />
   <result column="sex" jdbcType="VARCHAR" property="sex" />
   <result column="age" jdbcType="INTEGER" property="age" />
   <result column="salary" jdbcType="DOUBLE" property="salary" />
   <result column="borthday" jdbcType="DATE" property="borthday" />
   <result column="face" jdbcType="LONGVARBINARY" property="face" />
</resultMap>

<!--  SQL语句,将返回结果映射到 RESULT_MAP -->
<select id="getUserById" parameterType="int" resultMap="RESULT_MAP" >
   select `user_id`, `name`, `sex`, `age`, `salary`, `borthday`, `face`
   from `user`
   where `user_id`=#{userId,jdbcType=INTEGER}
</select>

resultType

设置返回结果集的隐射类型,如:hashmap、int、float 等

<select id="getUserById" parameterType="int" resultType="hashmap">
   select `user_id`, `name`, `sex`, `age`, `salary`, `borthday`, `face`
   from `user`
   where `user_id`=#{userId,jdbcType=INTEGER}
</select>

resultSets 

这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。

resultSetType 

FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。

statementType

设置处理该SQL语句的类型,默认值:PREPARED。取值如下:

  • STATEMENT:使用 JDBC 的 Statement 类

  • PREPARED:使用 JDBC 的 PreparedStatement 类

  • CALLABLE:使用 JDBC 的 CallabledStatement 类

fetchSize

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

timeout

这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。

flushCache

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

useCache

将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。

databaseId 

如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。

resultOrdered 

这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。 这就使得在获取嵌套结果集的时候不至于内存不够用。默认值:false。

在后续章节中,我们将注意介绍上面属性的具体用法……

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号