当前位置: 首页 > news >正文

mybatis使用注解形式实现一对多、多对多查询(转载)

1、链接:一对一,一对多

2、多对多

原文

MyBatis的注解实现复杂映射开发

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置
在这里插入图片描述
在这里插入图片描述

多对多查询

多对多查询的模型
多对多查询的需求:查询学生以及所对应的课程信息
在这里插入图片描述

多对多查询的语句

对应的sql语句:

SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.idSELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}
添加CourseMapper 接口方法
public interface CourseMapper {//根据学生id查询所选课程@Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")public abstract List<Course> selectBySid(Integer id);
}
使用注解配置Mapper
public interface StudentMapper {//查询全部@Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")@Results({@Result(column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "age",property = "age"),@Result(property = "courses",   // 被包含对象的变量名javaType = List.class,  // 被包含对象的实际数据类型column = "id",          // 根据查询出student表的id来作为关联条件,去查询中间表和课程表/*many、@Many 一对多查询的固定写法select属性:指定调用哪个接口中的哪个查询方法*/many = @Many(select = "com.yyl.many_to_many.CourseMapper.selectBySid"))})public abstract List<Student> selectAll();
}
测试类
public class Test01 {@Testpublic void selectAll() throws Exception{//1.加载核心配置文件InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");//2.获取SqlSession工厂对象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.通过工厂对象获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession(true);//4.获取StudentMapper接口的实现类对象StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);//5.调用实现类对象中的方法,接收结果List<Student> list = mapper.selectAll();//6.处理结果for (Student student : list) {System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());List<Course> courses = student.getCourses();for (Course cours : courses) {System.out.println("\t" + cours);}}//7.释放资源sqlSession.close();is.close();}
}

运行结果如下:
在这里插入图片描述

多对多配置总结
注解说明
@Results封装映射关系的父注解。
Result[] value():定义了 Result 数组
@Result封装映射关系的子注解。
column 属性:查询出的表中字段名称
property 属性:实体对象中的属性名称
javaType 属性:被包含对象的数据类型
many 属性:一对多查询固定属性
@Many一对多查询的注解。
select 属性:指定调用某个接口中的方法

bug

用results结果集时,如果column和property相同可以省略不写,但主键id获取为空值,所以一定要加入主键注解。

        //主键映射@Result(id=true,property = "id",column = "id"),

相关文章:

  • Unity 6预览版即将增加对visionOS 2的支持
  • 【向量检索】之向量数据库Milvus,Faiss详解及应用案例
  • 0-1 构建用户画像数仓
  • 《操作系统真象还原》第七章——改进中断
  • 保障信息安全!等保2.0的二级和三级到底有何不同?详细解析
  • 【深度解析】如何有效恢复手机数据?5个简单步骤
  • Java学习笔记之基本数据类型转换
  • 解决Linux下Java应用因内存不足而崩溃的问题
  • 电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略
  • Unity:Text-TextMeshPro 不显示中文
  • python反序列化知识点学习
  • 5.Sentinel入门与使用
  • 谷歌Google广告开户是怎么收费的?
  • Ubuntu 上 Vim 的安装、配置
  • Python邮件加密传输如何实现?有哪些技巧?
  • 分享的文章《人生如棋》
  • [译]CSS 居中(Center)方法大合集
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • HashMap ConcurrentHashMap
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript设计模式与开发实践系列之策略模式
  • Java基本数据类型之Number
  • js对象的深浅拷贝
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Lsb图片隐写
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 如何设计一个比特币钱包服务
  • 移动端 h5开发相关内容总结(三)
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • gunicorn工作原理
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • # 达梦数据库知识点
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $(selector).each()和$.each()的区别
  • (06)Hive——正则表达式
  • (13)Hive调优——动态分区导致的小文件问题
  • (2022 CVPR) Unbiased Teacher v2
  • (28)oracle数据迁移(容器)-部署包资源
  • (k8s中)docker netty OOM问题记录
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)求1到1亿间的质数或素数
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET : 在VS2008中计算代码度量值
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .sdf和.msp文件读取
  • [20161101]rman备份与数据文件变化7.txt
  • [51nod1610]路径计数
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解