解決屬性名和字段名不一致的問題
1. 問題
在數據庫中,密碼字段為pwd,而在實體類中為password
package com.wang.pojo;
public class User {
private int id;
private String name;
private String password;
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
測試出現問題
package com.wang.dao;
import com.wang.pojo.User;
import com.wang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
//
@Test
public void testGetUserById() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
}
User{id=1, name='張三', password='null'}
select * from mybatis.user where id = #{id};
等同於
select id, name, pwd from mybatis.user where id = #{id};
MyBatis 在設置預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器將獲取到的值以合適的方式轉換成 Java 類型。
經過類型處理器處理后,此時,在實體類中找不到pwd的字段
.解決方法:
- 起別名: pwd as password
<?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.wang.dao.UserMapper">
<select id="getUserById" parameterType="int" resultType="User">
select id, name, pwd as password from mybatis.user where id = #{id};
</select>
</mapper>
2. ResultMap
結果集映射
數據庫 id name pwd
實體類 id name password
<?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.wang.dao.UserMapper">
<!--使用resultMap時,此處不要指定resultType,在下面寫resultMap時再指定其type屬性-->
<select id="getUserById" parameterType="int" resultMap="UserMap">
select * from mybatis.user where id = #{id};
</select>
<!--結果集映射 resultMap id = 找到要映射的標簽(在上面的resultMap中設定的標簽)-->
<resultMap id="UserMap" type="User">
<!--column 數據庫中的字段; property 實體類中的屬性-->
<result column="pwd" property="password"/>
</resultMap>
</mapper>