一对一关联
<association></association> 表示一对一关系
举例:
<resultMap type="包名" id="basicMap">
<association
property="dept"
column="deptno"
select="方法名">
</association>
</resultMap>
<select id="getById" resultMap="basicMap">
select * from emp where empno = #{empno}
</select>
补充一个内容:
列名和属性名不一致
<resultMap></resultMap>标签
<resultMap type="包名" id="basicMap">
<id column="***" property="***" />
<result column="***" property="***"/>
<result column="***" property="***"/>
</resultMap>
<id>
:用来映射标识列(数据库中的主键列)
<result>
:用来映射普通的结果(非主键列)
column:列名
property:属性名
补充完内容咱们再看上文的一对一关联
完整版:尤其注意标签的一行,其中 property是在实体类中的成员变量:
在Emp(员工类)中 有一个 Dept类型的成员变量,所以这个地方要这么写。
<resultMap type="com.neu.po.Emp" id="basicMap">
<id column="empno" property="empno"></id>
<result column="job" property="job"/>
<result column="mgr" property="mgr"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
<result column="ename" property="ename"/>
<association property="dept" javaType="com.neu.po.Dept">
<id column="deptno" property="deptno"></id>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
</association>
</resultMap>
<select id="getById" resultMap="basicMap">
SELECT e.*,d.dname,d.loc
FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE e.empno = #{empno}
</select>
一对多关联
<collection></collection>
大家主要关注含有该标签的行数
下面给出java创建的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {
private Integer deptno;
private String dname1;
private String loc;
//表示该部门的所有员工
List<Emp> emps;
}
注:
@Data
@AllArgsConstructor (含有全部参数构造)
@NoArgsConstructor ( 无参构造)
这三个标签:是通过引用lomok包后使用的注解,
lomok大幅度精简了代码,通过注解的方式,缩减代码行数
其中引入lomok包通过pom.xml配置
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
第一种:用<resultMap>
标签来映射所有属性
<resultMap type="com.neu.po.Dept" id="basicMap">
<id column="deptno" property="deptno" />
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<collection property="emps" ofType="com.neu.po.Emp">
<id column="empno" property="empno"></id>
<result column="job" property="job"/>
<result column="mgr" property="mgr"/>
<result column="hiredate" property="hiredate"/>
<result column="sal" property="sal"/>
<result column="comm" property="comm"/>
<result column="ename" property="ename"/>
</collection>
</resultMap>
<select id="getById" resultMap="basicMap">
SELECT e.*,d.dname,d.loc
FROM emp e LEFT JOIN dept d
ON e.deptno = d.deptno
WHERE e.deptno = #{deptno}
</select>
第二种:通过select属性来进行方法的调用,映射其他Mapper文件中的已写好的查询方法进行实现。
<resultMap type="com.neu.po.Dept" id="basicMap">
<id column="deptno" property="deptno" />
<result column="dname" property="dname1"/>
<!-- <result column="loc" property="loc"/> -->
<collection
property="emps"
column="deptno"
select="com.neu.mapper.EmpMapper.getByDeptno">
</collection>
</resultMap>