ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

mybatis中多对一查询

2020-09-17 12:33:07  阅读:293  来源: 互联网

标签:luwanglin name StudentMapper 查询 teacher mybatis com id 中多


实体类:(注:这里使用了lombok插件)

@Data
public class Student {
    private int id;
    private String name;
    Teacher teacher;
}
@Data
public class Teacher {
    private int id;
    private String name;
}

实体类对应的接口类:

public interface StudentMapper {
    /**
     * 获取所有学生的信息,包括对应的老师信息
     *
     * @return
     */
    public List<Student> getStudents();
}
public interface TeacherMapper {
    /**
     * 根据老师id来查询老师信息
     *
     * @param id
     * @return
     */
    @Select("select * from teacher where id=#{tid}")
    Teacher getTeacherById(@Param("tid") int id);
}

需求:

  1. 查询出所有的学生信息,其中他的老师信息也一起查出来。

    • 编写对应的mapper文件

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.luwanglin.dao.StudentMapper">
          <select id="getStudents" resultMap="StudentTeacher">
              select * from student
          </select>
          <resultMap id="StudentTeacher" type="Student">
              <id property="id" column="id"/>
              <result property="name" column="name"/>
              <association property="teacher" column="{demo=tid,testname=name}" javaType="Teacher" select="getTeacher"/>
          </resultMap>
          <!--
        这里传递过来的id,只有一个属性的时候,下面可以写任何值
        association中column多参数配置:
          column="{key=value,key=value}"
          其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的
      字段名。
      
          个人测试:
          column只有一个属性时,可以在下面的getTeacher中任意名字取出值,有多个时以键值对的形式传递
        -->
          <select id="getTeacher" resultType="teacher">
              select * from teacher where id=#{demo};
          </select>
      </mapper>
      
      

      注:记得注册mapper

    • 编写测试类:

      package com.luwanglin.dao;
      
      import com.luwanglin.pojo.Student;
      import com.luwanglin.pojo.Teacher;
      import com.luwanglin.utils.MybatisUtils;
      import org.apache.ibatis.session.SqlSession;
      import org.junit.jupiter.api.AfterEach;
      import org.junit.jupiter.api.BeforeEach;
      import org.junit.jupiter.api.Test;
      
      import java.util.List;
      
      /**
       * @author luwanglin
       * @email 1769862620@qq.com
       * @Date 2020/9/15 10:00
       * @Version 1.0
       */
      public class UserMapperTest {
          SqlSession sqlSession;
      
          @Test
          void testGetTeacherById() {
              TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
              Teacher teacher = mapper.getTeacherById(1);
              System.out.println(teacher);
          }
      
          @Test
          void testGetStudents() {
              StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
              List<Student> students = mapper.getStudents();
              for (Student student : students) {
                  System.out.println(student);
              }
          }
      
      
          @BeforeEach
          public void initSqlSession() {
      //        System.out.println("这是BeforeEach!");
              //MybatisUtils是一个工具类,用来获取sqlsession
              sqlSession = MybatisUtils.getSession();
          }
      
          @AfterEach
          void closeSqlSession() {
              sqlSession.close();
          }
      }
      

      工具类:

      package com.luwanglin.utils;
      
      import org.apache.ibatis.io.Resources;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.apache.ibatis.session.SqlSessionFactoryBuilder;
      
      import java.io.IOException;
      import java.io.InputStream;
      
      /**
       * @author luwanglin
       * @email 1769862620@qq.com
       * @Date 2020/9/15 9:09
       * @Version 1.0
       */
      public class MybatisUtils {
          private static SqlSessionFactory sqlSessionFactory = null;
      
          static {
              try {
                  String resource = "mybatis-config.xml";
                  InputStream inputStream = Resources.getResourceAsStream(resource);
                  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
          public static SqlSession getSession() {
              return sqlSessionFactory.openSession();
          }
      
      }
      
    • 结果如下:

      Student(id=1, name=小明, teacher=Teacher(id=1, name=秦老师))
      Student(id=2, name=小红, teacher=Teacher(id=1, name=秦老师))
      Student(id=3, name=小张, teacher=Teacher(id=1, name=秦老师))
      Student(id=4, name=小李, teacher=Teacher(id=1, name=秦老师))
      Student(id=5, name=小王, teacher=Teacher(id=1, name=秦老师))
      Student(id=6, name=小哈, teacher=Teacher(id=1, name=秦老师))
      

    为了查看传递键值对的效果,这里采用了如下测试:

    <select id="getTeacher" resultType="teacher">
        select * from teacher where id=#{demo} or name=#{testname};
    /*
    这里就根据上面的键值对取出了demo对应于tid
    */
    </select>
    

    这里同样是可以查出学生的信息以及对应的老师信息。此时控制台打印的日志信息如下:

    2020-09-17 10:12:48 [com.luwanglin.dao.StudentMapper.getStudents:137]-[DEBUG] ==>  Preparing: select * from student
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getStudents:137]-[DEBUG] ==> Parameters: 
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小明(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小红(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小张(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小李(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小王(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====>  Preparing: select * from teacher where id=? or name=?; /* 这里就根据上面的键值对取出了demo对应于tid */
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] ====> Parameters: 1(Integer), 小哈(String)
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getTeacher:137]-[DEBUG] <====      Total: 1
    2020-09-17 10:12:49 [com.luwanglin.dao.StudentMapper.getStudents:137]-[DEBUG] <==      Total: 6
    Student(id=1, name=小明, teacher=Teacher(id=1, name=秦老师))
    Student(id=2, name=小红, teacher=Teacher(id=1, name=秦老师))
    Student(id=3, name=小张, teacher=Teacher(id=1, name=秦老师))
    Student(id=4, name=小李, teacher=Teacher(id=1, name=秦老师))
    Student(id=5, name=小王, teacher=Teacher(id=1, name=秦老师))
    Student(id=6, name=小哈, teacher=Teacher(id=1, name=秦老师))
    

    可以从日志中看出这里的确采用的是嵌套查询,因为每一条记录都进行了一次嵌套查询。

    而且每次查询的条件是根据传递的键值对来进行取值传入的。

标签:luwanglin,name,StudentMapper,查询,teacher,mybatis,com,id,中多
来源: https://www.cnblogs.com/luckforefforts/p/13684424.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有