mybatis学习笔记-05

落日映苍穹つ 2022-09-17 01:54 297阅读 0赞

mybatis学习笔记-05

  • 1、复杂环境搭建
    • 步骤
  • 2、多对一处理
    • 2.1、实体类
    • 2.2、按照查询嵌套处理
    • 2.3、按照结果嵌套处理
  • 3、一对多处理
    • 3.1、实体类
    • 3.2、按结果嵌套查询
    • 3.3、按查询嵌套处理
  • 4、区别

这一篇来写一些相对复杂的SQL语句。


1、复杂环境搭建

这个环境搭建跟我mybatis第一篇文章的环境搭建没有什么太大的区别,只不过这里会用到一些我前几篇说到的知识点,如果没看过我之前的文章,可以去看我前几篇的文章。

步骤

  1. 工具类(和之前的一样,不变);
  2. 创建实体类(属性名都要对应数据库列名);
  3. 创建接口;
  4. 在resources包下建立和接口对应的包和xml配置文件;
  5. 在mybatis-config.xml核心配置文件中绑定所创建的接口。
    在这里插入图片描述
  6. 设置别名
    在这里插入图片描述
    环境搭建好后就可以接下来的操作了。

2、多对一处理

多对一:例如很多学生都有同一个老师,我们从学生方面去查询学生和老师。

2.1、实体类

实体类——学生

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Student {
  5. private int id;
  6. private String name;
  7. //老师的id是要从老师的表去查询,所以给返回老师的对象
  8. private Teacher teacher;
  9. }

实体类——老师

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Teacher {
  5. private int id;
  6. private String name;
  7. }

2.2、按照查询嵌套处理

StudentMapper接口

  1. public interface StudentMapper {
  2. List<Student> selectStudentAndTeacher();
  3. }

StudentMapper.xml配置文件

  1. <mapper namespace="com.ZXF.dao.StudentMapper">
  2. <!-- 通过查询嵌套=========================================-->
  3. <select id="selectStudentAndTeacher" resultMap="StudentTeacher">
  4. select * from student;
  5. </select>
  6. <resultMap id="StudentTeacher" type="Student">
  7. <result column="id" property="id"/>
  8. <result column="name" property="name"/>
  9. <!-- 复杂的属性,单独处理,如果要处理的是:
  10. 对象:用association
  11. 集合:用collection
  12. javaType:因为我们要处理的对象是一个类,所以我们把这个类传递进去
  13. -->
  14. <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
  15. </resultMap>
  16. <select id="getTeacher" resultType="Teacher">
  17. <!--单个参数时,#{id}这个参数名可以随意写,但为了命名规范和方便排错,建议一致 -->
  18. select * from teacher where id=#{id};
  19. </select>

测试

  1. @Test
  2. public void selectStudentAndTeacher(){
  3. SqlSession sqlSession = MybatisUtil.getSqlSession();
  4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  5. List<Student> students = mapper.selectStudentAndTeacher();
  6. for (Student student : students) {
  7. System.out.println(student);
  8. }
  9. sqlSession.close();
  10. }

测试结果
在这里插入图片描述

2.3、按照结果嵌套处理

StudentMapper接口

  1. public interface StudentMapper {
  2. List<Student> selectStudentAndTeacher2();
  3. }

StudentMapper.xml配置文件

  1. <!-- 通过结果嵌套=========================================-->
  2. <select id="selectStudentAndTeacher2" resultMap="StudentTeacher2">
  3. select s.id sid,s.name sname,t.name tname
  4. from student s,teacher t where s.tid=t.id;
  5. </select>
  6. <resultMap id="StudentTeacher2" type="Student">
  7. <result column="sid" property="id"/>
  8. <result column="sname" property="name"/>
  9. <association property="teacher" javaType="Teacher">
  10. <result column="tname" property="name"/>
  11. </association>
  12. </resultMap>

测试

  1. @Test
  2. public void selectStudentAndTeacher2(){
  3. SqlSession sqlSession = MybatisUtil.getSqlSession();
  4. StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
  5. List<Student> students2 = mapper.selectStudentAndTeacher2();
  6. for (Student student : students2) {
  7. System.out.println(student);
  8. }
  9. sqlSession.close();
  10. }

