MyBatis 核心原理:SqlSession、Mapper 代理、插件机制与缓存(101)
引言:你写的是接口,MyBatis 怎么让它跑起来 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 这一行代码背后,MyBatis…
DOCMyBatis 动态 SQL:if、choose、foreach、trim 与 OGNL 表达式(102)
引言:为什么 MyBatis 的动态 SQL 比拼接字符串更安全 在 JDBC 时代,动态 SQL 是通过字符串拼接完成的: "SELECT FROM user WHERE 1=1 " + (name != n…
DOCMyBatis 与 Spring 整合:SqlSessionFactoryBean、MapperScannerConfigurer 与事务集成(103)
引言:为什么 一行注解就能让 Mapper 接口变成 Spring Bean 如果你只用过 Spring Boot 集成的 MyBatis,可能会觉得 @MapperScan("com.example.mapp…
DOCMyBatis 结果映射:ResultMap、关联查询、延迟加载与 N+1 问题(104)
引言:为什么 和 不能混用 MyBatis 的结果映射是连接"数据库行"和"Java 对象"的桥梁。最简单的映射是 resultType="User" ,MyBatis 通过反射自动将列名映射到同名的 Java…
DOCMyBatis 类型处理器:TypeHandler 原理、自定义类型处理器与枚举映射(105)
引言:为什么 字段能自动映射为 MyBatis 从 ResultSet 中读取 create time 列的值时,调用的是 ResultSet.getTimestamp() 还是 ResultSet.getOb…
DOCMyBatis 分页:RowBounds、PageHelper 原理与物理分页(106)
引言:逻辑分页和物理分页的根本区别 MyBatis 的 RowBounds 是逻辑分页——它把全部数据查出来,然后在内存中截取指定范围的行。如果你的表有 100 万行数据, RowBounds 会查出全部 10…
DOCMyBatis 多数据源与动态数据源切换:AbstractRoutingDataSource(107)
引言:读写分离和数据源切换的底层实现 在一个典型的读写分离架构中,写操作走主库(Master),读操作走从库(Slave)。如果让你实现这个路由逻辑,你会怎么做?最简单的方案是用 AOP 切面:拦截 @Tran…
DOCJPA 与 Hibernate 核心原理:EntityManager、持久化上下文与对象状态(108)
引言:JPA 和 Hibernate 是什么关系 JPA(Java Persistence API)是一套 ORM 规范,定义了 EntityManager 、 EntityManagerFactory 、 @…
DOCJPA 关联映射:一对一、一对多、多对多与级联操作(109)
引言:为什么 默认是延迟加载而 默认是立即加载 JPA 的关联映射注解( @OneToOne 、 @OneToMany 、 @ManyToOne 、 @ManyToMany )定义了实体之间的关系。但真正让开发…
DOCORM 选型与边界:MyBatis、JPA、jOOQ 的生产力、可控性和复杂查询取舍(110)
阅读时间:约 45 分钟 难度:中高级 编号:110 一、引言:为什么 ORM 选型是"一选定终身"的决策 在 Java 技术栈中,ORM(Object Relational Mapping)框架的选型,往往是…