Mybatis对输出结果的封装(特殊情况)实体类属性和数据库类名不对应的时候

resultType配置结果类型 对于实体类 如果没有注册别名 那么我们必须使用全限定类名 还有就是 实体类中的属性名必须和数据库中的列名相对应 不然不能对其实现封装
对上面结果进行代码的演示:修改domain中实体类User 令其实体类中的属性名和数据库中的列名不一致 再生成其setter和getter方法 为了方便测试 再生成toString()方法
User类:这时候实体类中的属性名和数据库中的列名是不一致的
public class User implements Serializable {
private Integer userId;
private String userName;
private String userSex;
private Date userBirthday;
private String userAddress;

public Integer getUserId() {
    return userId;
}

public void setUserId(Integer userId) {
    this.userId = userId;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserSex() {
    return userSex;
}

public void setUserSex(String userSex) {
    this.userSex = userSex;
}

public Date getUserBirthday() {
    return userBirthday;
}

public void setUserBirthday(Date userBirthday) {
    this.userBirthday = userBirthday;
}

public String getUserAddress() {
    return userAddress;
}

public void setUserAddress(String userAddress) {
    this.userAddress = userAddress;
}

@Override
public String toString() {
    return "User{" +
            "userId=" + userId +
            ", userName='" + userName + '\'' +
            ", userSex='" + userSex + '\'' +
            ", userBirthday=" + userBirthday +
            ", userAddress='" + userAddress + '\'' +
            '}';
}

}
这时候测试类中出现了比较多的错误 因为实体中的setter方法改变了 那么我们可以进行修改 也可以对其进行注释 不影响结果
选择其中一个测试类 进行测试 就测试第一个查询所有用的方法testFindAll()

测试结果:
User{userId=null, userName='老王', userSex='null', userBirthday=null, userAddress='null'}
User{userId=null, userName='小王', userSex='null', userBirthday=null, userAddress='null'}
User{userId=null, userName='二王', userSex='null', userBirthday=null, userAddress='null'}
User{userId=null, userName='王二麻子', userSex='null', userBirthday=null, userAddress='null'}
为什么username中还有结果 这个是个假象 因为windows中的mysql是不区分大小写的 所以不要认为上面要求实体类的属性名和数据库中的列名相对应这个规定有例外

那么这种属性名和列名不对应的情况下我们该怎么进行处理呢??
方法一:使用别名进行查询

注意这里千万不能颠倒 因为这里是要把数据库中的列名和实体类中进行对应
再次运行测试结果
User{userId=41, userName='老王', userSex='男', userBirthday=Tue Feb 27 17:47:08 CST 2018, userAddress='北京'}
User{userId=43, userName='小王', userSex='女', userBirthday=Sun Mar 04 11:34:34 CST 2018, userAddress='深圳'}
User{userId=45, userName='二王', userSex='男', userBirthday=Sun Mar 04 12:04:06 CST 2018, userAddress='南京'}
User{userId=46, userName='王二麻子', userSex='男', userBirthday=Wed Mar 07 17:37:26 CST 2018, userAddress='天津'}
但是这种配置有一个缺点 如果我们每一个都使用别名 那么这会大大的减慢开发的速率 配置相当麻烦

方法二:可以建立实体类属性名和列名的对应关系 使用的标签resultMap

另外我们需要在相应的标签上指定resultMap

测试结果:
User{userId=41, userName='老王', userSex='男', userBirthday=Tue Feb 27 17:47:08 CST 2018, userAddress='北京'}
User{userId=43, userName='小王', userSex='女', userBirthday=Sun Mar 04 11:34:34 CST 2018, userAddress='深圳'}
User{userId=45, userName='二王', userSex='男', userBirthday=Sun Mar 04 12:04:06 CST 2018, userAddress='南京'}
User{userId=46, userName='王二麻子', userSex='男', userBirthday=Wed Mar 07 17:37:26 CST 2018, userAddress='天津'}

猜你喜欢

转载自www.cnblogs.com/phantom576/p/11945512.html
今日推荐