测试结果
在这里插入图片描述

3、一对多处理

一对多:例如一个老师教好多个学生。我们从老师方面去查询学生和老师。

3.1、实体类

实体类——学生

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Student {
  5. private int id;
  6. private String name;
  7. private int tid;
  8. }

实体类——老师

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Teacher {
  5. private int id;
  6. private String name;
  7. //这里是从老师方向查学生,返回集合
  8. private List<Student> students;
  9. }

3.2、按结果嵌套查询

TeacherMapper接口

  1. public interface TeacherMapper {
  2. //查询老师和学生
  3. List<Teacher> getTeacher(int id);
  4. }

TeacherMapper.xml配置文件

  1. <select id="getTeacher" resultMap="TeacherStudent">
  2. select s.id sid,s.name sname,t.name tname,t.id tid
  3. from student s,teacher t
  4. where t.id=#{tid}
  5. </select>
  6. <resultMap id="TeacherStudent" type="Teacher">
  7. <result property="id" column="tid"/>
  8. <result property="name" column="tname"/>
  9. <!-- javaType : 指定属性的类型
  10. ofType : 集合中的泛型信息
  11. -->
  12. <collection property="students" ofType="Student">
  13. <result column="sid" property="id"/>
  14. <result column="sname" property="name"/>
  15. <result column="tid" property="tid"/>
  16. </collection>
  17. </resultMap>

测试

  1. @Test
  2. public void getTeacherStudent(){
  3. SqlSession sqlSession = MybatisUtil.getSqlSession();
  4. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
  5. List<Teacher> teacher = mapper.getTeacher(1);
  6. for (Teacher teacher1 : teacher) {
  7. System.out.println(teacher1);
  8. }
  9. sqlSession.close();
  10. }

测试结果
在这里插入图片描述

3.3、按查询嵌套处理

TeacherMapper接口

  1. public interface TeacherMapper {
  2. //查询老师和学生
  3. List<Teacher> getTeacher2(int id);
  4. }

TeacherMapper.xml配置文件

  1. <select id="getTeacher2" resultMap="TeacherStudent2">
  2. select id,name from teacher where id=#{id}
  3. </select>
  4. <resultMap id="TeacherStudent2" type="Teacher">
  5. <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentById" column="id">
  6. </collection>
  7. </resultMap>
  8. <select id="getStudentById" resultType="Student">
  9. select * from student where tid=#{id}
  10. </select>
  11. </

测试

  1. @Test
  2. public void getTeacherStudent2(){
  3. SqlSession sqlSession = MybatisUtil.getSqlSession();
  4. TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
  5. List<Teacher> teacher2 = mapper.getTeacher2(1);
  6. for (Teacher teacher : teacher2) {
  7. System.out.println(teacher);
  8. }
  9. sqlSession.close();
  10. }

测试结果
在这里插入图片描述
这里查询结果有一个老师的id为0的问题!我也不清楚该怎么解决[大哭]。

4、区别

  • 对象:用association
  • 集合:用collection
  • javaType : 指定属性的类型
  • ofType : 集合中的泛型信息
  • 不论是association还是collection的property,传入的参数都是需要关联或者是集合的属性名。

还有一些细节写在代码的注释,


这是我mybatis自学笔记的第5篇,没看过我之前的文章的话可以看看,前4篇的链接↓
mybatis学习笔记-04
mybatis学习笔记-03
mybatis学习笔记-02
mybatis学习笔记-01


本篇文章到这就结束了。自学不易,如果写得不详细,可以结合官方文档看,也可以评论区交流,这篇文章有可以优化的地方希望大佬指教指教。

发表评论

表情:
评论列表 (有 0 条评论,297人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++学习笔记05

    1:复制构造函数调用情况 值传递传入函数体,函数以值传递返回,一对象使用另一个对象初构造初始化。 2:C++是否支持函数参数数量不确定? 答案是支持的。 C++中va\_li