resultMap 与sql
定义
resultMap 标签用于将数据库数据映射为 Java 对象;sql 标签则用来定义可重用的 SQL 代码段。
resultMap 实例
在下面这段 select 标签中,SQL 语句返回的是一个复杂对象,即 resultType 上指定的 User。
<select id="selectUserByAgeAndScore" parameterType="com.imooc.mybatis.model.User"
resultType="com.imooc.mybatis.model.User">
SELECT * FROM imooc_user WHERE age = #{age} AND score = #{score}
</select>
在这种情况下,MyBatis 会自动创建 resultMap 对象进行数据的映射,接下来我们直接定义出 resultMap,避免 MyBatis 推断和映射带来的性能损耗。如下:
<resultMap id="userMap" type="com.imooc.mybatis.model.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="age" column="age"/>
<result property="score" column="score"/>
</resultMap>
<select id="selectUserByAgeAndScore" parameterType="com.imooc.mybatis.model.User"
resultMap="userMap">
SELECT * FROM imooc_user WHERE age = #{age} AND score = #{score}
</select
我们定义了名为 userMap 的 resultMap 且指定其对应的 Java 类型为 User,在标签的内部,我们还需指定字段之间的映射,除 id 这个特殊的字段外,其它字段均使用 result 标签来映射。
其中 property 是 Java 对象中的字段名称,column 是数据表与之对应的字段名称。
resultMap 定义完毕后,我们在 select 标签中通过 resultMap 属性来设置对应的 id。
TIPS: 注意, resultMap 和 resultType 不能共存,只能二选一。
这样,一次简单的 resultMap 使用就完毕了。
SQL实例
SELECT * FROM imooc_user
这样的代码段其实非常常见,会在多个 select 标签中用到它。我们可以将其定义为一个 sql 标签,这样所有的 select 标签都可以快速复用到这段代码。
<sql id="selectUser"> SELECT * FROM imooc_user </sql>
同样的,我们必须为这个代码段定义一个唯一的 id,定义好后,我们就可以在其它标签中使用了:
<select id="selectUserByAgeAndScore" parameterType="com.imooc.mybatis.model.User"
resultMap="userMap">
<include refid="selectUser"/>
WHERE age = #{age} AND score = #{score}
</select>
这里,我们必须使用一个 include 标签来将 SQL 标签包含进来,并且 refid 属性必须是该 SQL 标签的 id 值。这样这段代码仍然可以正常工作。