关联映射概念
关联映射,ManyToOne(多对一)、OneToMany(一对多)
一对多关系,一般是一个表的主键对应另一个表的非主键,主键的值是不能重复的,而非主键值是可以重复的,一个主键值对应另一个表的非主键的值,那么就只有一个值对一个值或一个值对多个值两种可能,故称一对多。
一对多关系:表一(主键)对应表二(关联主键),一对多反过来就多对一,多对一关系:表一(关联主键)对应表二(主键)
文本标题应该是一对多<与前节反过来了>,参考:一对多,应用案例
案例代码
基于注解方式
Model:
package com.what21.demo03.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.List;
@Data
@TableName("dept")
public class Dept {
// ID
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 名称
private String name;
// 部门下的员工
private List<Employee> employeeList;
}
package com.what21.demo03.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("emp")
public class Employee {
// ID
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 名称
private String name;
// 邮箱
private String email;
// 性别
private String gender;
// 年龄
private Integer age;
// 创建时间
private Date createTime;
// 所属部门
private Dept dept;
}
Mapper代码:
package com.what21.demo03.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.what21.demo03.model.Dept;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;
import org.springframework.stereotype.Repository;
@Repository("deptMapper3")
public interface DeptMapper extends BaseMapper<Dept> {
@Results(id = "deptMap", value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "name", property = "name"),
@Result(column = "id", property = "employeeList"
, many = @Many(select = "com.what21.demo03.mapper.EmployeeMapper.getEmpsByDeptId",
fetchType = FetchType.LAZY))
})
@Select("select * from `dept` where `id`=#{id}")
public Dept getById(@Param("id") Integer id);
}
package com.what21.demo03.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.what21.demo03.model.Employee;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("employeeMapper3")
public interface EmployeeMapper extends BaseMapper<Employee> {
@Results(id = "employeeMap", value = {
@Result(column = "id", property = "id", id = true),
@Result(column = "name", property = "name"),
@Result(column = "email", property = "email"),
@Result(column = "gender", property = "gender"),
@Result(column = "age", property = "age"),
@Result(column = "age", property = "age")
})
@Select("select * from `emp` where `id`=#{id}")
public List<Employee> getEmpsByDeptId(Integer id);
}
测试:
package com.what21.demo03.tester;
import com.what21.demo03.mapper.DeptMapper;
import com.what21.demo03.model.Dept;
import com.what21.demo03.model.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmployeeMapperTester {
@Resource(name = "deptMapper3")
DeptMapper deptMapper;
@Test
public void testList() {
Dept dept = deptMapper.getById(1);
System.out.println("dept==>" + dept);
List<Employee> beanList = dept.getEmployeeList();
beanList.forEach(employee -> {
System.out.print(employee);
System.out.println("==>,所属部门:" + employee.getDept());
});
}
}
基于XML配置
Model:
package com.what21.demo04.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.List;
@Data
@TableName("dept")
public class Dept {
// ID
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 名称
private String name;
// 部门下的员工
private List<Employee> employeeList;
}
package com.what21.demo04.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("emp")
public class Employee {
// ID
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 名称
private String name;
// 邮箱
private String email;
// 性别
private String gender;
// 年龄
private Integer age;
// 创建时间
private Date createTime;
// 所属部门
private Dept dept;
}
Mapper
package com.what21.demo04.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.what21.demo04.model.Dept;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
@Repository("deptMapper4")
public interface DeptMapper extends BaseMapper<Dept> {
public Dept getById(@Param("id") Integer id);
}
package com.what21.demo04.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.what21.demo04.model.Employee;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("employeeMapper4")
public interface EmployeeMapper extends BaseMapper<Employee> {
public List<Employee> getEmpsByDeptId(Integer id);
}
XML映射文件
DeptMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.what21.demo04.mapper.DeptMapper">
<resultMap id="deptResultMap" type="com.what21.demo04.model.Dept">
<id column="id" property="id"/>
<result column="name" property="name"/>
<collection column="id" property="employeeList" ofType="com.what21.demo04.model.Employee"
select="com.what21.demo04.mapper.EmployeeMapper.getEmpsByDeptId">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="age" property="age"/>
<result column="create_time" property="createTime"/>
</collection>
</resultMap>
<select id="getById" parameterType="int" resultMap="deptResultMap">
select * from `dept` where id=#{id}
</select>
</mapper>
EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.what21.demo04.mapper.EmployeeMapper">
<resultMap id="employeeResultMap" type="com.what21.demo04.model.Employee">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="age" property="age"/>
<result column="create_time" property="createTime"/>
</resultMap>
<select id="getEmpsByDeptId" parameterType="int" resultMap="employeeResultMap">
select * from `emp` where `id`=#{id}
</select>
</mapper>
测试类:
package com.what21.demo04.tester;
import com.what21.demo04.mapper.DeptMapper;
import com.what21.demo04.model.Dept;
import com.what21.demo04.model.Employee;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmployeeMapperTester {
@Resource(name = "deptMapper4")
DeptMapper deptMapper;
@Test
public void testList() {
Dept dept = deptMapper.getById(1);
System.out.println("dept==>" + dept);
List<Employee> beanList = dept.getEmployeeList();
beanList.forEach(employee -> {
System.out.print(employee);
System.out.println("==>,所属部门:" + employee.getDept());
});
}
}