在学习 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> 标签的各个元素的作用:
设置该 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。
设置该 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>
设置传递给该 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>
设置返回结果集映射到的 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>
设置返回结果集的隐射类型,如: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>
这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。
FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
设置处理该SQL语句的类型,默认值:PREPARED。取值如下:
STATEMENT:使用 JDBC 的 Statement 类
PREPARED:使用 JDBC 的 PreparedStatement 类
CALLABLE:使用 JDBC 的 CallabledStatement 类
这是暗示驱动程序每次批量返回的结果行数。默认不设置(驱动自行处理)
这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
设置为 true,不论语句什么时候被带哦用,都会导致缓存被 清空。默认值为 false
将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。 这就使得在获取嵌套结果集的时候不至于内存不够用。默认值:false。
在后续章节中,我们将注意介绍上面属性的具体用法……