前言
我们在使用 MyBatis 的时候,需要采用驼峰命名法,使数据库中的列名与实体类中的字段名相对应,以此来确保 MyBatis 的自动 ORM 映射可以正常使用。但总会有那么一些少数情况下,因为各种原因导致数据库中的列名与实体类中的字段名无法对应,此时 MyBatis 的自动 ORM 映射就无法正常识别了,如下所示。因此,我们需要采取一些措施来确保 MyBatis 能将数据库的列名与实体类中的字段名对应上。
| user_id | user_name | user_pwd |
|---|---|---|
| 001 | aaa | 123 |
| 002 | bbb | 456 |
| 003 | ccc | 789 |
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>