使用Mybatis进行查询后,得到的结果需要进行封装,可封装的类型如下:

  • 简单类型:如查询总记录条数返回的int
  • POJO对象:一个user对象
  • POJO对象列表:多个user对象的list集合

使用实体类对象进行结果集封装的前提是数据库列名和实体类属性名要一致,那不一致会怎么样呢?毫无疑问会出错,解决办法如下:

##1.调整OGNL表达式-起别名

最简单的方式就是改写OGNL表达式的写法,实体类的getXxx中的Xxx是怎样写的,那么OBGL表达式的属性也要写成一样的。

比如实体类的属性及get、set方法如下:

public class UserOld implements Serializable {
    private Integer userId;
    private String userName;
    private Date userBirthday;
    private String userSex;
    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 Date getUserBirthday() {
        return userBirthday;
    }

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

    public String getUserSex() {
        return userSex;
    }

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

    public String getUserAddress() {
        return userAddress;
    }

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

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

那么映射配置文件和SQL语句的OGNL表达式的写法也应该改变:

这是修改操作时的写法

<update id="updateUser" parameterType="com.eastnotes.domian.User">
    update user set username=#{userName}, address=#{userAddress}, sex=#{userSex}, birthday=#{userBirthday} where id=#{userId}
</update>

这是查询时的写法,不修改,结果与实体类不匹配,无法进行封装。

<select id="findAll" resultType="com.eastnotes.domian.User">
    select id as userId, username as userName, birthday as userBirthday, address as userAddress, sex as userSex from user
</select>

##2.使用配置的方式

上面是在sql语句的层面上使用别名的方式来解决数据库列名和实体类属性名不一致的问题,但是这样做未免有些太过于麻烦,其实,Mybatis提供了一种配置的方式来解决这个问题。使用的是一个新的标签:resultMap

通过这个标签,我们可以配置数据库列名和实体类属性的对应关系:

<!--配置数据库列名和实体类属性的对应关系-->
<resultMap id="userMap" type="com.eastnotes.domian.User">
    <!--主键字段对应的配置-->
    <id property="userId" column="id"></id>

    <!--非主键字段对应的配置-->
    <result property="userName" column="username"></result>
    <result property="userAddress" column="address"></result>
    <result property="userSex" column="sex"></result>
    <result property="userBirthday" column="birthday"></result>
</resultMap>

property代表的是实体类中的属性名(严格区分大小写),column代表的是数据表中的列名。

写完这个标签之后,我们就可以在select等标签中使用它了,使用的方式就是讲resultType属性替换成resultMap属性,然后属性值是resultMap标签中配置的id属性值

<select id="findAll" resultMap="userMap">
    select * from user
</select>

然后其他的配置都可以使用resultMap属性进行改写了。

3.总结

这两种方式各有优缺点:

  • 起别名运行效率高但是开发效率低
  • 配置的方式开发效率高,但是相对于起别名运行效率低

视情况而取舍即可。