MyBatis一对多问题记录

mybatis一对多性能优化demo mybatis 一对多性能优化 demo mybatis 一对多性能优化 demo 立即下载

MyBatis一对多。

需要cglig.jar和asm.jar的支持。

有三张表,通过User表查询User_Role中核角色的对应关系,然后通过这个对应关系查询到用户所属角色。

上代码:

user.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.yrsoft.dao.UserDao">
	<resultMap type="com.yrsoft.entity.User" id="User" >
		<id column="id" property="id"/>
		<result column="username" property="username"/>
		<result column="password" property="password"/>
		<result column="isDelete" property="isDelete"/>
		<result column="createDate" property="createDate"/>
		<collection property="userRoles" ofType="com.yrsoft.dao.UserRoleDao.UserRole" select="com.yrsoft.dao.UserRoleDao.findByUserId" column="id">
		</collection>
	</resultMap>
	
	<select id="findUserByUserName" resultMap="User">
		select * from t_user where username = #{username}
	</select>
	<select id="findAll" resultMap="User">
		select * from t_user
	</select>
</mapper>

userRole.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.yrsoft.dao.UserRoleDao">
	<resultMap type="com.yrsoft.entity.UserRole" id="UserRole">
		<id column="id" property="id"/>
		<result column="user" property="userId" javaType="int" jdbcType="INTEGER"/>
		<result column="role" property="roleId" javaType="int" jdbcType="INTEGER"/>
		<association property="role" column="role" javaType="com.yrsoft.entity.Role" select="com.yrsoft.dao.RoleDao.findById"/> 
	</resultMap>
	
	<select id="findById" resultMap="UserRole">
		select * from t_user_role where id = #{id}
	</select>
	<select id="findAll" resultMap="UserRole">
		select * from t_user_role
	</select>
	<select id="findByUserId" parameterType="int" resultMap="UserRole">
		select * from t_user_role where user=#{id}
	</select>
</mapper>


role.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.yrsoft.dao.RoleDao">
	<resultMap type="com.yrsoft.entity.Role" id="Role">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<result column="description" property="description"/>
	</resultMap>
	
	<select id="findById" resultMap="Role">
		select * from t_role where id = #{id}
	</select>
	<select id="findAll" resultMap="Role">
		select * from t_user_role
	</select>
</mapper>


User.java

package com.yrsoft.entity;

import java.sql.Timestamp;
import java.util.List;

/***
 * 用户表
 */
public class User {
	Integer id;
	/** 用户名 **/
	String username;
	/** 密码 **/
	String password;
	/** 是否删除 **/
	Integer isDelete;
	/** 创建时间 **/
	Timestamp createDate;
	// 多对多用户权限表
	List<UserRole> userRoles;

	public Integer getId() {
		return id;
	}

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

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Integer getIsDelete() {
		return isDelete;
	}

	public void setIsDelete(Integer isDelete) {
		this.isDelete = isDelete;
	}

	public Timestamp getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Timestamp createDate) {
		this.createDate = createDate;
	}

	public List<UserRole> getUserRoles() {
		return userRoles;
	}

	public void setUserRoles(List<UserRole> userRoles) {
		this.userRoles = userRoles;
	}

	@Override
	public String toString() {
		return "\"User\":{\"id\":" + id + ",\"username\":" + username + ",\"password\":"
				+ password + ",\"isDelete\":" + isDelete + ",\"createDate\":"
				+ createDate + ",\"userRoles\":" + userRoles + "}";
	}

	
}

UserRole.java

package com.yrsoft.entity;

/***
 * 用户角色表
 */
public class UserRole {
	Integer id;
	int userId;
	int roleId;
	/*User user;*/
	Role role;

	public Integer getId() {
		return id;
	}

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

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public int getRoleId() {
		return roleId;
	}

	public void setRoleId(int roleId) {
		this.roleId = roleId;
	}

	public Role getRole() {
		return role;
	}

	public void setRole(Role role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "\"UserRole\":{\"id\":" + id + ",\"userId\":" + userId + ",\"roleId\":"
				+ roleId + ",\"Role\":"+role+"}";
	}

}

Role.java

package com.yrsoft.entity;

/****
 * 角色表
 */
public class Role {
	Integer id;
	/** 角色名 **/
	String name;
	/** 角色说明 **/
	String description;
	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 String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	@Override
	public String toString() {
		return "\"Role\":{\"id\":" + id + ",\"name\":" + name + ",\"description\":"
				+ description + "}";
	}
	
	

}


关键点:

一:一对一使用<association>标签,一对多直接使用<collection>标签
二:association标签中的column为要传进去的列名,是数据库中的列名,不是bean中的属性名。collection中的column同理

