5、Mybatis解决属性名和字段名不一致的问题——ResultMap

5.1、问题

要解决的问题:属性名和字段名不一致
环境:新建一个项目,将之前的项目拷贝过来

1、数据库user表原有字段
在这里插入图片描述
2、Java中的实体类设计

public class User {
    private int id;  //id
    private String name;  //姓名
    private String password;  //密码和数据库不一样!
    //构造方法
    //set/get
    //toString
}

3、接口

    User getUserById(int id);

4、mapper映射文件

    <select id="getUserById" resultType="com.chen.pojo.User" parameterType="int">
        select * from user where id = #{id};
    </select>

5、测试

    @Test
    public void getUserLike(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.commit();
        sqlSession.close();
    }

结果出现问题:User{id=1, name='张三', password='null'}
分析:

  • select * from user where id = #{id} 可以看作
  • select id,name,pwd from user where id = #{id}
  • MyBatis会根据这些查询的列名(会将列名转化成小写,数据库不区分大小写),去对应的实体类中查找相应列名的set方法设置,由于找不到setPwd(),所以password返回null;【自动映射】

解决方案:

  • 方案一:起别名
   <select id="getUserById" resultType="com.chen.pojo.User" parameterType="int">
       select id,name,pwd as password from user where id = #{id};
   </select>
  • 方案二:使用结果映射集–>ResultMap【推荐】
   <!-- 结果集映射 -->
   <resultMap id="UserMap" type="User">
       <!-- column对应数据库中的字段,property对应实体类中的属性 -->
       <id column="id" property="id"/>
       <result column="name" property="name"/>
       <result column="pwd" property="password"/>
   </resultMap>

   <select id="getUserById" resultMap="UserMap">
       select * from user where id = #{id};
   </select>

注意:这里实体类属性和数据库字段不一致的那个property,IDEA可能报红,但是能正常运行,其原因是安装了Mybatis plugin,MybatisX等插件,删掉就正常了。

5.2、resultMap

自动映射

  • ResultMap 元素是MyBatis中最重要最强大的元素。它可以让你从90%的JDBC代码中解放出来。
  • 实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份ResultMap能够替代实现相同功能的长达数千行的代码。
  • ResultMap 的设计思想是,对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
    你已经见过简单映射语句的示例了,但并没有显示指定ResultMap。比如:
<select id="selectUserById" resultType="map">
select id , name , pwd
  from user
  where id = #{id}
</select>

上述语句只是简单地将所有的列映射到HashMap的键上,这由resultType属性指定。虽然在大部分情况下都够用,但是HashMap不是一个很好的模型。你的程序更可能会使用JavaBean或POJO(Plain Old Java Objects,普通老式Java对象)作为模型。
ResultMap最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他=们。

手动映射

1、返回值类型为resultMap

    <select id="getUserById" resultMap="UserMap">
        select * from user where id = #{id};
    </select>

2、编写ResultMap,实现手动映射!

   <resultMap id="UserMap" type="User">
       <!-- column对应数据库中的字段,property对应实体类中的属性 -->
       <id column="id" property="id"/>
       <result column="name" property="name"/>
       <result column="pwd" property="password"/>
   </resultMap>

id对应的是数据库中的主键字段

视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?p=10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值