Mybait多张表查询时的结果映射resultMap
1、mybatis简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。它可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2、resultMap(多表查询 或 数据库列名与实体属性名不一致时使用)
resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。
主要用法:
(1)一对一关系查询(这时候简单的用resultType就行)
<select id="findEnterPriseInfor" resultType="EnterpriseInfor">//id接口方法明 resultType返回结果的类型
select * from enterprise_infor where username=#{username}
</select>
(2)多对一关系查询
职位实体类(企业发布职位 每个企业可以发布多个职位,多个职位属于一个企业)
public class EnterprisePosition {
private String username;
private int id;
private String positionType;
private String positionName;
private String jobCity;
private String jobNature;
private String jobExperience;
private String eduRequirement;
private int minSalary;
private int maxSalary;
private String mailbox;
private String positionTale;
private String positionRequirement;
private String positionLure;
private Timestamp publishedDate;
private int clickNum;//点击次数
//关联属性 多对一
private EnterpriseInfor enterpriseInfor;//企业对象
public EnterprisePosition() {
super();
// TODO 自动生成的构造函数存根
}
// get、set方法省略
}
企业实体类
public class EnterpriseInfor {
private String username;
private String entername;
private String mailbox;
private String address;
private String website;
private String sector;//工业领域
private String scale;//规模大小
private String establishtime;//建立时间
private String nature;//经营性质
private String lure;//公司福利
private String develop;//发展阶段
private String tale;
public EnterpriseInfor() {
super();
// TODO 自动生成的构造函数存根
}
查询要求,查询所有企业已发布的职位信息,以及对应企业的个别信息
(意思就是要结果里有职位信息,以及对应企业的个别信息)
思路:首先按要求,从职位表中查询所有职位信息,从企业表中查询企业的个别信息
<select id="接口方法名" resultMap="position1Map">//resultMap属性可以说是个id名,用来和下面的reslutMap标签匹配
select p.*, e.entername, e.sector, e.scale, e.develop, e.lure
//查询p表(职位信息表)的所有信息,查询e表(企业表)的个别信息
from enterprise_position p, enterprise_infor e//职位表别名 p 企业表别名 e
where p.username = e.username
order by p.clicknum DESC<!-- DESC降序 (最好大写) ASC 升序默认-->
</select>
思路:写好sql语句后,返回的结果中包含两个实体,所以这时就要用到resultMap
首先用resultMap的type属性指定返回结果的类型 职位类型 EnterprisePosition
(这里是多对一查询,在职位实体的属性中,有个企业对象enterpriseInfor)
指定好结果类型后,先处理职位信息实体
使用id、result标签将数据库列名和实体属性名一一对应 column对应数据库列名,property对应实体属性名
(id标签是专用来对应id列的,另外结果用到多少属性,便result多少属性 我这里都用到了,所以便都写上了)
<resultMap type="EnterprisePosition" id="position1Map">//type是返回结果的实体类
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="positionname" property="positionName"/>
<result column="positiontype" property="positionType"/>
<result column="jobcity" property="jobCity"/>
<result column="jobnature" property="jobNature"/>
<result column="jobexperience" property="jobExperience"/>
<result column="edurequirement" property="eduRequirement"/>
<result column="minsalary" property="minSalary"/>
<result column="maxsalary" property="maxSalary"/>
<result column="mailbox" property="mailbox"/>
<result column="positiontale" property="positionTale"/>
<result column="positionlure" property="positionLure"/>
<result column="positionrequirement" property="positionRequirement"/>
<result column="publisheddate" property="publishedDate"/>
<result column="clicknum" property="clickNum"/>
将职位信息实体的数据库列名和实体属性名一一对应后,再处理职位信息实体中的企业对象enterpriseInfor
这里用association标签,它可以用来映射实体中的对象
<association property="对象属性名" javaType="模型类名">
指定好association后,再用result指定要使用(返回)的结果对象属性
!!注意,当结果实体中包含的List等集合对象,就不能用association标签了,这时就要使用collection标签
<association property="enterpriseInfor" javaType="EnterpriseInfor">
<!-- 对象联系 用javatype 集合Collection 用oftype -->
<result column="username" property="username"/>
<result column="entername" property="entername"/>
<result column="sector" property="sector"/>
<result column="scale" property="scale"/>
<result column="lure" property="lure"/>
<result column="develop" property="develop"/>
</association>
</resultMap>
3、结论
当用到多张表进行查询的时候,用resultMap是最好的处理方式
参考:
https://fengkay.blog.csdn.net/article/details/103559483