Mybatis 一对多关系

MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理 MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理及好处 阅读详情

学习参考自luckysky博客

本次例子要完成的是mybatis关系映射中一对多的关系:比如一个学生对应一个专业,一个专业对应多个学生。

需求:1、根据学号查找该学生以及用查询后学生的专业外键值查出该生专业对象

           2、根据专业id值查出专业以及所有属于该专业的学生

mybatis的映射实现方法有两种:1、通过一条sql语句的映射和自定义的resultMap结果集得到一个包含专业对象的学生对象结果或一个包含学生集合对象的专业对象结果集。如:select * from stuinfo s,major m where s.sno=#{sno} and s.majorId=m.id

2、通过两条sql语句的先后执行(其中一条查询的条件为另一个的执行结果)

如:先查询出学生对象select * from stuinfo where sno=#{sno},再通过外键查出专业:select * from major where id=#{majorId}

mybatis 中映射的实现方法:

<select id="getStuAndMajor" resultMap="stuAndMajor" parameterType="String">
      select * from stuinfo where sno=#{sno}
</select>
    
<resultMap type="Stuinfo" id="stuAndMajor">
      <id property="sno" column="sno"/>
      <result property="sname" column="sname"/>
      <association property="major" javaType="Major" select="getMajor" column="majorId"/>
</resultMap>
     
<select id="getMajor" resultType="Major" parameterType="int">
      select * from major where id=#{majorId}
</select>

数据库stuinfo表:

major表:

其中学生表外键majorId是专业表的主键

1、项目目录结构如下

2、Major、Stuinfo实体类

package com.onetomany.model;

import java.util.List;

public class Major {
	
	private int id;
	private String majorName;
	private int personNum;
	private String turtor;
	private List<Stuinfo> students;
	
	@Override
	public String toString() {
		return "Major [id=" + id + ", majorName=" + majorName + ", personNum=" + personNum + ", turtor=" + turtor
				+ ", students=" + students + "]";
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getMajorName() {
		return majorName;
	}
	public void setMajorName(String majorName) {
		this.majorName = majorName;
	}
	public int getPersonNum() {
		return personNum;
	}
	public void setPersonNum(int personNum) {
		this.personNum = personNum;
	}
	public String getturtor() {
		return turtor;
	}
	public void setturtor(String turtor) {
		this.turtor = turtor;
	}
	public List<Stuinfo> getStudents() {
		return students;
	}
	public void setStudents(List<Stuinfo> students) {
		this.students = students;
	}
	
}
package com.onetomany.model;

import java.util.Date;

public class Stuinfo {
	private String sno;
	private String sname;
	private int gender;
	private Date birthday;
	private int majorId;
	private Major major;
	private int credit;
	private String remark;
	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public int getMajorId() {
		return majorId;
	}
	public void setMajorId(int majorId) {
		this.majorId = majorId;
	}
	public Major getMajor() {
		return major;
	}
	public void setMajor(Major major) {
		this.major = major;
	}
	public int getCredit() {
		return credit;
	}
	public void setCredit(int credit) {
		this.credit = credit;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
	@Override
	public String toString() {
		return "Stuinfo [sno=" + sno + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
				+ ", majorId=" + majorId + ", major=" + major + ", credit=" + credit + ", remark=" + remark + "]";
	}
	
}

3、mybatis.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="mysql.properties"/>
 	
 	<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="${user}"/>
 				<property name="password" value="${password}"/>
 			</dataSource>
 		</environment>
 	</environments>
 	
 	<mappers>
 		<mapper resource="com/onetomany/mapper/majorMapper.xml"/>
 		<mapper resource="com/onetomany/mapper/StuinfoMapper.xml"/>		
 	</mappers>
 
 </configuration>

4、majorMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.onetomany.mapper.InterDaoMapper">
	
	<resultMap id="majorMap" type="com.onetomany.model.Major">
		<id property="id" column="id" javaType="java.lang.Integer"/>
		<result property="majorName" column="majorName" javaType="java.lang.String"/>
		<result property="personNum" column="personNum" javaType="java.lang.Integer"/>
		<result property="turtor" column="turtor" javaType="java.lang.String"/>
		
		<!-- 对象属性集合返回值设置 -->
		<collection property="students" ofType="com.onetomany.model.Stuinfo">
			<id property="sno" column="sno" javaType="java.lang.String"/><!-- id列 -->
			<result property="sname" column="sname" javaType="java.lang.String"/>
			<result property="gender" column="gender" javaType="java.lang.Integer"/>
			<result property="birthday" column="birthday" javaType="java.util.Date"/>
			<result property="credit" column="credit" javaType="java.lang.Integer"/>
			<result property="remark" column="remark" javaType="java.lang.String"/>
		</collection>
	</resultMap>
	
