问题
数据库中的字段与实体类字段不一致
这时如果查询用户信息,不同的字段则会为空
解决方法
方法一:在sql语句中起别名
<select id="getUserById" parameterType="int" resultType="User">
select id, name, pwd as `password` from `user` where id = #{id}
</select>
方法二:使用resultMap结果集映射
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.yuan.dao.UserMapper">
<resultMap id="Usermap" type="User">
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="Usermap">
select *
from mybatis.user
where id = #{id}
</select>
</mapper>
输出结果
小结
- resultMap 元素是 MyBatis 中最重要最强大的元素
- resultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了
- resultMap 的优秀之处——你完全可以不用显式地配置它们
- resultMap的元素的概念
constructor
- 用于在实例化类时,注入结果到构造方法中idArg
- ID 参数;标记出作为 ID 的结果可以帮助提高整体性能arg
- 将被注入到构造方法的一个普通结果
id
– 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能result
– 注入到字段或 JavaBean 属性的普通结果- column - 数据库里的字段名字(即表的列)
- property - 实体类里的字段名字或别名
association
– 一个复杂类型的关联;许多结果将包装成这种类型- 嵌套结果映射 – 关联可以是
resultMap
元素,或是对其它结果映射的引用 - javaType - 给属性(column) 赋值类型
- 嵌套结果映射 – 关联可以是
collection
– 一个复杂类型的集合- 嵌套结果映射 – 集合可以是
resultMap
元素,或是对其它结果映射的引用
- 嵌套结果映射 – 集合可以是
discriminator
– 使用结果值来决定使用哪个resultMap
case
– 基于某些值的结果映射- 嵌套结果映射 –
case
也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
- 嵌套结果映射 –
resultMap 的属性列表
id | 当前命名空间中的一个唯一标识,用于标识一个结果映射。 |
type | 类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。 |
autoMapping | 如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。 |
例:
<select id="getStudentList" resultMap="studentTeacherMap">
select stu.id,stu.name,stu.tid from student stu;
</select>
<resultMap id="studentTeacherMap" type="com.zyy.pojo.Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--
复杂的属性,我们需要单独处理
对象:association
集合:collection
-->
<association property="teacher" column="tid" javaType="com.zyy.pojo.Teacher" select="getTeacherList"/>
</resultMap>