Mybatis核心概念与特性解析

0 下载量 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 修改相同数据时,可能导致缓存中的数据不一致。 - 配置复杂:开启二级缓存需要配置,并且需要注意缓存更新策略。