	<select id="getMajorStudents" parameterType="int" resultMap="majorMap">
		select * from major m,stuinfo s where m.id=#{id} and s.majorId=#{id}
	</select>
	
</mapper>

5、StuinfoMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.onetomany.mapper.InterDaoMapper">

	<!-- 自定义返回的结果集 -->
	<resultMap id="stuMap" type="com.onetomany.model.Stuinfo">
		<id property="sno" column="sno" javaType="java.lang.String"/><!-- id列 -->
		<result property="sname" column="sname" javaType="java.lang.String"/>
		<result property="gender" column="gender" javaType="java.lang.Integer"/>
		<result property="majorId" column="majorId" javaType="java.lang.Integer"/>
		<result property="birthday" column="birthday" javaType="java.util.Date"/>
		<result property="credit" column="credit" javaType="java.lang.Integer"/>
		<result property="remark" column="remark" javaType="java.lang.String"/>
		
		<association property="major" javaType="com.onetomany.model.Major"><!-- 关联对象属性 -->
			<id property="id" column="id" javaType="java.lang.Integer"/>
			<result property="majorName" column="majorName" javaType="java.lang.String"/>
			<result property="personNum" column="personNum" javaType="java.lang.Integer"/>
			<result property="turtor" column="turtor" javaType="java.lang.String"/>
		</association>
	</resultMap>
	
