- 1、复杂环境搭建
- 步骤
- 2、多对一处理
- 2.1、实体类
- 2.2、按照查询嵌套处理
- 2.3、按照结果嵌套处理
- 3、一对多处理
- 3.1、实体类
- 3.2、按结果嵌套查询
- 3.3、按查询嵌套处理
- 4、区别
这一篇来写一些相对复杂的SQL语句。
1、复杂环境搭建
这个环境搭建跟我mybatis第一篇文章的环境搭建没有什么太大的区别,只不过这里会用到一些我前几篇说到的知识点,如果没看过我之前的文章,可以去看我前几篇的文章。
步骤- 工具类(和之前的一样,不变);
- 创建实体类(属性名都要对应数据库列名);
- 创建接口;
- 在resources包下建立和接口对应的包和xml配置文件;
- 在mybatis-config.xml核心配置文件中绑定所创建的接口。
- 设置别名
环境搭建好后就可以接下来的操作了。
多对一:例如很多学生都有同一个老师,我们从学生方面去查询学生和老师。
2.1、实体类实体类——学生
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
//老师的id是要从老师的表去查询,所以给返回老师的对象
private Teacher teacher;
}
实体类——老师
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
}
2.2、按照查询嵌套处理
StudentMapper接口
public interface StudentMapper {
List selectStudentAndTeacher();
}
StudentMapper.xml配置文件
测试
@Test
public void selectStudentAndTeacher(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List students = mapper.selectStudentAndTeacher();
for (Student student : students) {
System.out.println(student);
}
sqlSession.close();
}
测试结果
StudentMapper接口
public interface StudentMapper {
List selectStudentAndTeacher2();
}
StudentMapper.xml配置文件
select s.id sid,s.name sname,t.name tname from student s,teacher t where s.tid=t.id;
测试
@Test
public void selectStudentAndTeacher2(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List students2 = mapper.selectStudentAndTeacher2();
for (Student student : students2) {
System.out.println(student);
}
sqlSession.close();
}
测试结果
一对多:例如一个老师教好多个学生。我们从老师方面去查询学生和老师。
3.1、实体类实体类——学生
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
private int tid;
}
实体类——老师
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
//这里是从老师方向查学生,返回集合
private List students;
}
3.2、按结果嵌套查询
TeacherMapper接口
public interface TeacherMapper {
//查询老师和学生
List getTeacher(int id);
}
TeacherMapper.xml配置文件
select s.id sid,s.name sname,t.name tname,t.id tid from student s,teacher t where t.id=#{tid}
测试
@Test
public void getTeacherStudent(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List teacher = mapper.getTeacher(1);
for (Teacher teacher1 : teacher) {
System.out.println(teacher1);
}
sqlSession.close();
}
测试结果
TeacherMapper接口
public interface TeacherMapper {
//查询老师和学生
List getTeacher2(int id);
}
TeacherMapper.xml配置文件
select id,name from teacher where id=#{id} select * from student where tid=#{id}
测试
@Test
public void getTeacherStudent2(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List teacher2 = mapper.getTeacher2(1);
for (Teacher teacher : teacher2) {
System.out.println(teacher);
}
sqlSession.close();
}
测试结果
这里查询结果有一个老师的id为0的问题!我也不清楚该怎么解决[大哭]。
- 对象:用association
- 集合:用collection
- javaType : 指定属性的类型
- ofType : 集合中的泛型信息
- 不论是association还是collection的property,传入的参数都是需要关联或者是集合的属性名。
还有一些细节写在代码的注释,
这是我mybatis自学笔记的第5篇,没看过我之前的文章的话可以看看,前4篇的链接↓
mybatis学习笔记-04
mybatis学习笔记-03
mybatis学习笔记-02
mybatis学习笔记-01
本篇文章到这就结束了。自学不易,如果写得不详细,可以结合官方文档看,也可以评论区交流,这篇文章有可以优化的地方希望大佬指教指教。



