Mybatis
MyBatis 是一个持久层框架,专注于 SQL 映射和数据库操作,通过简单的 XML 或注解配置即可实现高效的数据访问
Mybatis中#{}与${}区别
**#{}:#{}是预编译处理,会把参数变成SQL里的占位符?,能防SQL注入,安全又高效
${}**: ${} 是直接字符串拼接,参数值会原样插到 SQL 里
mybatis中一对多,多对一怎么映射
多对一用association标签
一对多用collection
mybatis主键回填
在标签中使用keyproperty属性,值为id
Mybatis缓存策略
一级缓存
同一个 SqlSession 中有效。默认开启
生命周期:
当执行 insert、update、delete 操作时,一级缓存会被清空。
SqlSession 关闭时,缓存自动清除。
适用场景:
同一会话内多次查询相同数据
二级缓存(Second Level Cache)
Mapper 级别,跨 SqlSession 共享。
生命周期:
需手动启用,配置在 Mapper XML 或注解中。
默认使用 LRU(最近最少使用)淘汰策略。
支持多种缓存实现(如 Ehcache、Redis)。
适用场景:
跨会话的频繁查询(如热点数据)。
数据变动不频繁的静态数据(如字典表)
Mybatis执行流程
- 加载配置文件
解析 mybatis-config.xml,初始化数据源、事务管理器、类型别名等。 - 创建 SqlSessionFactory
通过 SqlSessionFactoryBuilder 构建工厂对象,用于生成 SqlSession。 - 开启 SqlSession
通过 SqlSessionFactory.openSession() 获取会话,开启事务。 - 执行 SQL 操作
调用 Mapper 接口方法或直接执行 SQL 语句。 - 处理动态 SQL
解析 XML 中的动态标签(如、 ),生成最终 SQL。 - 参数绑定与执行
将参数绑定到预处理语句,执行 SQL 并获取结果集。 - 结果映射
将结果集转换为 Java 对象,支持自动或手动映射。 - 事务提交与资源释放
提交事务或回滚,关闭 SqlSession。
Mybatis中resultMap和resultType区别
resultType:
适用于列名与属性名一致的场景,优先选择 resultType,简化配置。
resultMap:
复杂场景使用 列名不一致、需要关联查询或嵌套映射时,使用 resultMap。
能用 resultType 就不用 resultMap,除非必须自定义映射逻辑
MyBatis 怎么处理结果集映射的?字段名不一样咋办?
简单的就直接用 resultType,字段名和数据库列名一致的话,直接映射到实体类就行。
要是字段名不一样,比如数据库里是 create_time,实体类是 createTime,就用 resultMap 做映射,在 XML 里配一下列名和属性名的对应关系就行。
MyBatis 怎么做分页?
普通场景用 PageHelper,大数据量分页 + 选字段 + 游标查询。
Mapper 无实现类为啥能执行?
MyBatis 动态代理,自动生成代理类,解析 SQL 执行。
MyBatis 性能问题怎么解?
加索引、分页查、抽离公共 SQL,避免全表扫描和大结果集。
MyBatis 和 Spring 怎么整合?
Spring 托管 SqlSessionFactory,扫描 Mapper 生成代理对象,直接注入使用。
MyBatis 怎么处理关联查询?
一对一用 association,一对多用 collection,在 resultMap 里嵌套配置。
MyBatis 插件用过啥?原理是啥?
用过 PageHelper,原理是拦截 Executor/StatementHandler 核心组件的方法。