当前位置: 首页 > news >正文

MyBatis首篇-入门第一文

目录

  • MyBatis
    • 关键特性和概念
    • 使用步骤
      • 简单示例
    • 核心组件
    • 主要特点
    • 常见使用情景
    • 常见优化策略

MyBatis

MyBatis是一个优秀的半自动化持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了大部分JDBC代码和手动设置参数以及获取结果集的繁琐性。用户只需要定义SQL映射语句和映射文件,MyBatis就能将Java对象和数据库表直接关联起来。
MyBatis中文官网
在这里插入图片描述

关键特性和概念

  1. SQL 映射:MyBatis 允许你将 SQL 语句映射到 Java 方法上,这可以通过 XML 配置文件或注解来实现。

  2. 接口驱动:MyBatis 通过接口(Interface)来定义数据库操作,而不是继承一个基类或实现一个接口。你只需要定义接口,MyBatis 会自动实现这个接口。

  3. 动态 SQL:MyBatis 支持动态 SQL,这意味着你可以在运行时构建 SQL 语句,根据条件动态地包含或排除某些语句部分。

  4. 结果映射:MyBatis 能够将数据库查询结果自动映射到 Java 对象中。你可以通过 XML 或注解来定义结果映射。

  5. 缓存机制:MyBatis 提供了一级缓存(Session 级别)和二级缓存(Mapper 级别),以提高性能。

  6. 事务管理:MyBatis 支持声明式事务管理,可以与 Spring 框架集成,实现更高级的事务控制。

  7. 配置和映射文件:MyBatis 的配置通常在 mybatis-config.xml 文件中进行,而 SQL 映射则在单独的 XML 文件中定义。

  8. MyBatis 3:MyBatis 3 引入了新的映射器接口,支持自动映射、关联映射、混合配置等特性。

  9. 插件系统:MyBatis 允许开发者编写自定义插件,以拦截执行过程,实现日志记录、性能监控等功能。

  10. 集成 Spring:MyBatis 可以与 Spring 框架无缝集成,利用 Spring 的依赖注入和事务管理功能。
    在这里插入图片描述

使用步骤

  1. 添加依赖

    • 在你的项目中添加 MyBatis 以及数据库驱动的依赖。如果你使用的是 Maven,需要在 pom.xml 文件中添加相应的依赖项。
  2. 配置 MyBatis

    • 创建 mybatis-config.xml 配置文件,配置 MyBatis 的基本设置,如数据库连接信息、映射文件位置等。
  3. 定义数据模型

    • 创建 Java 类来表示数据库中的表。这些类通常被称为 POJO(Plain Old Java Objects)。
  4. 创建映射器接口

    • 定义一个或多个接口,这些接口的方法将映射到数据库操作。
  5. 编写映射文件

    • 使用 XML 映射文件来编写 SQL 语句,并将其与映射器接口的方法关联起来。
  6. 配置数据源

    • 在项目中配置数据库连接,这可以通过 JDBC 的 DataSource 或使用连接池(如 HikariCP、C3P0)来实现。
  7. 创建 SqlSessionFactory

    • 使用 MyBatis 的 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 实例。
  8. 获取 SqlSession

    • 通过 SqlSessionFactory 获取 SqlSession 对象,它是执行数据库操作的主要对象。
  9. 执行操作

    • 使用 SqlSession 来调用映射器接口中定义的方法,执行数据库操作。
  10. 处理事务

    • 管理事务,可以手动控制事务的提交和回滚,或者使用 Spring 框架的声明式事务管理。
  11. 关闭 SqlSession

    • 操作完成后,关闭 SqlSession 以释放数据库连接。

简单示例

这里我附上有一个简单的示例,展示如何使用 MyBatis

<!-- mybatis-config.xml -->
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
// User.java
public class User {private int id;private String username;// getters and setters
}// UserMapper.java
public interface UserMapper {User selectUser(int id);
}// UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.UserMapper"><select id="selectUser" resultType="org.mybatis.example.User">SELECT id, username FROM users WHERE id = #{id}</select>
</mapper>
// MyBatisTest.java
public class MyBatisTest {public static void main(String[] args) throws IOException {SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));try (SqlSession session = factory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1);System.out.println(user.getUsername());}}
}

