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">
属性 | 描述 |
---|---|
id | 在命名空间中唯一的标识符,可以被用来引用这条语句。 |
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. |
resultOrdered | This is only applicable for nested result select statements: If this is true, it is assumed that nested results are contained or grouped together such that when a new main result row is returned, no references to a previous result row will occur anymore. This allows nested results to be filled much more memory friendly. Default: false. |