1.Mybatis-Spring原理分析 -- @MapperScan注解
2.MyBatis 注注解原理:扫描 Mapper 接口
3.Mybatis在注解形式下,遍历list集合
4.ResultMap、解源Association、原理Collection、注注解Mybatis运行原理和注解开发
5.MyBatis源码解析之基础模块—TypeHandler
Mybatis-Spring原理分析 -- @MapperScan注解
根据@MapperScan注解配置的包路径,扫描所有mapper接口,原理手机plp源码创建BeanDefinition对象,注注解修改beanClass属性值为MapperFactoryBean,解源注册到Spring容器中,原理为后续Bean初始化做准备。注注解
在启动流程中,解源Spring扩展点ImportBeanDefinitionRegistrar被触发,原理其注册BeanDefinition到容器。注注解同时,解源BeanDefinitionRegistryPostProcessor也被激活,原理创建ClassPathMapperScanner对象,对@MapperScacn中的包路径进行扫描,创建并修改BeanDefinition。
ImportBeanDefinitionRegistrar是Spring扩展点之一,其在启动时回调registerBeanDefinitions方法,将MapperScannerConfigurer的BeanDefinition注册到容器中。
而BeanDefinitionRegistryPostProcessor也是checksum源码Spring的扩展点之一,在启动时回调postProcessBeanDefinitionRegistry方法,创建ClassPathMapperScanner对象,对@MapperScacn定义的包路径进行扫描,创建、修改BeanDefinition。
ClassPathMapperScanner负责扫描mapper层的所有接口,创建Bean定义,并设置beanClass和autoWireMode。
最后,创建MapperFactoryBean,其属性根据扫描到的mapper接口自动配置,完成初始化。
MyBatis 原理:扫描 Mapper 接口
在MyBatis中,Mapper接口的扫描依赖MyBatis和Spring项目。实现Mapper接口的自动扫描主要有两种方式:@Mapper和@MapperScan注解。
@Mapper注解通常用于Mapper接口上,若仅需扫描带有该注解的接口,需引入mybatis/spring-boot-starter项目。在Spring未找到MapperScannerConfigurer和MapperFactoryBean的Bean时,AutoConfiguredMapperScannerRegistrar会自动扫描并注入Mapper接口的实现类。这个过程可通过MybatisAutoConfiguration的notion源码源码来理解。
相比之下,@MapperScan注解是Mybatis的常见扫描方式。它通过@Import(MapperScannerRegistrar.class)导入MapperScannerRegistrar,进行Mapper扫描逻辑。MapperScannerRegistrar通过实现ImportBeanDefinitionRegistrar接口的registerBeanDefinitions方法完成Mapper的扫描。
核心组件MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口,其主要在registerBeanDefinitions方法中处理Mapper的自动注入。具体来说,它会创建ClassPathMapperScanner,扫描指定包中的Mapper,生成BeanDefinition,这些BeanDefinition最终会在Spring的Bean创建过程中被转换为Mapper的实例。
MapperFactoryBean是MyBatis/Spring用来表示Mapper的Bean,它基于SqlSessionDaoSupport,提供了FactoryBean接口的实现。获取Mapper时,会通过FactoryBean的getObject方法返回Mapper的代理类,如SqlSessionTemplate,它与Spring事务紧密关联并支持线程安全。
Configuration和MapperRegistry是MyBatis的核心配置,前者管理Mapper的sdcc源码信息,后者存储Mapper实例。在使用MapperRegistry获取Mapper时,会优先尝试从缓存中获取,只有当缓存中不存在时,才会创建新的MapperProxy实例。
Mybatis在注解形式下,遍历list集合
在Mybatis注解形式下,遍历list集合可以通过自定义SQL来实现。
虽然Mybatis提供的Java API中没有直接对应foreach的注解,但通过使用特定的SQL语句,仍可以在注解形式中实现遍历操作。
一种方法是通过使用@Delete注解并结合多个SQL语句实现,示例如下:
@Delete({
""
})
int deleteByPrimaryKeys(@Param("roleIds") List roleIds);
这里,角色ID列表(roleIds)作为参数传递,用于删除与之关联的角色。
在理解参数项时,需要明确以下几点:
item: 指的是遍历过程中获取的集合元素。
index: 代表集合中元素的序号,在list和数组中表现为索引,在map中则作为键。
collection: 是cybermiles源码程序传入的值的集合,用于遍历并执行特定操作。
open: 对于foreach循环的起始符号。
close: 对于foreach循环的结束符号。
separator: 用于元素之间的分隔,通常使用逗号(,)。
通过这种方式,即使在Mybatis注解形式下,仍能实现对list集合的遍历,满足业务需求。
ResultMap、Association、Collection、Mybatis运行原理和注解开发
学习目标:列名和属性名不一致问题_resultMap标签的使用
了解resultMap,其在处理列名与属性名不一致时提供映射功能,帮助开发者实现灵活的数据绑定。
resultType与resultMap的区别在于,resultType直接指向Java类型,适用于简单映射;resultMap则用于复杂映射场景,支持多级嵌套与自定义属性,更加灵活。
多表关联查询_设计表结构
MyBatis实现多表关联查询时,需考虑表间关系,设计合理的数据库结构,运用内连接等查询策略。
数据库表格间的关系有外键、自关联、多对多关系等,设计时需明确这些关系,以实现高效查询。
多表关联查询_业务装配方式
业务装配是指通过映射文件直接实现多表关联,简化业务逻辑。具体实现时,需定义合适的resultMap或association节点。
总结MyBatis优点包括:强类型结果集、复杂查询支持、代码生成、性能优化。
多表关联查询_resultMap_单个对象_N+1方式实现
使用association节点实现单个对象关联,通过N+1原则处理多表查询,确保性能优化。
在mapper中传递参数时,需明确参数类型和数量,确保与SQL映射文件中的方法签名匹配。
多表关联查询_resultMap_集合对象_N+1方式实现
标签用于处理集合对象关联,通过N+1原则实现多表查询,同时优化性能。
总结Mapper接口工作原理,主要负责构建SqlSession对象,执行SQL查询,结果映射到Java对象。
Mapper接口方法参数不同时,可实现方法重载,灵活处理不同查询需求。
多表关联查询_Auto-Mapping配合别名实现
Auto-Mapping功能结合表别名,简化多表关联查询,自动匹配属性与字段。
Mybatis如何将SQL执行结果封装至目标对象,通过resultMap、association等方式实现,支持多种映射形式。
注解开发详解
注解在MyBatis中用于简化配置,实现更简洁、灵活的映射规则。
MyBatis中常用注解包括@Insert、@Update、@Delete、@Select等,用于实现CRUD操作。
MyBatis注解_CRUD
在使用注解进行CRUD操作时,需注意注解的正确应用,确保SQL语句与预期逻辑一致。
MyBatis注解_关联查询
@Results和@Result注解用于描述结果集的映射规则,通过注解实现多表关联查询。
分析MyBatis运行原理
MyBatis运行过程中,涉及SqlSessionFactory、SqlSession、Executor等关键类,负责构建查询环境、执行SQL、结果映射。
当实体类属性名与数据库字段名不一致时,通过resultMap或association映射解决。
总结MyBatis运行原理,关键在于构建映射关系、执行SQL语句、结果集处理与对象映射。
MyBatis源码解析之基础模块—TypeHandler
MyBatis源码解析之基础模块—TypeHandler
在MyBatis的上一章节中,我们探讨了Plugin模块的拦截器配置和自定义。接下来,我们将深入理解数据库与Java对象之间转换的核心机制,即Type模块的源码。 Type模块位于org.apache.ibatis.type,其架构设计包含IntegerTypeHandler和UnknownTypeHandler等实现类,用于处理不同类型的转换。JdbcType枚举定义了常见的数据库数据类型,MappedTypes和MappedJdbcTypes注解用于标注Java类型和数据库类型的映射。 对于类型转换,TypeHandler是核心接口,它定义了处理方法。BaseTypeHandler是抽象基类,采用模板方法模式,提供了通用逻辑,而具体实现由子类如IntegerTypeHandler完成。对于没有明确泛型类型的转换,UnknownTypeHandler则负责处理。 TypeAliasRegister负责注册Java常用数据类型的别名,而TypeHandlerRegister是类型转换器的注册中心,MyBatis在初始化时已经自动注册了常用TypeHandler。ResultSetWrapper则负责包装ResultSet,提供类型转换器的获取,最终由ResultSetHandler处理实际的数据处理。 总结来说,Type模块在MyBatis中负责数据的类型转换,通过TypeHandler和相关的注册机制,确保了数据库操作与Java对象之间的无缝对接。在实际开发中,无需过多配置,MyBatis就能自动完成类型转换,使得开发更为便捷。