在Mybatis中,能够使用resultMap(结果集映射)做为sql的返回类型java
通常用来解决以下问题:sql
数据库表字段名和实体类属性名不一致的问题处理数据库
id name pwd //数据库字段名 id name password //实体类属性名
Mapper中SQL语句编写以下:mybatis
<!--结果集映射--> <resultMap id="UserMap" type="User"> <!--column为数据库中的字段名,property为实体中的属性--> <result column="id" property="id"/> <result column="name" property="name"/> <result column="pwd" property="password"/> </resultMap> <select id="getUserById" resultType="UserMap"> select * from mybatis.user where id=#{id}; </select>
得到全部学生及其对应老师(多个学生对应一个老师)app
Student类this
@Data //get,set @NoArgsConstructor //无参构造 @AllArgsConstructor //有参构造 public class Student{ int id; String name; Teacher teacher; }
Teacher类code
@Data //get,set @NoArgsConstructor //无参构造 @AllArgsConstructor //有参构造 public class Teacher{ int id; String name; public Teacher() { } public Teacher(int id, String name) { this.id = id; this.name = name; } }
联表查询xml
<select id="getStudents" resultMap="StudentMap"> select s.id sid, s.name sname, t.name tname from student s join teacher t on s.tid = t.id </select> <resultMap id="StudentMap" type="Student"> <!--这里的column是与查询结果的字段名对应,字段重命名了则对应命名后的字段--> <result property="id" column="sid"/> <result property="name" column="sname"/> <!--复杂的属性须要单独处理 对象:association 集合:collection--> <association property="teacher" javaType="Teacher"> <result property="name" column="tname"/> </association> </resultMap>
至关于子查询:对象
<select id="getStudent2" resultMap="StudentMap2"> select * from student; </select> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{tid}; </select> <!--这里将学生和对应老师分开查询,将查询结果组合--> <resultMap id="StudentMap2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap>
查询结果:ci
Student{id=1, name='zhangsan', teacher=Teacher{id=1, name='spong'}} Student{id=2, name='lisi', teacher=Teacher{id=1, name='spong'}}
按指定ID查询老师及其所管理的学生(一个老师对应多个学生)
Student类
@Data //get,set @NoArgsConstructor //无参构造 @AllArgsConstructor //有参构造 public class Student { int id; String name; int tid; public Student() { } public Student(int id, String name, int tid) { this.id = id; this.name = name; this.tid = tid; } }
Teacher类
@Data //get,set @NoArgsConstructor //无参构造 @AllArgsConstructor //有参构造 public class Teacher { int id; String name; List<Student> students; }
<select id="getTeacherById" resultMap="TeacherById"> select t.id id, t.name tname, s.id sid,s.name sname,s.tid tid from teacher t join student s on t.id = s.tid; </select> <resultMap id="TeacherById" type="Teacher"> <result property="id" column="id"/> <result property="name" column="tname"/> <!--获取List<Student>中的泛型使用 ofType--> <collection property="students" ofType="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <result property="tid" column="tid"/> </collection> </resultMap>
查询结果:
[Teacher{id=1, name='spong', students=[Student{id=1, name='zhangsan', tid=1}, Student{id=2, name='lisi', tid=1}]}]