Bootstrap

mybatis多表查询的结果映射(resultMap)

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

;