ResultMap
- 解决属性名和字段名不一致的问题
- 环境:与之前相同,可新建项目并拷贝
密码查询为null问题
- 数据库字段名:
- Java中的实体类 (POJO):
public class User {
private int id; //id
private String name; //姓名
private String pwd; //密码和数据库不一样
//构造
//set/get
//toString()
}
- 接口:
public interface UserMapper {
// 根据id查询用户信息
User selectUserById(int id);
}
- Mapper.xml文件:
<select id="selectUserById" resultType="User">
select * from mybatis.User where id =#{id}
</select>
5.测试类:
@Test
public void testSelectUserById(){
SqlSession session = MybatisUtils.getSqlSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
测试结果:
- User{id=1, name='鸡你太美', pwd='null'}
- pwd为空
问题分析:
- sql语句:select * from user where id = #{id} 可以看做
select id,name,password from user where id = #{id} - mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPassword() , 所以pwd返回null ; 【自动映射】
解决方案
- 方法一:为列名指定别名,别名和java实体类的属性名一致
<select id="selectUserById" resultType="User">
select id , name , password as pwd from user where id = #{id}
</select>
- 方法二:使用结果集映射->ResultMap
<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="password" property="pwd"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
select * from mybatis.User where id =#{id}
</select>
如果只有password一个属性名和字段名不符,那么仅仅单独映射一个password也是可以的
<resultMap id="UserMap" type="User">
<result column="password" property="pwd"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
select * from mybatis.User where id =#{id}
</select>
总结
- resultMap 元素是 MyBatis 中最重要最强大的元素
- ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
- ResultMap 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们
当然了,如果世界真的有那么简单就好了
To be continue...
本文由博客一文多发平台 OpenWrite 发布!