mybatis查询及实体类映射

本文探讨了在MyBatis中使用继承关系的实体类进行查询时的情况。当一个POJO类如UserDemo继承自User类,并在Mapper接口和XML中定义查询时,查询结果会包含User类的所有属性。通过对UserDemo类增加字段并调整SQL查询,展示了如何通过别名映射特定属性。这种继承方式允许灵活扩展,便于不同业务场景下添加额外字段,而不会互相干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了做查询,做了一个pojo为UserDemo,且继承了User类。

public class UserDemo extends User{
        private String loginName;
        private String password;
}

User类里多了一些字段,例如id、email等。

public class User implements Serializable {
        @Id
        private Integer id;
        private String loginName;
        private String userName;
        private String password;
        private String email;
        private String address;
        private String platform;
        private Date createtime;
}

Mapper接口定义为:

UserDemo findOneUserDemoByLoginName(String loginName);

xml中的查询如下:

<select id="findOneUserDemoByLoginName" resultType="com.bonc.demojava.entity.UserDemo" parameterType="String">
        select id,login_name,password,sex,create_time from user where login_name = #{loginName}
</select>

业务代码为:

UserDemo userDemo = userMapper.findOneUserDemoByLoginName(loginName);
logger.info("根据loginName:"+loginName+",得到的userDemo信息:" + userDemo);

单元测试得知,查询到的userDemo对象中,竟然有User对象中的全部属性!!
为了进一步测试,我将UserDemo类做了改造,增加了sex字段(此字段在mapper中有查询),另外我将原来的password属性改成了pwd属性,如下:

public class UserDemo extends User{
        private String loginName;
        private String pwd;
        private String sex;
}

结果如下:
在这里插入图片描述
观察得出,userDemo对象中包含了userDemo和其继承的User类里的全部属性!!! 但是只有在mapper里查询到的字段才会有值。
进一步测试,我将mapper里的sql改一下,将password字段设置别名pwd:

<select id="findOneUserDemoByLoginName" resultType="com.bonc.demojava.entity.UserDemo" parameterType="String">
        select id,login_name,password as pwd,sex,create_time from user where login_name = #{loginName}
 </select>

这样得到的userDemo对象,pwd属性为123456,password属性为null。
当然,如果查询数据库时使用User对象来接收,必然是不会带pwd和sex这种专属于UserDemo对象的属性的。

这样使用继承类,方便扩展,比如公共的属性就放在User类里,业务A想要额外获取的字段放在UserDemo里,业务B想要额外获取的字段放在UserDemo2里,互不影响,非常灵活。

在这里插入图片描述

备注:此文章是二次编辑,第一次发表时非常疑惑,当时sql查询的字段较多,打印时发现userDemo里很多User的属性也有值。一个热心的网友给我分析,还教我分析思路,所以今天再次探索一下,感谢这位网友的引导:在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值