Mybatis-复杂查询实现
十、复杂查询实现
1、环境搭建
- 搭建数据库
use mybatis
CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`, `name`) VALUES (1, "秦老师");
CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (1, "小明", 1); INSERT INTO `student` (`id`, `name`, `tid`) VALUES (1, "小明", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (2, "小红", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (3, "小张", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (4, "小李", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (5, "小王", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (2, "小红", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (3, "小张", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (4, "小李", 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (5, "小王", 1);
-
新建一个maven项目,导入相关依赖
-
编写mybatis-config.xml配置文件
-
导入lombok
-
建立Mapper接口
-
建立Mapper.xml文件
-
在核心配置文件中绑定注册我们的Mapper接口或者文件 【方式很多,随心选】
-
测试查询是否能够成功
2、多对一处理
描述:多个学生对应一个老师;
实体类
//老师
@Data
@AllArgsConstructor
public class Teacher {
private String name;
private int id;
}
//学生
@Data
@AllArgsConstructor
public class Student {
private int id;
private String name;
private Teacher teacher;
}
2.1、按照查询嵌套处理
- 接口
public interface StudentMapper {
List<Student> getStudent();
}
- Mapper映射文件
<mapper namespace="com.lengzher.dao.StudentMapper">
<select id="getStudent" resultMap="student">
select * from student;
</select>
<resultMap id="student" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher">
</association>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id};
</select>
</mapper>
- 测试
@Test
public void getStudent(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList = mapper.getStudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
2.2、按照结果嵌套处理
<!--根据结果嵌套查询-->
<select id="getStudent" resultMap="student">
select s.id sid,s.name sname,t.name tname,t.id tid
from teacher t,student s
where t.id = s.tid;
</select>
<resultMap id="student" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
<result property="id" column="tid"></result>
</association>
</resultMap>
多对一查询方式
- 子查询
- 联表查询
3、一对多处理
描述:一个老师对应多个学生
实体类
//老师
@Data
@AllArgsConstructor
public class Teacher {
private String name;
private int id;
//一个老师拥有多个学生
private List<Student> student;
public Teacher() {
}
}
//学生
@Data
@AllArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
public Student() {
}
}
3.1、按照查询嵌套处理
<!--按结果嵌套查询-->
<select id="getTeacher" resultMap="teacher">
select s.id sid,s.name sname,t.id tid,t.name tname
from student s,teacher t
where s.tid=t.id and t.id=#{id}
</select>
<resultMap id="teacher" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="student" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
</collection>
</resultMap>
3.2、按照查询嵌套处理
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId"
column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from mybatis.student where tid = #{tid}
</select>