【小白日记】MyBatis 通过ResultMap解决属性名和字段名不一样的问题

ResultMap

  • 解决属性名和字段名不一致的问题
  • 环境:与之前相同,可新建项目并拷贝

密码查询为null问题

  1. 数据库字段名:

file

  1. Java中的实体类 (POJO):
public class User {

    private int id;  //id
    private String name;   //姓名
    private String pwd;   //密码和数据库不一样
    
    //构造
    //set/get
    //toString()
}

  1. 接口:
public interface UserMapper {
    // 根据id查询用户信息
    User selectUserById(int id);

}

  1. 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 最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们

当然了,如果世界真的有那么简单就好了

To be continue...

本文由博客一文多发平台 OpenWrite 发布!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值