mybatis--多对一处理/一对多处理

多对一处理(association)

  • 多个学生对一个老师

  • 对于学生这边,关联:多个学生,关联一个老师[多对一]

  • 对于老师而言,集合,一个老师有多个学生【一对多】

SQL:

测试环境搭建

1.导入依赖文件并编写配置文件

pom.xml

XML 复制代码
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.34</version>
    </dependency>
</dependencies>

mybatis-config.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--   映入外部配置文件-->

    <properties resource="db.properties"/>
    <settings>
<!--        标准的日志工厂实现-->
        <setting name="logImpl" value="stdout_logging"/>
    </settings>
<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="com.lyc.mapper.StudentMapper"/>
        <mapper class="com.lyc.mapper.TeacherMapper"/>
    </mappers>
</configuration>

db.properties

XML 复制代码
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username = root
password = 211314

2.新建实体类

student

java 复制代码
package com.lyc.pojo;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("student")
public class Student {
    private int id;
    private String name;
    //学生要关联一个老师
    private Teacher teacher;
}

Teacher

java 复制代码
package com.lyc.pojo;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("teacher")
public class Teacher {
    private int id;
    private String name;
}

3.编写Mybatis工具包

java 复制代码
package com.lyc.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;

public class MybatisUtils {
    public SqlSession getsqlSession() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream stream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
        return sqlSessionFactory.openSession(true);
    }
}

4.建立Mapper接口,建立Mapper.xml

studentMapper.java

java 复制代码
package com.lyc.mapper;

import com.lyc.pojo.Student;

import java.util.List;

public interface StudentMapper {
    List<Student> getStudent();
    List<Student> getStudent2();
}

teacherMapper.java

java 复制代码
package com.lyc.mapper;

import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface TeacherMapper {
//    @Select("select * from mybatis.teacher where id = #{tid}")
    Teacher getTeacher(@Param("tid") int id);
}

5.在核心配置文件中绑定注册我们的Mapper映射文件

XML 复制代码
<mappers>
        <mapper class="com.lyc.mapper.StudentMapper"/>
        <mapper class="com.lyc.mapper.TeacherMapper"/>
    </mappers>

按照查询嵌套处理

studentmapper.xml

XML 复制代码
 <mapper namespace="com.lyc.mapper.StudentMapper">
 <!--    思路:
 1.查询所有的学生信息
 2.根据查询出来的学生的tid查询到老师信息
  -->
     <select id="getStudent" resultMap="student-teacher">
         select *
         from mybatis.student;
     </select>
     <resultMap id="student-teacher" type="com.lyc.pojo.Student">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
 <!--        复杂的属性,我们需要单独处理
             对象:association
             集合:collection-->
         <association property="teacher" column="tid" javaType="com.lyc.pojo.Teacher" select="getTeacher"/>
     </resultMap>
     <select id="getTeacher" resultType="com.lyc.pojo.Teacher">
         select * from mybatis.teacher where id = #{id}
     </select>
 </mapper>

按照结果嵌套查询

studentmapper.xml

XML 复制代码
<!--    按照结果嵌套处理-->
     <select id="getStudent2" resultMap="student-teacher2">
         select student.id,student.name,teacher.name as teacherName
         from mybatis.student,mybatis.teacher
         where student.tid = teacher.id
     </select>
     <resultMap id="student-teacher2" type="com.lyc.pojo.Student">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
         <association property="teacher" javaType="com.lyc.pojo.Teacher">
             <result property="name" column="teacherName"/>
         </association>
     </resultMap>

注:单表查询时,当执行到tid时去调用映射,映射又去子查询,所以#{}里面自动填充了cloum的值,所以#{}的值可以随便添,记住,是单表查询时

回顾MySQL多对一查询方式:

  • 子查询

  • 联表查询

一对多处理(collection)

环境搭建: 与上文一致

实体类:

java 复制代码
public class Student {
     private int id;
     private String name;
     //学生要关联一个老师
    private int tid;
 }
 public class Teacher {
     private int id;
     private String name;
     //一个老师有多个老师
     private List<Student> students;
 }

mapper类:

teacherMapper.java

java 复制代码
package com.lyc.mapper;

import com.lyc.pojo.Teacher;
import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface TeacherMapper {
//    List<Teacher> selectTeacher();
    //获取指定老师下的所有学生及老师信息
    Teacher selectTeacher(@Param("tid") int id);
    Teacher selectTeacher2(@Param("tid") int id);
}

按照查询嵌套处理

TeacherMapper.xml

XML 复制代码
   <select id="selectTeacher2" resultMap="teacher-student2">
     select * from mybatis.teacher where id = #{tid};
     </select>
     <resultMap id="teacher-student2" type="com.lyc.pojo.Teacher">
         <collection property="students" javaType="ArrayList" ofType="com.lyc.pojo.Student" select="getStudent" column="id"/>
     </resultMap>
     <select id="getStudent" resultType="com.lyc.pojo.Student">
         select * from mybatis.student where tid = #{tid}
     </select>
 </mapper>

按照结果嵌套查询

TeacherMapper.xml

XML 复制代码
 <select id="selectTeacher" resultMap="teacher-student">
     select s.id sid,s.name sname,t.id tid,t.name tname
     from mybatis.teacher t
         join mybatis.student s on
             t.id = s.tid and t.id = #{tid};
 </select>
 ​
 <resultMap id="teacher-student" type="com.lyc.pojo.Teacher">
     <result property="id" column="tid"/>
     <result property="name" column="tname"/>
     <!--        复杂的属性,我们需要单独处理
         对象:association
         集合:collection
         javaType:
         指定属性的类型,集合中的泛型信息,我们使用ofType获取-->
     <collection property="students" ofType="com.lyc.pojo.Student">
         <result property="id" column="sid"/>
         <result property="name" column="sname"/>
         <result property="tid" column="tid"/>
     </collection>
 </resultMap>

小结

  1. 关联 association

  2. 集合:collection

  3. javaType & ofype

    1. javaType用来指定实体类中属性的类型

    2. ofType 用来指定映射到List或者集合中的实体类,反省中的约束类型

注:

  • 保证SQL的可读性,精良保证通俗易懂

  • 注意一对多和多对一中 属性名和字段名的问题如果问题不好排查,可以使用日志,建议使用log4j

希望对大家有所帮助!

相关推荐
Seven971 分钟前
dubbo高级特性介绍
java
callJJ9 分钟前
Dijkstra算法求解最短路径—— 从零开始的图论讲解(2)
java·数据结构·算法·intellij-idea·图论·dijkstra·图搜索算法
虾球xz9 分钟前
游戏引擎学习第218天
java·学习·游戏引擎
flzjkl10 分钟前
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
java·后端
chalmers_1515 分钟前
tomcat http 怎么改成 https
http·https·tomcat
鬼布20 分钟前
post请求在gateway打印日志内存遗漏
java·gateway
编程就是如此23 分钟前
手撕Tomcat
java·tomcat
奔驰的小野码38 分钟前
本地实现Rtsp视频流推送
java·linux·后端·ffmpeg
PHASELESS41141 分钟前
Java二叉树深度解析:结构、算法与应用实践指南
java·开发语言·数据结构·算法