在这里插入图片描述

核心组件

  1. SqlSessionFactory

    • SqlSessionFactory 是 MyBatis 架构中的核心,它是通过 SqlSessionFactoryBuilder 从 MyBatis 配置文件中构建出来的。它负责创建 SqlSession 实例,并且持有配置信息和数据库连接信息。
  2. SqlSession

    • SqlSession 是 MyBatis 中执行持久化操作的主要对象。它提供了执行 SQL 语句的方法,如 selectOneselectListinsertupdatedelete 等。每个 SqlSession 都是线程安全的,但最佳实践是使用完立即关闭。
  3. Mapper 接口

    • Mapper 接口是用户自定义的接口,它定义了应用层想要执行的数据库操作。MyBatis 通过动态代理机制实现这些接口,将调用委托给 SqlSession 来执行实际的数据库操作。
  4. 映射文件

    • 映射文件包含了 SQL 语句和结果映射的定义。MyBatis 允许使用 XML 文件或注解来定义 SQL 映射。XML 映射文件通常包含 <select><insert><update><delete> 等元素。
  5. Configuration

    • Configuration 类持有 MyBatis 的所有配置信息,包括数据库连接信息、映射文件路径、环境设置、事务管理器等。它在 SqlSessionFactory 中被创建和维护。
  6. Executor

    • Executor 是 MyBatis 中执行 SQL 语句的组件。它负责 SQL 语句的生成、查询缓存的查询以及事务的提交和回滚。
  7. StatementHandler

    • StatementHandler 负责处理 JDBC StatementPreparedStatement 的操作,将 MyBatis 的调用转化为 JDBC 可以理解的 SQL 执行语句。
  8. ParameterHandler

    • ParameterHandler 负责处理 SQL 语句的参数,将传入的参数映射到 SQL 语句的占位符上。
  9. ResultSetHandler

    • ResultSetHandler 负责处理 JDBC 的 ResultSet,将查询结果转换为 Java 对象。
  10. TypeHandler

    • TypeHandler 是 MyBatis 中用于处理 Java 类型和 JDBC 类型之间映射的组件。MyBatis 内建了许多常用的 TypeHandler,同时也支持自定义 TypeHandler
  11. ObjectFactory

    • ObjectFactory 负责创建映射对象的实例,当 MyBatis 需要实例化对象时使用。
  12. Plugin

    • MyBatis 的插件机制允许开发者通过拦截器的方式介入 MyBatis 的运行过程,实现日志记录、性能监控等功能。
  13. BoundSql

    • BoundSql 包含了 SQL 语句的最终形式以及参数信息,它在执行 SQL 之前生成,并可以用于日志记录或展示实际执行的 SQL。
  14. Cache

    • MyBatis 的缓存组件,包括一级缓存(SqlSession 级别)和二级缓存(全局 Mapper 级别),用于存储查询结果以提高性能。

在这里插入图片描述