三:collection中,一定要写ofType属性,告诉系统你这个集合的泛型,有点像resultMap


参考文章:孤傲苍狼的博客

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC 阅读详情

相关推荐

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 540

Mybatis 映射 collection 一对多 缺少数据

collection 一对多 缺少数据

m0_52459437的博客 1269

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

Mybaits一对多映射结果集丢失数据问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34357962的博客 1487

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1127

5、自适应 RBF 神经网络控制方法解析

本文详细解析了基于RBF神经网络的多种自适应控制方法,包括针对函数未知、参数未知以及存在外部干扰的非线性系统的控制策略。通过李雅普诺夫稳定性理论设计自适应律,确保闭环系统稳定,并结合仿真示例和MATLAB代码实现,展示了方法的有效性。文章还对比了不同控制方法的适用场景,并给出了实际应用流程,为复杂系统控制提供了系统性解决方案。

ol789012的博客 71

Myatis 系列之 一对多、多对一 及 ResultMap的使用

GitHub 传送门在Mybatis中,可以使用resultMap(结果集映射)作为sql的返回类型数据库表字段名和实体类属性名不一致的问题;多对一问题:例如:多个学生对应同一个老师,查询每个学生信息(包含老师对象属性)一对多问题:例如:一个老师教学多个学生,查询某个老师信息及其属下学生(包含学生列表)

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 360

C/C++小宇宙代码(完整代码)

C语言实现小宇宙的完整代码。

AIGC 2523

MyBatis系列02——ResultMap、多对一、一对多

ResultMap 、一对多、多对一ResultMap多对一创建数据表创建实体类编写Mapper方法编写mapper.xml文件编写测试类一对多总结 ResultMap 当数据库的字段名和Java中实体类的属性名不一致时,比如: 这个时候Mybatis自动映射就会失败,比如: 结果为: 这是因为, select * from user where id = #{id} 等价于 select id,name,pwd from user where id = #{id} mybatis会根据这些查

qq_36895015的博客 843

【unity游戏开发入门到精通——通用篇】Post Processing 后处理插件Post-process Volume 和 Volume最全基础使用说明

之前我已经实现了不少后处理功能,本文其实就是将他们归类整理,以便更好的查找和理解。在Unity中,后处理(Post-Processing)是在相机所捕捉的图像上应用一些特殊效果的过程,后处理会让图像视觉效果更好(前提是做的好)。这些效果的范围有非常细微的颜色调整,也包括整体的美术风格的大修,可以让场景看起来更加真实或风格化,或者只是变得更好看。就像我们都会用手机拍照,但很多时候我们拍的原始的相片都打不到我们想要的效果。比如照片可能亮度不够,颜色不饱和或者对比度不好等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 7894

提示词工程在机器翻译质量提升中的应用

Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords

AI天才研究院 1151

自定义映射resultMap解决一对多和多对一的问题

自定义映射resultMap解决一对多和多对一的问题

weixin_44260350的博客 822

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

myBatis一对多聚合查询问题记录

myabtis 一对多

qq_27621745的博客 960

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mybatis一对多表查询返回记录不正常问题解决方案

