开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情
MyBatis的结果集映射
上一篇文章我们讲了映射文件中的一些标签,其中包含了Select、Insert、Update等基础标签,它们都比较简单,所以就放一起介绍。这一篇文章我们来看看映射文件中也是用的比较点多的xml节点resultMap节点。
MyBatis的参数绑定
在查询的过程当中,有可能需要通过参数进行查询,根据不同的方式,需要对SQL进行拼接或者通过数据库的预编译功能,在上一篇文章当中已经领略过了,现在讲讲MyBatis中的动态语句需要怎么弄。
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以减少这些不必要的重复操作。
MyBatis的标签提供了一些子标签如:if、choose、foreach等为动态SQL做了强大的支持,我们可以根据不同的情况使用它们,进行sql拼接。
这里需要知道两个占位符,一个是#{}占位符,用于sql预编译,会将sql参数转换为?。另外一个是${},会将改占位的地方用传入的字符串进行替换,所以会有SQL注入的风险。
resultMap标签
既然是轻量级的ORM框架,那么需要有结果集映射的支持,resultMap就是MyBatis中用来做结果集到Java对象映射的配置。它的使用如下所示:
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="user_name"/>
<result property="password" column="hashed_password"/>
</resultMap>
其中ID代表结果集映射的唯一id,type可以写类的全限定类名,然后里面需要配置字段的对应关系,<result>标签是每一个字段和java属性的映射关系,通过配置该标签就可以将sql的查询字段和属性对应起来。它的重要属性如下表所示:
| 属性 | 描述 |
|---|---|
property | 映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。否则 MyBatis 将会寻找给定名称的字段(field)。 无论是哪一种情形,你都可以使用常见的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。 |
column | 数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。 |
javaType | 一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。 |
jdbcType | JDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。 只需要在可能执行插入、更新和删除的且允许空值的列上指定 JDBC 类型。这是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 编程,你需要对可以为空值的列指定这个类型。 |
typeHandler | 我们在前面讨论过默认的类型处理器。使用这个属性,你可以覆盖默认的类型处理器。 这个属性值是一个类型处理器实现类的全限定名,或者是类型别名。 |