例如这样的场景:学生和班级是多对一的关系,我们在查询学生(Student)的时候,(t_student表有一个clazz_id会对应到t_clazz表的ID),希望自动带出这个学生所属的班级(Clazz)
多方(Student)的Mapper.xml:
注意这里使用了association来表明Student下面的有对应一的属性:clazz(这个学生所属班级)
<?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.test.mapper.StudentMapper"> <resultMap id="BaseResultMap" type="com.test.Student"> <[email protected]> <!--@Table t_lab--> <id column="id" jdbcType="INTEGER" property="id"/> <result column="create_date" jdbcType="TIMESTAMP" property="createDate"/> <result column="update_date" jdbcType="TIMESTAMP" property="updateDate"/> <result column="name" jdbcType="VARCHAR" property="name"/> <association property="clazz" javaType="com.test.Clazz"> <id column="id" jdbcType="INTEGER" property="id" /> <result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> <result column="update_date" jdbcType="TIMESTAMP" property="updateDate" /> <result column="name" jdbcType="VARCHAR" property="name" /> </association> </resultMap> <sql id="Base_Column_List"> <[email protected]> id, create_date, update_date, `name` </sql> </mapper>
一方(Clazz)的mapper.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.test.mapper.ClazzMapper"> <resultMap id="BaseResultMap" type="com.test.entity.Clazz"> <[email protected]> <!--@Table t_department--> <id column="id" jdbcType="INTEGER" property="id" /> <result column="create_date" jdbcType="TIMESTAMP" property="createDate" /> <result column="update_date" jdbcType="TIMESTAMP" property="updateDate" /> <result column="name" jdbcType="VARCHAR" property="name" /> </resultMap> <sql id="Base_Column_List"> <[email protected]> id, create_date, update_date, `name` </sql> </mapper>
来看下实体类 Student.java,里面有一个clazz属性
@TableName(value = "t_student", resultMap = "BaseResultMap") public class Lab implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; @TableField(value = "create_date") private Date createDate; @TableField(value = "update_date") private Date updateDate; @TableField(value = "`name`") private String name; // 学生姓名 private Clazz clazz; // 学生所属班级 }
Clazz.java 就比较简单,常规属性
@TableName(value = "t_clazz", resultMap = "BaseResultMap") public class Lab implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Integer id; @TableField(value = "create_date") private Date createDate; @TableField(value = "update_date") private Date updateDate; @TableField(value = "`name`") private String name; // 班级名称 }
在接下来的关于Student查询中,MyBatisPlus会自动做连表查询,把clazz带入进去:
LambdaQueryWrapper<Student> labLambdaQueryWrapper = new LambdaQueryWrapper<>(); List<Student> students = studentMapper.selectList(labLambdaQueryWrapper); students.forEach(student -> student.getClazz()); // 查询student下的clazz已经自动有值了 Student student1 = studentMapper.selectById(1);// 根据ID查student student1.getClazz(); // 也是自动赋值了
文章评论