主要特点

  1. SQL 映射:MyBatis 允许你将 SQL 语句直接映射到 Java 方法上,提供了 XML 和注解两种方式来定义 SQL 映射。

  2. 接口驱动:MyBatis 使用 Java 接口来定义数据库操作,而不是继承一个基类或实现一个接口。这使得代码更加简洁和易于维护。

  3. 动态 SQL:MyBatis 支持动态 SQL,你可以使用 if、choose、when、otherwise 等标签来构建条件 SQL,实现复杂的逻辑。

  4. 结果映射:MyBatis 能够将数据库查询结果映射到 Java 对象中,支持复杂的嵌套结果映射,如一对多、多对多关系。

  5. 缓存机制:MyBatis 提供了一级缓存(SqlSession 级别)和二级缓存(全局 Mapper 级别),可以显著提高应用程序的性能。

  6. 事务管理:MyBatis 支持 JDBC 事务管理,并且可以与 Spring 框架集成,使用 Spring 的声明式事务管理。

  7. 配置和映射文件:MyBatis 的配置和 SQL 映射可以分开定义,配置文件通常为 mybatis-config.xml,SQL 映射文件为单独的 XML 文件。

  8. MyBatis 3 特性:MyBatis 3 引入了新的映射器接口,支持自动映射、关联映射、混合配置等特性。

  9. 插件系统:MyBatis 允许开发者编写自定义插件,以拦截执行过程,实现日志记录、性能监控等功能。

  10. 集成 Spring:MyBatis 可以与 Spring 框架无缝集成,利用 Spring 的依赖注入和事务管理功能。

  11. 灵活性:MyBatis 提供了丰富的 API 和配置选项,可以根据项目需求进行灵活配置。

  12. 性能:MyBatis 的执行计划可以被优化,通过合理的配置和使用缓存机制,可以提高数据库操作的性能。

  13. 社区支持:MyBatis 拥有一个活跃的社区,提供了大量的文档、教程和第三方库支持。

  14. 可扩展性:MyBatis 的架构设计允许开发者通过继承和实现接口来扩展框架的功能。

  15. 跨数据库支持:MyBatis 不依赖于特定的数据库,可以与多种数据库系统集成。
    在这里插入图片描述

常见使用情景

  1. 复杂 SQL 操作

    • 当项目需要执行复杂的 SQL 语句,如多表联合查询、复杂的子查询等,MyBatis 提供的动态 SQL 功能可以很好地满足这些需求。
  2. 细粒度的数据库控制

    • 如果需要对数据库操作进行精细控制,例如精确的 SQL 调优、特殊的数据库函数调用等,MyBatis 允许开发者编写具体的 SQL 语句来实现。
  3. 遗留系统的集成

    • 在需要集成遗留系统或者使用现有的 SQL 存储过程时,MyBatis 可以很容易地与这些系统集成。
  4. 性能优化

    • 对于性能要求较高的应用程序,MyBatis 的缓存机制可以帮助减少数据库的访问次数,提高应用性能。
  5. 数据库迁移

    • 当进行数据库迁移或者需要支持多种数据库时,MyBatis 的灵活性可以帮助开发者更容易地适配不同的数据库。
  6. 数据模型映射

    • 对于需要将数据库表映射到 Java 对象的场景,MyBatis 的结果映射功能可以简化对象和数据库之间的转换。
  7. 报表生成

    • 在需要生成复杂报表的应用中,MyBatis 可以执行复杂的 SQL 查询并映射结果到 Java 对象,方便进行进一步的处理。
  8. RESTful API 开发

    • 在开发 RESTful 服务时,MyBatis 可以作为后端数据访问层,提供灵活的数据操作接口。
  9. 与 Spring 框架集成

    • 当使用 Spring 框架开发 Java 应用时,MyBatis 可以与 Spring 的事务管理、依赖注入等特性无缝集成。
  10. 单元测试

    • MyBatis 支持使用接口而不是具体类,这使得编写单元测试变得更加容易,因为可以轻松地模拟这些接口。
  11. 数据访问抽象

    • 在需要抽象数据访问层,以便在不同的数据源之间切换时,MyBatis 提供了一种简单的方式来实现数据访问逻辑的抽象。
  12. 多租户应用

    • 在多租户应用中,MyBatis 可以根据不同租户的需求定制 SQL 语句,实现租户特定的数据操作。
  13. 大数据量处理

    • 对于需要处理大量数据的应用,MyBatis 可以通过分批处理、游标等技术来优化性能。
  14. 定制化数据库操作

    • 当需要执行一些特殊的数据库操作,如自定义的数据库函数或存储过程时,MyBatis 提供了足够的灵活性来实现这些操作。
      在这里插入图片描述

常见优化策略

