mybatis注解开发 一对多嵌套查询方式

 更新时间:2023年03月15日 11:00:12   作者:眠不觉2020  
这篇文章主要介绍了mybatis注解开发 一对多嵌套查询方式,具有很好的参考价值,希望对大家有所帮助。

mybatis一对多嵌套查询

一个class中有许多student,属于一对多关系。

本文利用mybatis注解,嵌套查询方式来实现一对多查询,在根据classId查询class时,顺便查询并展示出class中的student

student实体类

package com.itheima.dao;

public class StudentDao {
    private Integer id;
    private String name;
    private Integer age;
    private Integer cid;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    @Override
    public String toString() {
        return "StudentDao{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", cid=" + cid +
                '}';
    }
}

class实体类

package com.itheima.dao;

import java.util.List;

public class ClassDao {
    private Integer id;
    private String className;
    private List<StudentDao> studentsList;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    @Override
    public String toString() {
        return "ClassDao{" +
                "id=" + id +
                ", className='" + className + '\'' +
                ", studentsList=" + studentsList +
                '}';
    }
}

mybatis-config.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>
    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <mapper class="com.itheima.mapper.StudentMapper"/>
        <mapper class="com.itheima.mapper.ClassMapper"/>
    </mappers>

</configuration>

studentMapper.java

package com.itheima.mapper;

import com.itheima.dao.StudentDao;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentMapper {
    @Select("select * from student where cid = #{cid}")
    @Results({@Result(id = true, property = "id", column = "id"),
              @Result(property = "name",column = "name"),
              @Result(property = "age",column = "age"),
              @Result(property = "cid", column = "cid")})
    List<StudentDao> selectStudentByCid(Integer cid);
}

classMapper.java

package com.itheima.mapper;

import com.itheima.dao.ClassDao;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface ClassMapper {
    @Select("select * from class where id = #{id}")
    @Results({@Result(id =true, property = "id",column = "id"),
              @Result(property = "className",column = "className"),
              @Result(property ="studentsList",column = "id",
                      many = @Many(select = "com.itheima.mapper.StudentMapper.selectStudentByCid"))})
    ClassDao selectClassById(Integer id);
}

testMybatis.java

import com.itheima.dao.ClassDao;
import com.itheima.dao.StudentDao;
import com.itheima.mapper.ClassMapper;
import com.itheima.mapper.StudentMapper;
import org.apache.ibatis.annotations.Mapper;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class testMybatis {
   @Test
    public void test() throws IOException {
       InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
       SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
       SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
       SqlSession sqlSession = sqlSessionFactory.openSession(true);
       ClassMapper classMapper = sqlSession.getMapper(ClassMapper.class);
       ClassDao res = classMapper.selectClassById(2);
       System.out.println(res.toString());
   }
}

数据库sql文件

INSERT INTO `class` (`id`, `className`) VALUES (1, '软件19-1');
INSERT INTO `class` (`id`, `className`) VALUES (2, '软件19-2');
INSERT INTO `student` (`name`, `age`, `cid`, `id`) VALUES ('罗辑', 18, 2, 1);
INSERT INTO `student` (`name`, `age`, `cid`, `id`) VALUES ('张三', 18, 2, 2);
INSERT INTO `student` (`name`, `age`, `cid`, `id`) VALUES ('李四', 18, 2, 3);

查询结果可看出,2班的班级信息和2班的学生信息

注意事项:

1、一对多关系中,‘’多‘’方实体类存‘’一‘’的那方的主键作为外键,‘’一‘’的那方的实体类存‘’多‘’的那方的 list<多的那方的实体类属性>以便查询时展示出来。

在“一”的那方的mapper接口中定义嵌套查询。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot基于redis自定义注解实现后端接口防重复提交校验

    SpringBoot基于redis自定义注解实现后端接口防重复提交校验

    本文主要介绍了SpringBoot基于redis自定义注解实现后端接口防重复提交校验,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java面试题冲刺第十九天--数据库(4)

    Java面试题冲刺第十九天--数据库(4)

    这篇文章主要为大家分享了最有价值的三道关于数据库的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Java深入浅出数组的定义与使用上篇

    Java深入浅出数组的定义与使用上篇

    数组是有序的元素序列,若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式
    2022-03-03
  • 剑指Offer之Java算法习题精讲二叉树与N叉树

    剑指Offer之Java算法习题精讲二叉树与N叉树

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • 实现java简单的线程池

    实现java简单的线程池

    这篇文章主要为大家详细介绍了java简单实现多线程,及java爬虫使用线程池实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java并发高的情况下用ThreadLocalRandom来生成随机数

    java并发高的情况下用ThreadLocalRandom来生成随机数

    如果我们想要生成一个随机数,通常会使用Random类。但是在并发情况下Random生成随机数的性能并不是很理想,本文主要介绍了java并发高的情况下用ThreadLocalRandom来生成随机数,感兴趣的可以了解一下
    2022-05-05
  • 在Java下利用log4j记录日志的方法

    在Java下利用log4j记录日志的方法

    本文先对log4j进行了简短的介绍,而后通过安装、配置和普通项目和web项目几个方面来详细介绍了在Java下利用log4j记录日志的方法,有需要的朋友们可以参考借鉴。
    2016-09-09
  • 分布式之全面了解Kafka的使用与特性

    分布式之全面了解Kafka的使用与特性

    Kafka 是我工作多年使用最多的消息中间件 ,特点是拥有巨大吞吐量(数百万/秒),作为当下最流行的分布式,可水平扩展,可容错的“消息系统”,下面跟随小编看下分布式之全面了解Kafka的使用与特性
    2021-11-11
  • Mybatis之association和collection用法

    Mybatis之association和collection用法

    这篇文章主要介绍了Mybatis之association和collection用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java冒泡排序的定义与实例代码

    Java冒泡排序的定义与实例代码

    这篇文章主要给大家介绍了关于Java冒泡排序的定义与实例的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论