介绍
例:学生表,班级表,希望在查询学生的时候一起返回该学生的班级,而一个实体类封装的是一个表,如需要多表查询就需要自定义映射。
表结构
班级表
学生表
SQL语句
SELECT a.id,a.name,a.classes,b.id classesId,b.name classesNmae
FROM students a,classes b WHERE a.name='蔡徐坤' and a.classes=b.id
实体类
班级类
@Data
public class Students {Long id;String name;}
学生类
@Data
public class Classes {Long id;String name;
}
Vo类 (返回前端)
@Data
public class StudentsVo {Students students;Classes classes;
}
Mapper
查询语句
<select id="list" resultMap="listMap">SELECT a.id,a.name,a.classes,b.id classesId,b.name classesNmae FROM students a,classes b WHERE a.name=#{name} and a.classes=b.id
</select
映射规则
id:自定义规则的名称,可以当作是一个方法
type:封装到哪个类
association :一对一
javaType:子对象,如果 学生 或 班级
autoMapping:false 或 true true为自动映射属性,如果属性名和字段名一致就可以使用,不一致时使用result
<!--自定义映射规则--><resultMap id="listMap" type="com.example.demo.demos.web.pojo.vo.StudentsVo" ><association property="students" javaType="com.example.demo.demos.web.pojo.Students" autoMapping="true"></association><!--封装学生类--><association property="classes" javaType="com.example.demo.demos.web.pojo.Classes" autoMapping="true"><id property="id" column="classesId" ></id><result property="name" column="classesNmae"></result></association><!--封装班级类--></resultMap>
id:表示是主键
result:属性名不一致是使用
property:实体类属性名
column:数据字段名
结果
{"code": 200,"msg": "获取成功","data": [{"students": {"id": 18,"name": "蔡徐坤"},"classes": {"id": 1,"name": "大数据5"}},{"students": {"id": 21,"name": "蔡徐坤"},"classes": {"id": 2,"name": "大数据1"}}]
}
这里json分为两个对象封装了,一个存学生,一个存班级,也可以把学生直接存到学生对象里。
优化
修改学生的实体类,直接把班级类定义
学生实体类
@Data
public class Students {Long id;String name;//班级消息Classes belong;
}
Mapper
<!--自定义映射规则-->
<resultMap id="listMap" type="com.example.demo.demos.web.pojo.Students" ><!--设置主键--><id property="id" column="id"></id><!--字段映射到属性--><result property="name" column="name"></result><!--属性和字段但一致的情况下可以使用autoMapping="true"--><association property="belong" javaType="com.example.demo.demos.web.pojo.Classes" ><id property="id" column="classesId"></id><result property="name" column="classesNmae"></result></association><!--班级信息封装的类--></resultMap>
一样的效果,都可以查出,但是结构更好一点
{"code": 200,"msg": "获取成功","data": [{"id": 18,"name": "蔡徐坤","belong": {"id": 1,"name": "大数据5"}},{"id": 21,"name": "蔡徐坤","belong": {"id": 2,"name": "大数据1"}}]
}