解决数据库属性名和和实体类字段名的不一致问题.
在之前,第一篇笔记的注意中 获取到的结果里变为 null是由于数据库属性名和和实体类字段名的不一致,接下来使其具体的解决办法
首先,数据表展示
实体类(此时用户名、密码与数据表中对应属性不同)
public class User {
private int id;
private String username;
private String password;
//相应的方法省略
}
若不一致导致的结果,展示(调用getUserList方法)
@Test
public void getUserList(){
try(SqlSession sqlSession = MybatisUtils.getSqlSession();) {
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList();
userList.stream().forEach(System.out::println);
// return userList;
}
}
<select id="getUserList" resultType="user">
select * from mybatis.user;
<!-- select id,name,pwd from mybatis.user; -->
</select>
结果发现,username 和 password 值都为null
原因:在执行
select id,name,pwd from mybatis.user;
语句后的确是 返回正确的数据 (name,pwd都有对应的值(不是null)),但是在映射回User类是 在类中没有找到 pwd和name这两个字段,无法使用 相应的setter方法赋值,由于private String username,password; 默认值 为 null,在我们获取(getter)User类字段时 相应的username,password就为空
为了验证猜想,把初始值改为
private String username = "username";
private String password = "password";
说了原因,接下来就是解决方法了
解决方法.
1.给sql字段起别名.
<select id="getUserList" resultType="user">
select id,name as username,pwd as password from mybatis.user;
<!-- select * from mybatis.user; -->
</select>
2.使用ResultMap.
<!-- id 对应ResultMap type对应 映射返回类型 -->
<resultMap id="seletAllUser" type="pojo.User">
<!-- property:实体类字段 column:数据表属性 -->
<result property="username" column="name"/>
<result property="password" column="pwd"/>
</resultMap>
<select id="getUserList" resultMap="seletAllUser">
select * from mybatis.user;
</select>
结果映射(ResultMap).
resultMap
元素是 MyBatis 中最重要最强大的元素。
ResultMap
的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。