问题:
下面是我们的数据库和实体类 可以看到pwd 和password是不一样的
CREATE TABLE `user`(
id INT(5) PRIMARY KEY,
`name` VARCHAR(15),
pwd VARCHAR(15)
);
public class User {
private int id;
private String name;
private String password; //这里设置的和数据库字段名不一样
public User() {
}
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public String getPwd() {
return password;
}
public void setPwd(String pwd) {
this.password = password;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + password + '\'' +
'}';
}
}
这样执行的结果如下: 结果显示pwd为null
为什么会这样写出通过完整的sql语句就知道了
<!--根据条件查询-->
<select id="getUserId" resultType="user" parameterType="int">
select (id,name,pwd) <!--我们sql语句查询的是pwd,但是我们的实体类的是password没有pwd座椅查询出来是null-->
from mybatis1.user
where id = #{id}
</select>
解决办法:
1、最简单的方式在sql语句中起别名数据少的时候可以用
<!--根据条件查询-->
<select id="getUserId" resultType="user" parameterType="int">
select id,name,pwd as password <!--在这里给pwd取个别名使得实体类属性名和数据库列明相同-->
from mybatis1.user
where id = #{id}
</select>
2、通过ResultMap结果映射集
<!--根据条件查询-->
<resultMap id="test" type="User"> <!--id对应下面resultMap的名字type对应实体类的名字-->
<!--property对应实体类的属性column对应数据库的列名-->
<result property="password" column="pwd"/>
</resultMap>
<select id="getUserId" parameterType="int" resultMap="test"><!--这里的返回值就
不用resultType而是用resultMap,返回的名字自定义,一个resultMap要对应一个<resultMap>标签-->
select *
from mybatis1.user
where id = #{id}
</select>