Mybatis多对一,一对多

简介: Mybatis多对一,一对多

一对多:集合collection,一个老师有多个学生

多对一:关联association,多个学生关联一个老师

student表

teacher表

sql语句查询学生和关联的老师

select s.sid, s.sname,t.tname 
from mybatis_study.student s,mybatis_study.teacher t 
where s.tid=t.tid


1.多对一

pojo层

@Data
public class Student {
    private int sid;
    private String sname;
    private Teacher teacher;
}
@Data
public class Teacher {
    private int tid;
    private String tname;
}

mybatis-config.xml

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
    <!--导入外部配置文件,properties必须放在最上边-->
    <properties resource="db.properties">
        <!--里面可以继续写属性,但是没外部文件的优先级高-->
        <property name="username" value="root"/>
    </properties>
    <!--日志-->
    <settings>
<!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--可以给实体类起别名-->
    <typeAliases>
        <typeAlias type="pojo.Teacher" alias="Teacher"></typeAlias>
        <typeAlias type="pojo.Student" alias="Student"></typeAlias>
    </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>
    </environments>
    <!--绑定接口-->
    <mappers>
      <mapper class="mapper.TeacherMapper"></mapper>
        <mapper class="mapper.StudentMapper"></mapper>
    </mappers>
</configuration>

StudentMapper.java接口

List<Student> getStudent();
List<Student> getStudent2();

映射配置StudentMapper.xml

  • 按照查询嵌套处理
<mapper namespace="mapper.StudentMapper">
  <!--
    查询所有的学生
    根据查询出来的学生的tid,寻找对应的老师
  -->
  <select id="getStudent" resultMap="StudentTeacher">
    select * from student
  </select>
  <select id="getTeacher" resultType="Teacher">
    select * from teacher where tid = #{tid}
  </select>
  <resultMap id="StudentTeacher" type="Student">
   <result property="sid" column="sid"></result>
   <result property="sname" column="sname"></result>
   <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association>
  </resultMap>
</mapper>
  • 按照结果嵌套处理
 <!--根据结果嵌套处理-->
 <select id="getStudent2" resultMap="StudentTeacher2">
    select s.sid,s.sname,t.tname from student s,teacher,t where s.tid = t.tid;
 </select>
 <resultMap id="StudentTeacher2" type="Student">
   <result property="sid" column="sid"></result>
   <result property="sname" column="sname"></result>
   <association property="teacher" javaType="Teacher">
     <result property="tname" column="tname"></result>
   </association>
 </resultMap>

测试类

@Test
public void getStudent2(){
    SqlSession session = MybatisUtil.getSqlSession();
    StudentMapper mapper = session.getMapper(StudentMapper.class);
    List<Student> student = mapper.getStudent();
    for (Student student1 : student) {
        System.out.println(student1);
    }
    session.close();
}


2.一对多

sql语句查询

select s.sid,s.sname,t.tname,t.tid
from teacher t,student s
where t.tid = s.tid

pojo层

import lombok.Data;
@Data
public class Student {
    private int sid;
    private String sname;
    private int tid;
}
//Teacher.java
@Data
public class Teacher {
    private int tid;
    private String tname;
    private List<Student> students;
}

接口TeacherMapper.java

public interface TeacherMapper {
    //根据指定老师查他的信息和学生
    Teacher getTeacher1(@Param("tid") int tid);
}

TeacherMapper.xml

  • 按结果嵌套处理
<?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="mapper.TeacherMapper">
    <!--按结果嵌套处理-->
    <select id="getTeacher1" resultMap="TeacherStudent">
        select s.sid,s.sname,t.tname,t.tid
        from teacher t,student s
        where t.tid = s.tid and t.tid = #{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="tid" column="tid"></result>
        <result property="tname" column="tname"></result>
        <!--集合:collection
            关联:association
            javaType:指定属性的类型,集合中的泛型信息,用ofType获取
        -->
        <collection property="students" ofType="Student">
            <result property="sid" column="sid"></result>
            <result property="sname" column="sname"></result>
            <result property="tid" column="tid"></result>
        </collection>
    </resultMap>
</mapper>
  • 按照查询嵌套处理
<!--按照查询嵌套处理-->
    <select id="getTeacher2">
        select * from teacher where tid = #{tid}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <!--表字段和类属性名相同的可以省略不写-->
        <collection property="students" javaType="ArrayList" ofType="Student"></collection>
    </resultMap>
    <select id="getStudentByTeacherId" resultType="Student">
        select * from student where tid = # {tid}
    </select>

Test

@Test
public void getTeacher1(){
     SqlSession session = MybatisUtil.getSqlSession();
     TeacherMapper mapper = session.getMapper(TeacherMapper.class);
     Teacher teacher = mapper.getTeacher1(1);
     System.out.println(teacher);
     session.close();
}

Teacher(tid=1, tname=张老师, students=

[Student(sid=1, sname=小何, tid=1),

Student(sid=2, sname=小李, tid=1),

Student(sid=3, sname=小张, tid=1)])


小结

1.关联-association 【多对一】

2.集合-collection 【一对多】

3.JavaType 和 ofType


  • JavaType:指定实体类属性的类型;
  • ofType:指定映射到List集合中的pojo类型,泛型中的约束类型


个人推荐使用:按照结果嵌套处理


目录
相关文章
|
18天前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
28 0
|
18天前
|
Java 数据库连接 mybatis
mybatis的一对多
mybatis的一对多
|
18天前
|
XML Java 数据库连接
MyBatis--映射关系一对一和MyBatis--映射关系多对一 -都有基于xml和注解的教程
MyBatis--映射关系一对一和MyBatis--映射关系多对一 -都有基于xml和注解的教程
92 0
|
18天前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
16 0
|
18天前
|
XML SQL Java
mybatis的一对多,多对一,以及多对对的配置和使用
mybatis的一对多,多对一,以及多对对的配置和使用
18 2
|
18天前
|
SQL Java 数据库连接
mybatis关联配置(一对多配置)
mybatis关联配置(一对多配置)
14 1
|
18天前
|
Java 数据库连接 网络安全
mybatis使用全注解的方式案例(包含一对多关系映射)
mybatis使用全注解的方式案例(包含一对多关系映射)
13 0
|
18天前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十三)之MyBatis一对多映射查询
一文彻底搞懂Mybatis系列(十三)之MyBatis一对多映射查询
|
18天前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
|
18天前
|
Java 数据库连接 mybatis
一文彻底搞懂Mybatis系列(十一)之MyBatis多对一映射查询
一文彻底搞懂Mybatis系列(十一)之MyBatis多对一映射查询