Mybatis
2025/12/3大约 3 分钟
Hibernate 和 MyBatis 有什么区别?
回答:
SQL编写:
- Hibernate:自动生成SQL,无需手写SQL,适合快速开发。
- MyBatis:需要手写SQL,灵活性高,适合复杂查询和性能优化。
映射方式:
- Hibernate:全自动ORM映射。
- MyBatis:半自动映射,需要手动配置映射关系。
缓存机制:
- Hibernate:内置强大的一级、二级缓存机制。
- MyBatis:提供一级缓存,二级缓存需手动配置。
事务管理:
- 都支持JDBC和Spring事务管理。
适用场景:
- Hibernate:适合开发需求变化小、数据结构稳定的项目。
- MyBatis:适合对SQL控制要求高、业务逻辑复杂的项目。
MyBatis 是如何进行分页的?
- MyBatis 本身不支持分页语法,但可以通过以下三种方式实现分页:
- 手动分页
原生SQL分页: 在 SQL 语句中直接使用数据库的分页语法(如 MySQL 的LIMIT offset, size)进行分页。 - PageHelper 插件(第三方)
- MyBatis-Plus 内置分页
- PageHelper 与 MyBatis-Plus 分页
- 手动分页
MyBatis 字段名与数据库列名不一致时的映射方式总结
1. 原生 MyBatis 的处理方式:
方式一:使用 SQL 别名
SELECT user_name AS userName FROM user方式二:使用
@Results注解@Select("SELECT user_id, user_name FROM user") @Results({ @Result(property = "userId", column = "user_id"), @Result(property = "userName", column = "user_name") }) List<User> getAllUsers();方式三:使用
<resultMap>映射<resultMap id="userMap" type="User"> <result property="userId" column="user_id"/> <result property="userName" column="user_name"/> </resultMap>方式四:配置驼峰命名自动映射
mybatis: configuration: map-underscore-to-camel-case: true实体字段使用驼峰命名,如
userName,可自动映射user_name。
2. MyBatis-Plus 的处理方式(MyBatis-Plus 专有):
使用
@TableName指定表名@TableName("user") public class User { ... }使用
@TableField指定字段映射@TableField("user_name") private String userName;
MyBatis 的缓存机制?
MyBatis 提供两级缓存机制:
一级缓存(本地缓存):
- 默认开启,作用范围是同一个
SqlSession。 - 相同查询在同一个
SqlSession中执行多次时,第二次会从缓存中读取。 SqlSession关闭后,一级缓存失效。
- 默认开启,作用范围是同一个
二级缓存(全局缓存):
- 默认关闭,需要在
mapper.xml中通过<cache/>显式开启。 - 作用范围是同一个 Mapper 的多个
SqlSession之间共享。 - 可配置缓存实现类、过期时间、大小、清除策略等。
- 默认关闭,需要在
使用示例(开启二级缓存):
<mapper namespace="com.example.mapper.UserMapper"> <cache/> </mapper>注意事项:
- 更新操作会清空相关缓存。
- 二级缓存中的对象必须实现
Serializable接口。 - 与 Spring 集成时,推荐使用第三方缓存(如 EhCache、Redis)配合二级缓存使用。
MP中的selectOne()方法和selectList()方法的区别?
回答:
返回结果:
selectOne():返回单个实体对象,查询结果必须为1条或0条记录。selectList():返回List集合,查询结果可以是0条、1条或多条记录。
异常处理:
selectOne():当查询结果超过1条时抛出TooManyResultsException异常。selectList():不会抛出异常,返回所有匹配的记录。
使用场景:
selectOne():用于确定唯一结果的查询,如根据主键查询。selectList():用于可能返回多条记录的查询,如条件查询、列表查询。