资讯动态

4. 关系型数据库-MySQL-Mybatis基础知识

发布时间:2026/10/13 6:59:09 来源:尧图企业网站定制
文章目录前言一、MyBatis简介二、MyBatis特点七、缓存机制:前言一、MyBatis简介Mybatis是一个半ORM对象关系映射框架它内部封装了JDBC开发时只需要关注SQL语句本身不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql可以严格控制sql执行性能灵活度高。MyBatis 可以使用 XML 或注解来配置和映射原生信息将 POJO映射成数据库中的记录避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。通过xml 文件或注解的方式将要执行的各种 statement 配置起来并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句最后由mybatis框架执行sql并将结果映射为java对象并返回。从执行sql到返回result的过程。二、MyBatis特点优点1基于SQL语句编程相当灵活不会对应用程序或者数据库的现有设计造成任何影响SQL写在XML里解除sql与程序代码的耦合便于统一管理提供XML标签支持编写动态SQL语句并可重用。2与JDBC相比减少了50%以上的代码量消除了JDBC大量冗余的代码不需要手动开关连接3很好的与各种数据库兼容因为MyBatis使用JDBC来连接数据库所以只要JDBC支持的数据库MyBatis都支持。4能够与Spring很好的集成5提供映射标签支持对象与数据库的ORM字段关系映射提供对象关系映射标签支持对象关系组件维护。缺点1SQL语句的编写工作量较大尤其当字段多、关联表多时对开发人员编写SQL语句的功底有一定要求。2SQL语句依赖于数据库导致数据库移植性差不能随意更换数据库。七、缓存机制:Mybatis整体一级缓存localCache在应用运行过程中我们有可能在一次数据库会话中执行多次查询条件完全相同的 SQLMyBatis 提供了一级缓存的方案优化这部分场景如果是相同的 SQL 语句会优先命中一级缓存避免直接对数据库进行查询提高性能。每个 SqlSession 中持有了 Executor每个 Executor 中有一个 LocalCache。当用户发起查询时MyBatis 根据当前执行的语句生成 MappedStatement在 Local Cache 进行查询如果缓存命中的话直接返回结果给用户如果缓存没有命中的话查询数据库结果写入 Local Cache最后返回结果给用户。具体实现类的类关系图如下图所示1MyBatis 一级缓存的生命周期和 SqlSession 一致。2MyBatis 一级缓存内部设计简单只是一个没有容量限定的 HashMap在缓存的功能性上有所欠缺。3MyBatis 的一级缓存最大范围是 SqlSession 内部有多个 SqlSession 或者分布式的环境下数据库写操作会引起脏数据建议设定缓存级别为 Statement。二级缓存在上文中提到的一级缓存中其最大的共享范围就是一个 SqlSession 内部如果多个 SqlSession之间需要共享缓存则需要使用到二级缓存。开启二级缓存后会使用 CachingExecutor 装饰Executor进入一级缓存的查询流程前先在 CachingExecutor 进行二级缓存的查询具体的工作流程如下所示二级缓存开启后同一个 namespace 下的所有操作语句都影响着同一个 Cache即二级缓存被多个 SqlSession 共享是一个全局的变量。当开启缓存后数据的查询执行的流程为二级缓存 - 一级缓存 - 数据库1MyBatis 的二级缓存相对于一级缓存来说实现了 SqlSession 之间缓存数据的共享同时粒度更加细能够到 namespace 级别通过 Cache 接口实现类不同的组合对 Cache 的可控性也更强。2MyBatis 在多表查询时极大可能会出现脏数据有设计上的缺陷安全使用二级缓存的条件比较苛刻。3在分布式环境下由于默认的 MyBatis Cache 实现都是基于本地的分布式环境下必然会出现读取到脏数据需要使用集中式缓存将 MyBatis 的 Cache 接口实现有一定的开发成本直接使用 Redis、Memcached 等分布式缓存可能成本更低安全性也更高。参考文章

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