MyBatis 性能优化是一个多方面的过程,涉及到配置、代码编写、数据库操作等多个层面。

  1. 合理使用缓存

    • 利用 MyBatis 的一级缓存(SqlSession 缓存)和二级缓存(全局 Mapper 缓存)来减少对数据库的访问次数。确保缓存策略与应用场景相匹配。
  2. 减少不必要的查询

    • 避免在循环中执行查询操作,尽量使用批量查询来减少数据库访问次数。
  3. 使用批量操作

    • 对于插入、更新或删除操作,使用批量操作可以显著提高性能,减少数据库交互次数。
  4. 优化 SQL 语句

    • 确保 SQL 语句是经过优化的,避免使用 SELECT *,尽量指定需要的列,减少数据传输量。
  5. 使用分页查询

    • 当处理大量数据时,使用分页查询可以减少一次性加载的数据量,提高响应速度。
  6. 合理使用延迟加载

    • 对于关联查询,根据需要使用延迟加载(懒加载)和立即加载(急加载),避免不必要的数据加载。
  7. 减少反射和动态代理的使用

    • 反射和动态代理可能会影响性能,尽量减少它们的使用。
  8. 优化 MyBatis 配置

    • 根据应用需求调整 MyBatis 配置,例如调整 Executor 类型(SIMPLE、REUSE、BATCH)。
  9. 使用连接池

    • 使用数据库连接池来管理数据库连接,减少连接创建和销毁的开销。
  10. 优化事务管理

    • 确保事务的大小适当,避免过长的事务,减少锁定资源的时间。
  11. 使用 MyBatis 插件

    • 利用 MyBatis 插件机制,例如分页插件,可以简化分页查询的实现并提高性能。
  12. 监控和分析

    • 使用监控工具来分析 SQL 执行计划和性能瓶颈,根据分析结果进行优化。
  13. 避免大对象的序列化

    • 在使用 MyBatis 的缓存或进行数据库操作时,避免序列化大对象,这可能会影响性能。
  14. 合理配置数据库

    • 根据数据库的性能特点进行配置,例如调整缓冲区大小、连接数等。
  15. 减少上下文切换

    • 避免在 SqlSession 中进行大量的提交和关闭操作,这可能会导致上下文切换的开销。
  16. 使用内置的 MyBatis 函数

    • 利用 MyBatis 提供的内置函数,如 foreachifchoosewhenotherwise 等,来编写更高效的 SQL。
  17. 避免过度使用动态 SQL

    • 动态 SQL 虽然提供了灵活性,但过度使用可能会导致 SQL 语句复杂,难以优化。
  18. 合理使用 MyBatis 注解

    • 使用注解可以减少 XML 配置的冗余,但注解的使用也应适度,以避免过度复杂化。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • js根据指定的【时区、日期时间】获取对应时区的日期时间
  • 【HeadFirst 设计模式】单例模式的C++实现
  • CANoe软件中Trace窗口的筛选栏标题不显示(空白)的解决方法
  • 【MySQL核心】MySQL 数据恢复-ibd2sql
  • 2021年上半年网络工程师考试上午真题
  • git , nvm 快速下载安装包链接
  • 5.4 视图的创建与管理
  • windows调试ios记录
  • CH582M低功耗蓝牙温湿度传感器接入HASS
  • IDS 与 IPS:网络安全的两道防线
  • 数字孪生技术框架:从数据到决策的桥梁
  • Python进阶知识点--总结
  • Vue 生命周期详解含demo、面试常问问题案例
  • Java服务实现多数据源切换
  • HTTPS通讯全过程
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Android优雅地处理按钮重复点击
  • ES10 特性的完整指南
  • JS变量作用域
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Redis在Web项目中的应用与实践
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 工作手记之html2canvas使用概述
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 网页视频流m3u8/ts视频下载
  • 一天一个设计模式之JS实现——适配器模式
  • C# - 为值类型重定义相等性
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #define
  • (2)(2.10) LTM telemetry
  • (20050108)又读《平凡的世界》
  • (C++17) std算法之执行策略 execution
  • (Charles)如何抓取手机http的报文
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (补)B+树一些思想
  • (十七)Flink 容错机制
  • (转)3D模板阴影原理
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Windows2003安全设置/维护
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net IE10 _doPostBack 未定义
  • .Net Winform开发笔记(一)
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • @Controller和@RestController的区别?
  • @SentinelResource详解
  • @test注解_Spring 自定义注解你了解过吗?
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [<MySQL优化总结>]