博客
关于我
mybatis学习笔记9----多表查询一对多
阅读量:724 次
发布时间:2019-03-21

本文共 3167 字,大约阅读时间需要 10 分钟。

一对多查询的实现 - MyBatis入门

在前一节中,我们已经了解了解Java的基本语法、MyBatis的基础概念以及数据库的关系模型。在本节中,我们将进入一对多关系的核心内容——数据库查询与MyBatis映射。以下将详细解释如何在MyBatis框架中实现一对多关系的查询。

1. 类的定义

首先,定义两个Java类,分别表示老师学生。根据一对多的关系,每个老师可以对应多个学生,所以我们需要在这些类中建立关联。

  • Teacher类
import lombok.Data;import java.util.List;@Datapublic class Teacher {    private int id;    private String name;    private List
students;}
  • Student类
import lombok.Data;/Datapublic class Student {    private int id;    private String name;    private int tid;}

注意

  • 使用Lombok的@Data注解简化了JavaBean的配置,使得类更易读且减少了手动编写代码的需求。
  • tid(Teacher ID)字段用于连接学生与老师的关系。

2. MyBatis映射文件

接下来,我们需要配置MyBatis,这样它可以理解上述类结构,并正确执行SQL查询。下面详细介绍如何配置TeacherMapper和StudentMapper。

TeacherMapper.java

TeacherMapper负责映射Teacher类。我们需要实现以下两个核心方法:

  • getTeachers:根据老师ID查询老师及其对应的学生。
  • getTeacher:获取单个老师的信息,包括其所有学生。
  • public interface TeacherMapper {    // 获取给定老师id对应的老师信息以及学生信息    Teacher getTeachers(@Param("tid") int id);    // 获取单个老师的信息    Teacher getTeacher(@Param("id") int id);}
    StudentMapper.java

    StudentMapper负责映射Student类,主要用于多对一关系(一个学生对应一个老师)。

    public interface StudentMapper {    // 获取给定老师id对应的学生    List
    getStudentsByTeacherID(@Param("tid") int tid);}

    注意

    • @Param("tid")用于参数化要传递给数据库的ID值,且要求名称为tid。
    • 返回类型如TeacherStudent等反映了对应的Java对象类型。
    mybatis-config.xml

    为了使MyBatis能够识别接口和执行映射文件,我们需要配置mybatis-config.xml文件,确保框架能够正常工作。

    数据库映射(TeacherMapper.xml)

    现在,我们需要写入TeacherMapper.xml文件,包含查询逻辑和映射结果。

    方法一:基于结果集的查询
    • getTeachers:用于根据老师ID查询特定的老师及其相关的学生信息。
    方法二:基于子查询的方式
    • getTeachers2:使用子查询来获取特定老师的信息。

    注意

    • <collection>用于映射List集合,ofType指定集合的类型(如Student)。
    • 单独的子查询需要明确标识结果集类型,比如使用resultType

    3. MyBatisUtils.java

    为了重复使用常用功能,比如事务管理和数据库连接池,通常会创建一个通用工具类。在本例中,我们可以创建一个 GinKenUtil类,用于获取数据库连接和事务管理。

    import org.ibatis.executor.Executor;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component("dbUtils")public class MyBatisUtils {    private static Executor executor = null;        public static Executor getExecutor() {        if (executor == null) {            executor = (Executor) BeanFactory.getBean("executor");        }        return executor;    }}

    注意

    • 这里的工具类只是一个示例,具体的实现可能会根据项目需求有所调整。

    4. 总结

    通过以上配置,我们已经实现了基于MyBatis的一对多查询关系。以下是对比总结:

    一对多(多对一):使用集合进行映射
    • Teacher类

      • students字段使用List集合表示,映射时使用<collection>标签。
      • Subquery方法可用于获取学生。
    • 映射文件

      • 使用<collection>来映射每个学生,详情可参考MyBatis官方文档。
    多对一(单对多):使用对象关联
    • Student类
      • 使用Teacher对象进行关联,使用<association>标签。
    关键点区分:
  • 关联类型

    • 一对多:集合(使用<collection>)。
    • 多对一:对象(使用<association>)。
  • 属性处理

    • 集合:(ofType)指定集合的类型。
    • 对象:javatype指定对象类型。
  • 复杂查询优化

    • 可根据需要加入分页、排序等功能,通过传递额外的参数(如@Param)。
  • 5. 常见问题

  • 事务处理

    • 确保数据库事务正确执行,避免脏读或未提交的数据问题。
  • 延迟加载

    • 是否需要启用懒加载,这取决于具体的项目需求和数据库性能。
  • 缓存机制

    • 可以根据需要设置数据库结果的缓存避免重复查询,但需谨慎避免过度缓存。
  • 通过以上步骤和总结,我们能够在MyBatis框架中实现一对多查询关系,充分发挥对象关系映射(ORM)的优势。如果需要更多的特定功能或更复杂的场景,也可以根据实际需求进行扩展和优化。

    转载地址:http://natgz.baihongyu.com/

    你可能感兴趣的文章
    Transformer 架构解释
    查看>>
    Oracle数据库表空间 数据文件 用户 以及表创建的SQL代码
    查看>>
    oracle数据库零碎---Oracle Merge 使用,表中存在数据就修改,没有数据自动添加
    查看>>
    Oracle数据库验证IMP导入元数据是否会覆盖历史表数据
    查看>>
    oracle数据插入表,oracle同时向多表插入数据
    查看>>
    oracle数据类型和对应的java类型
    查看>>
    【C++进阶篇】——string类的使用
    查看>>
    Oracle未开启审计情况下追踪表变更记录
    查看>>
    Oracle条件查询
    查看>>
    Oracle查看数据库会话连接
    查看>>
    Oracle查询前几条数据的方法
    查看>>
    oracle树形查询 start with connect by
    查看>>
    oracle毕业论文题目,历届毕业论文申报题目大全.doc
    查看>>
    oracle求助---win7下oracle配置相关疑问Starting Oracle Enterprise Manager 10g Database Control ...发生系统错误 5。
    查看>>
    Oracle流程控制语句
    查看>>
    oracle深度解析检查点
    查看>>
    Oracle游标
    查看>>
    oracle游标数最大数,Oracle 最大连接数 最大游标数
    查看>>
    oracle用户改名
    查看>>
    oracle用户解压不了,PLSQL developer 连接不上64位Oracle 的解决方法
    查看>>