博客
关于我
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/

    你可能感兴趣的文章
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    Webpack 基本环境搭建
    查看>>