	<!-- 映射接口方法 -->
	<select id="getStuinfo" parameterType="String" resultMap="stuMap">
		select * from stuinfo s,major m where s.sno=#{sno} and s.majorId=m.id
	</select>

</mapper>

6、DBtool

package com.onetomany.tool;

import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DBtool {

	private static SqlSessionFactory sqlSessionFactory;
	
	static{
		
		try {
			Reader reader=Resources.getResourceAsReader("mybatis.cfg.xml");
			sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static SqlSession getSqlSession(){
		return sqlSessionFactory.openSession();
	}
}

7、InterDaoMapper

package com.onetomany.mapper;

import java.util.List;

import com.onetomany.model.Major;
import com.onetomany.model.Stuinfo;

public interface InterDaoMapper {

	public Stuinfo getStuinfo(String sno);	//通过学号获取学生对象包括其专业对象
	
	public Major getMajorStudents(int id);//通过id值获得该专业的所有学生
}

8、MapperImpl

package com.onetomany.mapper;

import org.apache.ibatis.session.SqlSession;

import com.onetomany.model.Major;
import com.onetomany.model.Stuinfo;
import com.onetomany.tool.DBtool;

public class MapperImpl implements InterDaoMapper {

	@Override
	public Stuinfo getStuinfo(String sno) {
		SqlSession sqlSession=DBtool.getSqlSession();
		InterDaoMapper mapper=sqlSession.getMapper(InterDaoMapper.class);
		Stuinfo stu=mapper.getStuinfo(sno);
		sqlSession.commit();
		sqlSession.close();
		return stu;
	}

	@Override
	public Major getMajorStudents(int id) {
		SqlSession sqlSession=DBtool.getSqlSession();
		InterDaoMapper mapper=sqlSession.getMapper(InterDaoMapper.class);
		Major major=mapper.getMajorStudents(id);
		sqlSession.commit();
		sqlSession.close();
		return major;
	}

}

9、test

package com.onetomany.service;

import com.onetomany.mapper.InterDaoMapper;
import com.onetomany.mapper.MapperImpl;
import com.onetomany.model.Major;
import com.onetomany.model.Stuinfo;

public class Test {
	public static void main(String[] args) {
		
		InterDaoMapper interDaoMapper=new MapperImpl();
		
		Stuinfo student=interDaoMapper.getStuinfo("081005");
		System.out.println(student);
		
		Major major=interDaoMapper.getMajorStudents(15);
		System.out.println(major);
		
	}
}

10、结果

Ubuntu桌面消失?可能是lightdm配置在捣鬼:详细解析/etc/lightdm.conf的优先级机制与实战修复 本文详细解析了Ubuntu系统因lightdm显示管理器配置错误导致桌面消失的问题。通过分析/etc/lightdm.conf的优先级加载机制,提供了从systemctl诊断、调试模式运行到实战修复配置语法错误(如缺失[Seat:*]组)的完整方案。文章还探讨了在系统无法启动时使用chroot或恢复模式进行高级救援,并对比了lightdm与gdm3在NVIDIA驱动环境下的不同表现,帮助用户高效恢复图形界面。 阅读详情

相关推荐

如何在windows下使用cmake编译源码

MyProject/└── build/在MyProject目录下创建并编辑。创建build目录并进入。使用cmake命令生成构建文件。使用适当的命令编译项目。运行生成的可执行文件。

cdj444asdg的博客 3345

详解Mybatis一对多、多对一、多对多

Mybatis一对一、一对多、多对多

菜鸟逆袭之路 2万+

一个Android应用层开发如何转型深入Android Framework?

不知何时起,单纯的Android应用层开发越来越少了,主流技术演变也越来越快,从之前的rxjava到如今的协程,从之前MVC到如今的MVVM,还有Flutter、Compose等技术,可以说是日新月异。

m0_64420071的博客 1910

Mybatis结果映射——一对多

我们知道 Mybatis 的结果映射,如果遇到实体类的属性是自定义,事情就不会那么简单。可能会有一对多,多对一,多对多的情况产生。本文讲解一下多对一的情况。 多对一,指的是 A 表的多行对应 B 表的某一行,就是 A 的多个实例对应 B 的一个实例。比如我们有一张博客表,表里记录了作者,题目,时间,阅读量等信息。还有一张读者表。表里记录了作者姓名、地址等信息。 Blog 表中的多条记录,对应了 Author 表中的一条记录,这就是多对一。...

pan2635376816的博客 1万+

从网格剖分到结果外推:一文拆解HFSS快速扫频(Fast Sweep)的底层逻辑与性能调优

本文深入解析了HFSS快速扫频(Fast Sweep)技术的底层逻辑与性能调优方法。通过ALPS算法实现频带外推,快速扫频相比离散扫频和插值扫频能提升3-5倍计算效率,特别适用于天线阵列、微波滤波器等宽频带分析场景。文章详细介绍了算法架构、参数优化策略及工程实践中的精度保障机制,帮助工程师高效完成电磁仿真。

weixin_28693447的博客 92

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3114

Mybatis 实现一对多

在数据库中,单表的操作是最简单的,但是在实际业务中最少也有十几张表,并且表与表之间常常相互间联系;一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录另一张表B中的一条记录只能对应一张表A中的一条记录,我们用学生和老师之间的关系来实现一对多。通过本次的学习,我们了解并掌握 Mybatis 实现一对多的方法,用一个 List 集合来返回我们的 Student 的对象,

sxzdkfjr的博客 4991

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

mybatis 一对多_Mybatis一对多

一对一domain的写法就是一对一多对一domain的写法也是一对一4、mybatis中的多表查询 表之间的关系有几种: 一对多 多对一 一对一 多对多 举例: 用户和订单就是一对多 订单和用户就是多对一 一个用户可以下多个订单 多个订单属于同一个用户 人和身份证号就是一对一 一个人只能有一个身份证号 一个身份证号只能属于一个人 老师和学生之间就是多对多 一个学...

weixin_40007016的博客 1810

Layout常见错误汇总-不定时更

1、在做LVS时,出现中断错误 解决方法: 重新建立新的schematic和layout文件,对应好其中的元器件,同时两个文件的名字也要对应好“schematic”和“layout”,其他名字的话软件找不到如何对应。

weixin_38753095的博客 4万+

福建公共资源交易平台 portal-sign与响应Data解密逆向实录

本文分析了福建公共资源交易电子公共服务平台的接口加密机制。通过抓包和代码分析,发现请求头中的portal-sign由MD5算法生成,包含固定秘钥和排序后的参数拼接。响应数据采用AES-256-CBC加密,需使用特定Key和IV解密。文章详细介绍了签名生成规则、参数处理流程及加密常量定位方法,为接口对接提供了技术参考。整个过程展示了如何通过逆向工程还原前端加密逻辑,最终实现脱离浏览器环境的纯协议调用。

自成背后的博客 1157

MyBatis 从入门到精通:MyBatis中的一对多关系

在MyBatis中,处理一对多关系是一项常见任务,本文将深入探讨如何有效处理这种关系,让你对MyBatis的一对多处理有更清晰的认识。随着数据处理需求的不断增长,对一对多关系的处理也会变得更加复杂。未来,我们可以期待更多MyBatis的更新,以应对不断变化的需求。通过本文的学习,相信你对MyBatis中的一对多处理有了更深入的了解。同样,我们需要定义一些实体类来代表我们的数据模型。这时,我们可以使用查询嵌套的方式来处理。另一种处理一对多关系的方式是通过结果嵌套,这在某些情况下可能更加高效。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 5528

Pytest教程:Pytest插件原理

Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。

旦莫的博客 636

MyBatis的ResultMaps之一对多关系

1. 一对多的关系 在我们的例子中,我们的教师可以教一个或多个的课程,这就意味着教师与课程之间的关系是一对多的。我们可以运用元素来获取一对多的关系。 教师的表信息如下: 课程表信息如下: 在上面的表信息中,我们的教师John拥有一门课程,但是我们的教师Ying却有两门课程。下面是教师和课程的JavaBean。 public class Course { private

owen_william的博客 7055

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MyBatis一对多关系的配置

用户与用户订单 关系分析:一个用户对应多个订单,多个订单对应一个用户。(1...n) 实现步骤: 导入jar包; 创建数据库数据表 。在多的一方,添加一的一方的主键作为外键,利用外键关联; 创建pojo类; 编写dao层接口; 根据pojo类创建相应的xxxMapper.xml文件,完成持久化类与数据表的映射,以及数据表与表之间的关系映射,并根据dao层方法定义持久化类的操作; 创建mybatis-config.xml文件,完成连接池创建、与数据库的连接; 测试操作 1、实体类创建 : .

你的调料包 2006

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Mybatis 实战:一对多关系

文章目录一 背景1.1 举例1.2 相关概念二 操作步骤2.1 创建表2.2 创建项目2.3 项目配置2.4 创建 model2.5 创建 mapper2.6 测试三 故障排除及总结3.1 运行报错四 参考资料及源码 一 背景 1.1 举例 公司有若干名员工,此时,该公司与其员工之间的关系就属于一对多的关系。根据以上信息,我们可以创建公司信息与员工信息两张表。其中,公司表沿用上一个例子中的表。根据公司编号(ID)查询其个人及公司信息。 1.2 相关概念 constructor - 用于在实例化类时,注入结

晨曦蜗牛 1076

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mybatis中一对多关系

一对多 一个老师对应多个学生,对于老师而言,就是一对多的关系. 实体类 package com.lx.pojo; import lombok.Data; import java.util.List; @Data public class Teacher { private int id; private String name; //一个老师拥有多名学生 private List<Student> students; } package com.

m0_47734729的博客 216

mybatis实现一对多关系映射

sql: /* Navicat MySQL Data Transfer Source Server : mysql Source Server Version : 50549 Source Host : localhost:3306 Source Database : mybatis Target Server Type ...

乔治大哥的博客 1401

MyBatis一对多关系处理技巧

在现实世界的许多业务场景中,数据之间的关系错综复杂,其中一对多关系是数据库设计中常见的一种关系。例如,在“学校-班级-学生”的关系中,一个学校可以拥有多个班级,而一个班级又可以有多个学生。这种一对多的关系在MyBatis框架中同样重要,因为它直接关系到数据查询的效率和准确性。在MyBatis中,一对多关系概述主要涉及如何定义和操作这种关系。首先,我们需要明确一对多关系的定义:在一对多关系中,一个实体(如学校)可以与多个实体(如班级)相关联,而每个实体(如班级)只能与一个实体(如学校)相关联。

JavaCodePro的博客 474

MyBatis实现一对多关系

本实例使用模板和标签的例子,一个模板有多个标签,是一个一对多的关系,用MyBatis实现。 模板实体类 /** * 模版列表响应对象 * @author KyrieCao * @date 2019/2/24 14:38 */ @Data @ToString public class TemplateListResp { private Integer id; priva...

KyrieCao的博客 377

MyBatis复杂的结果集映射(一对多关系)

一对多关系:一个老师对多个学生 对于老师来说就是一对多关系 首先建表: 拷贝db.properties、log4j.properties、mybatis-config.xml文件 创建Student、Teacher实体类。 package pojo; import lombok.Data; @Data public class Student { private int id; private String name; //学生需要关联一个老师 private int tid; } package

weixin_44976835的博客 997

Mybatis 中,实现一对多关系

3. 嵌套结果(Nested Results):使用嵌套结果可以将查询结果分别映射到主对象和子对象中,然后通过 Java 对象的关联属性将两个对象关联起来。1. 嵌套查询(Nested Queries):使用嵌套查询可以在一个 SQL 语句中同时查询主表和从表的数据,然后通过关联字段将两个数据集合并到一起。2. 延迟加载(Lazy Loading):使用延迟加载可以在需要时再去加载子对象,避免在查询主对象时额外地查询子对象。开发者可以根据需求选择合适的方式,实现高效、灵活的数据查询和操作。

weixin_47495688的博客 1021

Mybatis基础学习之一对多关系处理

前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。 这个Mybatis基础学习系列是用来记录我学习Mybatis框架基础知识的全过程 (这个系列是参照B站狂神的Mybatis最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!) 之后我将尽量以两天一更的速度更新这个系列,还没有学习Mybatis3框架的小伙伴可以参照我的

weixin_45301250的博客 1322
上一篇: Mybatis入门crud
下一篇: SringMVC Mybatis结合例子
zero_130
博客等级 码龄10年 21粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值