一、现在有两个表: 1)主表:t_party_building_notice,为党建的通知。 实体类:TpartyBuildingActivety.java @Data public class TPartyBuildingActivity extends BaseEntity { private static final long serialVersionUID = 1L; /** ID */ private String id; /** 项目ID */

文都龙哥 937

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

设置Mybatis(3.2.8)实体嵌套关系(一对多,多对多)遇到的问题及经验总结记录

原始目标: 配置好mapper,使得可以在实体中表示表之间的联系(一个表外键,用另一个实体表示) 深读了mybatis 官方的文章,最后总结出一最重要的的一条,一定要好好利用官方 的autoMapping 特性,否则就得一条条写映射关系了。当然对于实体的嵌套填充, 我只做一层,再往下走就需要在程序逻辑上做一些处理 这里配置的逻辑只与表在逻辑上的连接相关,是否在数据中实现关系无关。

知行合一 3779

mybatis以注解形式一对多进行查询两个不相同的键如何关联

1.概要 本文主要记录我在学习mybatis注解时遇到的一对多查询中,两个不相同的键如何关联的问题。 这是我在t_type表中的构造 t_blog的构造(截取一部分) 这里有一个问题,因为这两个表是通过外键连接的(t_type.id->t_blog.type_id)在进行多表查询的时,我们如何对他们俩进行连接呢? 废话不多说,上代码 @Select("select id type_id ,name from t_type ") @Results({ @Resul

Mrgth的博客 286

mybatis 一对多/多对多 查询为空

在学mybatis的一对多,多对多关联查询时,由于还没添加关联关系,外键为空,导致查询后返回结果为空。 这里模仿学生(student)与班级(classes)与选课(stu_cou)的关系,在查询一个学生时,把学生表(student)与班级表(classes)与选课表(stu_cou)三个表利用id连接起来,当选课表与当前学生没有联系时,查询为空 原本的select配置是: <select

CASER_HDMI的博客 3834

Mybaits的association关联只能返回一条记录问题

场景:一个用户可以写多篇文章,先查用户再查文章,属于一对多关联。 问题:使用association便签在user下面关联article,多篇文章只能返回一个。 User实体 public class User { private int id; private String name; private int age; private Article article; //...

lxl110801311的博客 1515

MyBatis-Plus多表关联分页查询问题解析与解决方案

MyBatis-Plus多表关联分页查询问题解析与解决方案 【免费下载链接】mybatis-plus mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com 低代码组件库 http://aizuda.com ...

gitblog_01429的博客 528

关于mybatis复杂对象只返回最后一条

最近项目都在使用mybatis。遇到一个问题,多表查询,查一大堆字段,中间关系比较复杂。 最开始打算使用 resultMap id="dataMap" type="com.a.abc.bean.AbcData"> association property="abcS" javaType="com.a.abc.domain.AbcS"> id proper

602

实战复盘:分页查询返回条数异常?一对多联表的经典陷阱

摘要: 本文复盘一个典型的分页查询陷阱——一对多联表导致返回条数异常。问题表现为某接口在分页查询时,实际返回主记录数(3条)少于预期(4条)。根因在于分页SQL直接联查明细表,导致LIMIT作用于联表后的明细行而非主表记录,经MyBatis合并后丢失数据。修复方案采用"分页查主表+批量补明细"模式:先准确分页查询主表,再通过当前页ID批量获取明细数据回填。该方案保证分页准确性,同时避免N+1查询问题。文章强调分页必须基于主表粒度,并给出三种通用解决方案,为类似一对多场景的分页实现提供最佳

m0_74142079的博客 697

Mybatis-Plus 关联分页模糊查询

一对一 Controller public R selectAll(Page<QualityStandard> page, QualityStandard qualityStandard) Mapper IPage<QualityStandard> findByPage(IPage<QualityStandard> page,@Param("bean") QualityStandard qualityStandard); xml <select

zjy660358的专栏 770

被问 MyBatis 懒加载原理,我当场沉默了三秒……

标准回答(适合面试)“支持,MyBatis 提供了懒加载功能,适用于一对一和一对多的关联查询。它通过动态代理机制,在访问属性时触发延迟加载操作。实现方式是在对象创建时记录 ResultLoaderMap,当调用 getter 时执行查询,通常配合 <association> 或 <collection> 使用 fetchType='lazy' 来控制是否懒加载。在项目中使用时要注意 SqlSession 的生命周期,避免懒加载失败或性能问题。说完这一段,面试官基本就知道你是个“看过源码且下过功夫”的人了。

Small world 999

21. 什么是MyBatis中的N+1问题?如何解决?

N+1 问题是指在进行一对多查询时,应用程序首先执行一条查询语句获取结果集(即 +1),然后针对每一条结果,再执行 N 条额外的查询语句以获取关联数据。:在一对多关系查询中,应用程序首先执行一次查询获取主数据,然后为每一条记录执行 N 次额外查询以获取关联数据,导致大量数据库查询,影响性能。通过合理的 SQL 设计和 MyBatis 的映射配置,可以有效地解决 N+1 问题,优化应用程序的性能。查询批量获取关联数据。:这种方式减少了对数据库的查询次数,但仍然需要手动处理查询结果的关联映射。

zhzjn的博客 1163

MyBatis:NO3 —— ResultMap结果集映射

1.结果集映射ResultMap (1)resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来 (2)ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 (1)手动映射 用于解决实体类和数据库字段名称不匹配的问题 具体步骤:1.返回值类型为 resultMap ; 2.编写resultMap,实现手动映射 手动映射代码案例 (2)高级的结果集映射 解决

note_hsy的博客 340

MyBatis操作数据库常用用法总结1

这里使用的标签是update,这里只有一个id属性名,没有namespace其他的,至于resultType,因为方法那里默认就是返回int类型,所以可以省略不写。但是即使是上边的场景也是需要参数可以被枚举的,是可控的,不过不建议用这种方法,最好在Controller层Service层就能进行确定,做好了服务编排,提高安全性。结论:用于查询的字段,尽量使用#{}预编译处理的方式,尤其是的时候非数据类型的,否则不仅可能会有sql注入的问题,还有sql语句中缺少对应的引号。#{}:原理是预编译处理。

moteandsunlight的博客 542
上一篇: setTimeout传参数问题
下一篇: Mybatis批量插入、更新
levelnini
博客等级 码龄14年 45粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值