首先我们这里说一个问题:当我们数据库中的字段名字和我们的实体类属性名不一致的时候能够查出结果吗?
我们来看看,首先我们有一个实体类和一个数据库
package pojo;
import org.apache.ibatis.type.Alias;
@Alias("User")
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
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 getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
可以看到数据库中的密码字段为password,但是我们的实体类却是叫pwd,接下来我们看看会出什么杨的结果。
测试类
import dao.UserDao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.MybatisUtils;
import java.util.List;
public class UserMapper {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
}
可以看到我们的结果,pwd是null,这是为什么呢,其实是因为类型处理器,数据库类型和Java类型进行转换的时候,他会去Java Bean中查找password,但是它发现它没有找到password这个属性。
那有没有解决方法呢?当然有
解决方法
第一种
我们在查询的时候给字段起别名
我们来看原来的Sql语句
select * from user where `id`=#{id};
等价于下面
select id,name,password from user where `id`=#{id};
然后我们稍微修改一下
select id,name,password as pwd from user where `id`=#{id};
第二种 使用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">
<mapper namespace="dao.UserDao">
<resultMap id="映射的结果集名字" type="哪个类型(我这里做了别名,没有的话要写全路径)">
<result property="实体类中的属性名" column="数据库中的字段名" />
</resultMap>
<select id="getUserById" parameterType="int" resultMap="UserMap">
select `id`,`name`,`password` from user where `id`=#{id};
</select>
</mapper>