MyBatis 通過ResultMap解決屬性名和字段名不一樣的問題

ResultMap
解決屬性名和字段名不一致的問題
環境:與之前相同,可新建項目並拷貝
密碼查詢爲null問題
數據庫字段名:

file
Java中的實體類 (POJO):
public class User {

    private int id;  //id
    private String name;   //姓名
    private String pwd;   //密碼和數據庫不一樣
    
    //構造
    //set/get
    //toString()
}

接口:
public interface UserMapper {
    // 根據id查詢用戶信息
    User selectUserById(int id);

}

Mapper.xml文件:
<select id="selectUserById" resultType="User">
    select * from mybatis.User where id =#{id}
</select>

5.測試類:

@Test
public void testSelectUserById(){
    SqlSession session = MybatisUtils.getSqlSession();
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user);
    session.close();
}

測試結果:

User{id=1, name='雞你太美', pwd='null'}
pwd爲空
問題分析:

sql語句:select * from user where id = #{id} 可以看做
select id,name,password from user where id = #{id}
mybatis會根據這些查詢的列名(會將列名轉化爲小寫,數據庫不區分大小寫) , 去對應的實體類中查找相應列名的set方法設值 , 由於找不到setPassword() , 所以pwd返回null ; 【自動映射】
解決方案
方法一:爲列名指定別名,別名和java實體類的屬性名一致
<select id="selectUserById" resultType="User">
    select id , name , password as pwd from user where id = #{id}
</select>

方法二:使用結果集映射->ResultMap
<resultMap id="UserMap" type="User">
    <!-- id爲主鍵 -->
    <id column="id" property="id"/>
    <!-- column是數據庫表的列名 , property是對應實體類的屬性名 -->
    <result column="name" property="name"/>
    <result column="password" property="pwd"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
    select * from mybatis.User where id =#{id}
</select>

如果只有password一個屬性名和字段名不符,那麼僅僅單獨映射一個password也是可以的

<resultMap id="UserMap" type="User">
    <result column="password" property="pwd"/>
</resultMap>

<select id="selectUserById" resultMap="UserMap">
    select * from mybatis.User where id =#{id}
</select>

總結
resultMap 元素是 MyBatis 中最重要最強大的元素
ResultMap 的設計思想是,對於簡單的語句根本不需要配置顯式的結果映射,而對於複雜一點的語句只需要描述它們的關係就行了。
ResultMap 最優秀的地方在於,雖然你已經對它相當瞭解了,但是根本就不需要顯式地用到他們
當然了,如果世界真的有那麼簡單就好了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章