mybatis-collection

mybatis的collection标签允许将一对多的数据映射成一对一的数据集。在处理如用户与设备的关系时,若需将多个设备归并到单个用户对象中,可以使用collection。JavaType指定集合类型,ofType定义泛型,确保映射成功。通过resultMap配置,可以将数据库查询结果转换为UserDto对象,其中包含一个PhoneDto列表,每个PhoneDto代表用户的单一设备信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis – MyBatis 3 | 入门

mybatis的collection标签可以将主键一致的一对多的源数据映射为一对一的数据集

例如查询用户的设备,一个用户可能存在多个设备, 源数据是一对多的多行数据

 

而我们需要的仅仅是一对一的单行数据

 

此时可以考虑使用collection标签进行映射

  • collection标签的JavaType表示的是该集合的类型是ArrayList
  • ofType表示其泛型【不加ofType可能导致映射失败】

通过上面的映射可以得到一个List<Map<String, Object>> 的结果

将username和phonenames作为每个map的key, 而同一个用户的不同手机放到一个集合中.

不同用户作为不同的map

当然了,如果是多个字段需要映射到一个集合中的话

可以考虑使用一个Java类来接收数据

<resultMap id="BaseResultMap" type="UserDto" >
		<id column="id" 		 property="id"/>
		<result column="username" property="username"/>
		<result column="address"    property="address"/>
		<collection property="options" javaType="ArrayList" ofType="PhoneDto">
			<id column="id" property="phone_id"/>
			<result column="phonename" property="phonename"/>
			<result column="description" property="description"/>
		</collection>

</resultMap>

### MyBatis-Plus 的工作原理与实现机制 MyBatis-Plus 是一款基于 MyBatis 的增强工具,在 MyBatis 基础之上仅做增强不做改变,为简化开发、提高效率而生。以下是对其工作原理和内部机制的深入分析: --- #### 1. **核心功能概述** MyBatis-Plus 提供了许多开箱即用的功能,例如分页查询、条件构造器、逻辑删除、乐观锁等。这些功能的实现依赖于底层的拦截器机制以及对 MyBatis 功能的封装。 - **分页查询** MyBatis-Plus 的分页功能通过拦截 SQL 语句并动态修改其行为来实现。具体来说,当接收到分页请求时,会先生成一条 `COUNT` 查询以统计总记录数,然后再生成带有 `LIMIT` 和 `OFFSET` 的分页查询语句[^4]。 - **条件构造器** 条件构造器(Wrapper)是 MyBatis-Plus 提供的一种链式 API,用于构建复杂的查询条件。它将用户的业务逻辑抽象为一组标准的方法调用,并最终将其转换为对应的 SQL 片段。 - **逻辑删除** 逻辑删除是指不真正从数据库中移除数据,而是通过设置某个字段的状态值标记该条记录已被删除。MyBatis-Plus 在执行增删改查操作前,会对指定字段进行判断,从而实现逻辑上的删除效果[^2]。 - **乐观锁** 乐观锁通常利用版本号控制并发冲突。MyBatis-Plus 提供了内置的支持,能够在更新操作时验证版本号是否匹配,如果不匹配则抛出异常提示用户重试。 --- #### 2. **自动填充机制** 为了减少重复代码,MyBatis-Plus 支持字段的自动填充功能。开发者可以通过在实体类中标记需要自动填充的字段及其策略(如创建时间、更新时间),并在插入或更新数据之前由框架自动完成赋值操作[^3]。 此功能的具体实现在于 MyBatis 的拦截器机制。每当触发插入或更新操作时,拦截器会捕获到相关事件并对符合条件的字段按照预设规则进行处理。 --- #### 3. **SQL 拦截器的作用** MyBatis-Plus 广泛使用了 MyBatis 的插件机制(Interceptor)。所有的高级特性几乎都离不开拦截器的帮助。以下列举几个典型的应用场景: - **分页拦截器** 分页功能的核心在于拦截原始 SQL 并对其进行改造,加入 `LIMIT` 和 `OFFSET` 子句以便提取指定范围的数据集。同时还会额外发起一次 `COUNT(*)` 查询用来获取总的记录数量[^4]。 - **逻辑删除拦截器** 当启用了逻辑删除选项后,每次查询都会附加过滤条件排除已标记为“已删除”的记录;而在执行删除动作时,则改为更新对应列而非彻底清除整行数据。 - **乐观锁拦截器** 更新过程中校验当前记录的版本号是否等于预期值,只有相等的情况下才允许继续提交事务。否则报错告知客户端重新尝试同步最新状态后再操作。 --- #### 4. **源码结构剖析** ##### (1)BaseMapper 接口 `BaseMapper<T>` 是 MyBatis-Plus 提供给用户的最基础 DAO 层接口,已经实现了常见的 CRUD 方法无需手写任何 Mapper XML 文件就能直接调用[^2]。 ```java public interface BaseMapper<T> extends Mapper<T> { int insert(T entity); // 插入单条记录 T selectById(Serializable id); // 根据 ID 查找对象 List<T> selectBatchIds(Collection<? extends Serializable> ids); // 批量根据ID查找列表 boolean updateById(T entity); // 修改单条记录 boolean deleteById(Serializable id); // 删除单条记录 } ``` ##### (2)GlobalConfiguration 类 全局配置管理类负责存储一些影响整个项目的参数设定,像默认的主键生成策略、租户隔离模式开关等均在此处定义。 ##### (3)MetaObjectHandler 抽象类 如果希望定制化某些特殊需求可以继承此类覆写相应方法来自定义处理器的行为逻辑,比如日期格式转化或者加密算法应用等。 --- #### 5. **总结** 综上所述,MyBatis-Plus 不仅仅是对原生态 MyBatis 的简单包装,更是站在巨人的肩膀上去探索更多可能性的一次大胆创新实践成果展示。凭借高度可扩展性和易用性的完美平衡赢得了众多开发者的青睐。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值