为了做查询,做了一个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的属性也有值。一个热心的网友给我分析,还教我分析思路,所以今天再次探索一下,感谢这位网友的引导: