resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作
结果映射ResultMap
我们之前的数据库是这样的:
我们定义的bean类是这样的:
我们可以看出来,我们的属性名和表中的字段名是一摸一样的。
但是我们数据库表的字段以及表的命名风格和java中命名风格是不一样的。
如果我们数据库中的表定义成了这样:
然后我们更改查询语句:
<select id="findEmpById" parameterType="int" resultType="MyEmp">
select e_id, e_name, e_age,e_birthday, e_salary FROM emp WHERE e_id = #{id}
</select>
然后测试进行运行结果:
我们发现测试结果是成功的,但是返回的结果确是一个null.
我们再次进行更改查询语句:
<select id="findEmpById" parameterType="int" resultType="MyEmp">
select e_id id, e_name name, e_age age ,e_birthday, e_salary FROM emp WHERE e_id = #{id}
</select>
结果:
我们可以发现,这里起了字段的别名之后就可以获取成功了,这是因为进行查询的时候,会自动将结果对应字段名称和实体类的属性名进行对应然后将其封装进对象中。当表的字段名和属性名不一样的时候,可以利用起别名来进行弥补这个缺陷。
但是我们的SQL语句就会变得十分冗余,减低效率而且容易产生错误。
所以Mybatis还提供了另外一种方式:
既然都是要起别名的,不妨一次性起好,然后后面的语句直接用都行了。
代入到我们的代码中就是:
<!-- 位置是在mapper节点下
id:唯一标识
type:结果存储在什么样的对象中-->
<resultMap id="userResultMap" type="MyEmp">
<!-- id:是对主键的特殊配置符号,作用和下面的result一样,不过相对于效率较为高一点
column:数据库所对应的字段名
property:相对应对象中的属性名-->
<id column="e_id" property="id"/>
<!-- 非主键字段的设定方式 -->
<result column="e_name" property="name"/>
<result column="e_age" property="age"/>
<result column="e_birthday" property="birthday"/>
<result column="e_salary" property="salary"/>
</resultMap>
配置位置是在存储sql语句的mapper.xml中mapper节点中,和SQL语句并列。
然后改变查询语句:
<select id="findEmpById" parameterType="int" resultMap="userResultMap">
select e_id, e_name, e_age ,e_birthday, e_salary FROM emp WHERE e_id = #{id}
</select>
注意这里的结果类型 从 resultType 改变成了 resultMap ,里面的属性值为上面定义的resultMap的id值。
测试结果: