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类型,泛型中的约束类型


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


目录
相关文章
|
30天前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
36 18
|
5月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
SQL XML Java
Mybatis中一对一和一对多的处理
这篇文章讲解了在Mybatis中如何处理一对一和一对多的关系映射,包括使用association和collection标签的具体方法。
117 1
|
9月前
|
SQL 缓存 Java
mybatis 一对多查询
mybatis 一对多查询
162 0
|
6月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
8月前
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
|
8月前
|
SQL Java 数据库连接
Mybatis中一对多mapper配置
Mybatis中一对多mapper配置
117 0
|
9月前
|
Java 数据库连接 mybatis
mybatis的一对多
mybatis的一对多
|
9月前
|
存储 XML Java
mybatis使用内部类处理一对多类型数据2
mybatis使用内部类处理一对多类型数据2
86 0
|
28天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
52 2