ResultMap用于解决属性名和字段名不一致的问题
新创建一个model,取名MyBatis-03,复制粘贴MyBatis-03中的所有东西
直接粘贴是有问题的,粘贴之后注意修改两个地方
①mybatis-config.xml中mapper节点引入的地址,它多了一个com
②UserMapper.xml的mapper节点的namespace,它多了一个com
直接把多余的删除即可
开始正题
1、解决属性名和字段名不一致导致的空值问题
我们可以发现现在的问题就是数据库中的password字段为NULL
原因
但是此时的user对象中已经没有了setPwd的方法可以调用,而查询出来的pwd字段与其对应的字段值只能set个寂寞,所以对象user的password属性值为空
解决
- 起别名:修改原来的SQL语句
select id,name ,pwd as password from mybatis.user where id = #{id}
因为起了别名,在user中可以找到setPassword(),所以pwd就不为空了,但是这样显然不是我们追求到的方法,万一整张表字段成百上千,修改SQL语句还不把人写死
- 使用结果集映射ResultMap
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thhh.dao.UserMapper"><!--属性namespace,即命名空间,用于绑定一个 mapper/dao 接口-->
<!--②创建一个resultMap节点,将其id属性设为①中设置的resultMap的属性值,type属性设置为集合中元素的类型-->
<resultMap id="UserMap" type="User">
<!--设置映射规则,column属性代表数据表中的字段名,property代表实体类中的属性名
这里就是将二者之间的映射显示的写出来,这样在返回的时候就算字段名称和属性名称不一致,也知道怎么设置实体类的属性值-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<!--①返回值属性从resultType改为resultMap,并设置属性值为自定义的一个resultMap的值-->
<select id="getUserById" resultMap="UserMap">
select * from mybatis.user where id = #{id}
</select>
</mapper>
2、什么是ResultMap
-
resultMap 元素是 MyBatis 中最重要最强大的元素
-
ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
-
一个 JavaBean 可以被映射到 ResultSet
-
当我们查询的是一个JavaBean对应的表时,MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上
- 所以ResultMap就可以视为时JavaBean与其对应的数据表之间的连接桥梁
-
ResultMap 的优秀之处——只要是POJO的属性名称和数据表中的字段名称相同的,你完全可以不用显式地配置它们,而只需要配置二者不同的地方
按照特点3我们来改造前面的代码