MyBatis如何处理自动映射失效的问题

1,120 阅读1分钟

前言

我们在使用 MyBatis 的时候,需要采用驼峰命名法,使数据库中的列名与实体类中的字段名相对应,以此来确保 MyBatis 的自动 ORM 映射可以正常使用。但总会有那么一些少数情况下,因为各种原因导致数据库中的列名与实体类中的字段名无法对应,此时 MyBatis 的自动 ORM 映射就无法正常识别了,如下所示。因此,我们需要采取一些措施来确保 MyBatis 能将数据库的列名与实体类中的字段名对应上。

user_iduser_nameuser_pwd
001aaa123
002bbb456
003ccc789
public class User {
    private String id;
    private String name;
    private String password;
    //...
}

方案一:列的别名

我们可以通过直接修改 MyBatis 中的 SQL 语句,在 SQL 中使用 as 为查询字段添加列别名,以此来匹配属性名。

<mapper namespace="com.test.mybatis.UserDao">
    <select id="selectUserByIdAndPwd" resultType="com.test.mybatis.UserDao">
        SELECT user_id AS id , user_name AS name , user_pwd AS password
        FROM user
        WHERE user_id = #{id} AND user_pwd = #{password}
    </select>
</mapper>

但这么做就会导致我们在每一次写与该表相关的语句时都要使用 as 来添加别名,一来会使操作更加繁琐,其次一旦次数多了难免遗忘,从而导致程序出错。因此,此方法只适用于该表的 SQL 语句非常少的情况。

方案二:结果映射(ResultMap - 查询结果的封装规则)

通过 < resultMap id="" type="" > 映射,来匹配列名与属性名。

使用 ResultMap 结果映射之后,往后的sql中的字段都可以直接按照数据库中的来写,大大简化了操作。

<mapper namespace="com.test.mybatis.UserDao">

    <!--定义resultMap标签-->
    <resultMap id="userResultMap" type="com.test.mybatis.UserDao">
      	<!--关联主键与列名-->
        <id property="id" column="user_id" />
      
      	<!--关联属性与列名-->
        <result property="name" column="user_name" />
        <result property="password" column="user_pwd" />
    </resultMap>
  
     <!--使用resultMap作为ORM映射依据-->
    <select id="selectAllUsers" resultMap="userResultMap">
        SELECT user_id , user_name , user_pwd
        FROM user
    </select>
</mapper>