Mybatis之一对多处理

发布时间 2023-10-13 10:42:42作者: nmmmmmmmm

一对多处理

运用场景: 一个老师有多名学生, 对于老师而言 就是一对多

  1. Teacher实体类

@Data
public class Teacher {

   private int id;
   private String name;
   List<Student> students;
}

 

  1. mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

   <properties resource="db.properties">
   </properties>
   
   <settings>
       <!--标准的日志工厂实现-->
       <setting name="logImpl" value="STDOUT_LOGGING"/>
   </settings>
   
   <typeAliases>
<!--       <package name="com.kuang.pojo"/>-->
       <typeAlias type="com.kuang.pojo.Teacher" alias="Teacher"/>
   </typeAliases>


   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="${driver}"/>
               <property name="url" value="${url}"/>
               <property name="username" value="${username}"/>
               <property name="password" value="${password}"/>
           </dataSource>
       </environment>
       <environment id="test">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;serverTimezone=GMT%2B8"/>
               <property name="username" value="root"/>
               <property name="password" value="123456"/>
           </dataSource>
       </environment>
   </environments>

   <mappers>
       <mapper class="com.kuang.mapper.TeacherMapper"/>
   </mappers>
</configuration>

 

  1. TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.TeacherMapper">

   <select id="getTeacher" resultMap="TeacherStudent">
      select s.id sid,s.name sname,s.tid stid,t.id tid,t.name tname from mybatis.teacher t
      join mybatis.student s on s.tid = t.id
      where t.id = #{tid}
   </select>
   <resultMap id="TeacherStudent" type="Teacher">
       <result property="id" column="tid"/>
       <result property="name" column="tname"/>
       <!--复杂的属性,我们需要单独处理 对象:association 集合:collection
      javaType 指定属性类型!
      集合中的泛型信息,我们使用ofType获取
      -->
      <collection property="students" ofType="Student">
          <result property="id" column="sid"/>
          <result property="name" column="sname"/>
          <result property="tid" column="stid"/>
      </collection>
   </resultMap>
</mapper>
  1. 公共类

public class MybatisUtils {

   private static SqlSessionFactory sqlSessionFactory;

  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 getSqlSession(){
       return sqlSessionFactory.openSession(true);
  }

}
  1. 测试

  @Test
public void getTeacher(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println("teacher = " + teacher);
    sqlSession.close();
}
}
  1. 输出结果

teacher = Teacher(id=1, name=秦老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])