Mybatis核心概念与特性解析
159 浏览量
更新于2024-08-03
收藏 10KB MD 举报
Mybatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis 可以使开发者更专注于 SQL 的编写,同时提供了强大的动态 SQL 支持,使得在处理复杂查询时更加便捷。
**Mybatis 优点:**
1. **消除硬编码**:Mybatis 不再需要在代码中写大量的 JDBC 预编译语句,而是将 SQL 语句直接写在 XML 映射文件中,增强了可读性和可维护性。
2. **灵活性高**:通过 XML 或注解方式,可以自定义 SQL、存储过程,以及高级映射,使得开发更加灵活。
3. **解耦合**:SQL 和 Java 代码分离,降低了 SQL 与程序代码的耦合度,便于数据库优化和团队协作。
**Mybatis 缺点:**
1. **配置繁琐**:虽然 Mybatis 提供了灵活的 SQL 执行机制,但这也意味着需要编写更多的配置文件,对于简单的 CRUD 操作,可能显得过于复杂。
**适用场景:**
1. **功能复杂的应用**:当业务逻辑较为复杂,需要处理多表联查、复杂的条件判断等,Mybatis 的灵活性就显得尤为重要。
2. **SQL 优化**:如果项目对 SQL 性能有较高要求,Mybatis 允许直接编写 SQL,便于进行性能调优。
**Mybatis 架构**:
Mybatis 的核心组件包括 Configuration(配置)、SqlSessionFactory(SQL 会话工厂)和 SqlSession(SQL 会话)。Configuration 存储了整个 Mybatis 的全局配置信息,SqlSessionFactory 负责创建 SqlSession,SqlSession 则用于执行具体的数据库操作。
**SQL 执行流程**:
1. 加载配置,创建 SqlSessionFactory。
2. 通过 SqlSessionFactory 创建 SqlSession。
3. 使用 SqlSession 执行 SQL(通过映射器接口)。
4. 提交事务或回滚事务。
5. 关闭 SqlSession。
**Executor 类型**:
Mybatis 提供了两种 Executor 实现:SimpleExecutor 和 CachingExecutor,其中 CachingExecutor 包含了一级缓存。另外,BatchExecutor 用于批量操作。
**延迟加载(Lazy Loading)**:
延迟加载是一种优化策略,当数据首次被请求时才加载,而不是在加载实体时一次性加载所有关联的数据。
**${} 和 #{} 的区别**:
- `${}`:用于拼接 SQL,内容会被直接替换,存在 SQL 注入风险。
- `#{}`:用于预编译 SQL,内容会被转化为参数,防止 SQL 注入。
**Mybatis 模糊查询 LIKE**:
可以通过在 SQL 映射文件中使用 LIKE 操作符,结合通配符 `%` 来实现模糊查询。
**获取生成的主键**:
在插入数据时,Mybatis 可以通过 `<selectKey>` 标签来获取由数据库自动生成的主键值。
**动态 SQL**:
Mybatis 的 `<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>` 等标签,可以构建动态 SQL。
**Mybatis 插件原理**:
通过 Interceptor(拦截器)实现,插件可以在执行 SQL 之前、之后或异常时进行拦截操作。
**一级缓存**:
默认情况下,同一个 SqlSession 内的多次查询会复用同一查询结果,避免了重复数据库访问。
**一级缓存原理**:
基于 HashMap,存储了 StatementId(基于全限定类名+方法名)到 ResultSet 的映射。
**一级缓存失效**:
- 新的 SqlSession 开启。
- SqlSession 提交或回滚事务。
- 手动清空一级缓存。
**二级缓存**:
二级缓存是跨 SqlSession 的,基于 Ehcache 或其他缓存实现,可以跨多个 SqlSession 共享数据。
**二级缓存原理**:
二级缓存将数据按 namespace 进行分隔,每个 namespace 下有自己的缓存区域。
**缓存缺点**:
- 数据一致性问题:当多个 SqlSession 修改相同数据时,可能导致缓存中的数据不一致。
- 配置复杂:开启二级缓存需要配置,并且需要注意缓存更新策略。
2023-09-08 上传
2020-05-20 上传
2021-07-28 上传
2022-06-17 上传
2020-06-18 上传
2022-09-23 上传
2021-05-11 上传
2021-04-30 上传
2024-03-09 上传