select元素用来映射查询语句,他是MyBatis最常用的元素之一.
执行简单查询的select元素是非常简单的,例如:
<select id="selectUser" parameterType="int" resultType="hashmap"> SELECT * FROM TB_USER WHERE ID=#{id} </select>
这个语句被称作selectUser,其接收一个int或Integer类型的参数,并返回一个HashMap类型的对象,HashMap中的键是列名,值便是结果行中的对应值.
注意参数符号#{id},这是告诉MyBatis创建一个预处理语句参数,通过JDBC,这样的一个参数在SQL中会由一个?来标识,并被传递到一个新的预处理语句中,以上MyBatis配置文件执行时会生成如下JDBC代码:
String selectUser = "SELECT * FROM TB_USER WHERE ID=?"; PreparedStatement ps = conn.prepaesStatement(selectUser); ps.setInt(1,id);
select元素有很多属性可以配置,他们用来决定每条语句的作用细节,例如:
<select id="selectUser" paramenterType="int" resultType="hashmap" resultMap="userResultMap" flushCache="false" useCache="true" timeout="10000" fetchSize="256" statementType="PREPARED" resultSetTpe="FORWARD_ONLY" >
id:在命名空间中唯一的标识符,可以被从来应用这条语句
parameterType:将会传入这条语句的参数类的完全限定名或别名,这个属性是可选的,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数,默认值为unset
resultType:从这条语句中返回的期望类型的类的完全限定名或别名.注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身.返回时可以使用resultType或resultMap,但不能同时使用.
resultMap:外部resultMap的命名引用,结果集的映射是MyBatis最强大的特性,对其有一个很好的理解的话,很多复杂映射的情形都能迎刃而解.返回时可以使用resultMap或resultType,但不能同时使用
flushCache:如果设置为true,这任何时候只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值为false
useCahce:如果设置为true,将会导致本条语句的结果被二级缓存,在select元素当中默认值为true
timeout:这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数,默认值为unset
fetchSize:这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等,默认为unset
statementType:值为STATEMENT,PREPARED或CALLABLE.这会让MyBatis分别使用JDBC中的Statement,prepareStatement或CallableStatement,默认值为PREPARED
resultSetType:结果集的类型,值为FORWARD_ONLY,SCROLL_SENSITIVE或SCROOL_INSENSITIVE,默认值unset
databaseId:如果配置了databaseIdProvider,MyBatis则会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略.
resultOrdered:这个设置仅针对嵌套结果select语句适用:如果为true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生对前面结果集应用的情况,这就使得在获取嵌套的结果集时不至于导致内存不足,默认为false
resultSets:这个设置仅针对多结果集的情况适用,他将列出语句执行后返回的结果集并给每个结果集一个名称,名称是逗号分隔的