MyBatis 基本概念

ops/2024/9/24 16:44:35/

MyBatis 基本概念详解

MyBatis 是一个优秀的持久层框架,它支持定制 SQL、存储过程以及高级映射,用于将 Java 对象与数据库中的记录进行映射。作为 ORM(对象关系映射)框架,MyBatis 的主要优势在于灵活性高,开发者可以手写 SQL,精确控制 SQL 语句执行的方式,并灵活处理复杂的数据库查询。

MyBatis 在 Java 社区中应用广泛,特别是在企业级应用开发中,因为它提供了对复杂 SQL 查询的优良支持,同时减少了与 JDBC 的直接交互,使代码更加简洁易维护。

一、MyBatis 的基本概念

1. ORM (Object Relational Mapping)

MyBatis 是一个半自动的 ORM 框架,它将数据库中的表与 Java 对象进行映射,但与全自动的 ORM 框架(如 Hibernate)不同,MyBatis 强调 SQL 的灵活性,开发者需要手写 SQL 语句。通过这种方式,MyBatis 既保留了传统 JDBC 的灵活性,又减少了 JDBC 的冗余代码。

2. SqlSessionFactory

SqlSessionFactory 是 MyBatis 中的核心组件之一,负责创建 SqlSession 对象。SqlSessionFactory 是一个工厂类,通过读取 MyBatis 配置文件,创建并管理数据库连接。通常情况下,一个应用程序只需要一个 SqlSessionFactory 实例,这个实例可以在应用启动时通过 XML 或 Java 配置加载。

// 使用 MyBatis XML 配置创建 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3. SqlSession

SqlSession 是用于执行数据库操作的对象,它负责执行 SQL 语句、获取映射器实例、提交事务和关闭连接等操作。SqlSession 可以执行 selectinsertupdatedelete 等操作,并提供了事务的提交与回滚功能。

try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUser(1);
}

每次使用 SqlSession 时,应该在操作完成后关闭它,以释放数据库连接资源。

4. Mapper(映射器)

Mapper 是 MyBatis 中的一个重要概念,负责将 Java 接口与 SQL 语句进行关联。Mapper 接口中的方法通常对应数据库中的 SQL 操作,如查询、插入、更新、删除等。MyBatis 会根据接口方法的注解或 XML 配置文件,自动将 SQL 语句映射到对应的方法上。

public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUser(int id);
}

通过使用 Mapper,开发者无需编写过多的 JDBC 代码,只需要定义接口和 SQL 语句,MyBatis 会自动完成映射和数据库交互。

5. Configuration(配置文件)

MyBatis 的配置文件是 MyBatis 框架运行时的核心配置文件,主要用于定义数据库连接、环境配置、映射器注册等信息。配置文件通常命名为 mybatis-config.xml,包含以下关键部分:

  • 环境配置(environments):用于定义多个数据库环境(如开发环境、生产环境等)。
  • 映射器(mappers):用于注册 Mapper 接口或 XML 映射文件。
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mappers/UserMapper.xml"/></mappers>
</configuration>

二、MyBatis 的工作原理

MyBatis 的工作流程主要围绕 SQL 语句的执行和对象的映射展开。其核心流程如下:

  1. 加载配置文件:MyBatis 首先通过 SqlSessionFactoryBuilder 解析 mybatis-config.xml 配置文件,并构建 SqlSessionFactory
  2. 获取 SqlSession:通过 SqlSessionFactory 获取 SqlSession 对象,用于执行数据库操作。
  3. 执行 SQL 语句:MyBatis 会根据 Mapper 中的定义,调用对应的 SQL 语句,并通过 ResultMap@Select 注解将查询结果映射为 Java 对象。
  4. 提交或回滚事务:对于非查询操作,如 insertupdatedelete,MyBatis 需要手动提交事务。
  5. 关闭 SqlSession:操作完成后,必须关闭 SqlSession 以释放数据库连接资源。

三、MyBatis 的核心功能

1. 动态 SQL

MyBatis 支持动态 SQL,这意味着开发者可以根据运行时条件生成不同的 SQL 语句。动态 SQL 通常使用 MyBatis 提供的 ifchoosewhereset 等标签来实现。

<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="username != null">AND username = #{username}</if><if test="age != null">AND age = #{age}</if></where>
</select>

动态 SQL 极大地增强了 MyBatis 的灵活性,使得开发者可以根据不同的条件生成复杂的 SQL 查询。

2. 高级映射

MyBatis 提供了丰富的映射功能,支持将复杂的数据库表结构映射为 Java 对象。常见的映射关系包括一对一、一对多和多对多等。

(1) 一对一映射

一对一映射通常用于将数据库中的一条记录关联到一个 Java 对象的属性。例如,用户和地址是一对一的关系。

<resultMap id="UserResult" type="User"><id column="id" property="id"/><result column="username" property="username"/><association property="address" column="address_id" javaType="Address" select="selectAddress"/>
</resultMap>
(2) 一对多映射

一对多映射通常用于将一条记录关联到多个 Java 对象的集合。例如,一个用户可以拥有多个订单。

<resultMap id="UserResult" type="User"><id column="id" property="id"/><result column="username" property="username"/><collection property="orders" ofType="Order" select="selectOrders"/>
</resultMap>
3. 缓存机制

MyBatis 提供了一级缓存和二级缓存机制,用于提升数据库查询的性能。

  • 一级缓存:一级缓存是默认开启的,作用域是 SqlSession 级别,意味着在同一个 SqlSession 中执行相同的查询语句时,MyBatis 会从缓存中读取结果,而不会重复查询数据库
  • 二级缓存:二级缓存是跨 SqlSession 的缓存,作用域为 Mapper,需要手动开启,并且缓存的结果可以在不同 SqlSession 之间共享。
<cache/>
4. 分页查询

MyBatis 不直接提供分页功能,但可以通过传递分页参数(如 offsetlimit)来实现分页查询。

<select id="findUsersByPage" resultType="User">SELECT * FROM users LIMIT #{limit} OFFSET #{offset}
</select>

同时,也可以结合分页插件(如 PageHelper)来简化分页处理。

四、MyBatis 与 Spring 的集成

MyBatis 可以与 Spring 框架无缝集成,借助 Spring 的依赖注入和事务管理,可以进一步简化 MyBatis 的配置和使用。

在 Spring 中集成 MyBatis 通常使用 MyBatis-Spring 模块。开发者只需要配置 SqlSessionFactory 和 Mapper,Spring 会自动管理 SqlSession 的生命周期和事务。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mappers/*.xml"/>
</bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mappers"/>
</bean>

通过这样的集成方式,开发者可以在 Spring 中直接注入 Mapper,并且享受 Spring 的事务管理功能。

五、MyBatis 的优缺点

优点:
  1. 灵活性高:MyBatis 允许开发者直接编写 SQL,可以处理

复杂的查询和性能优化。
2. 轻量级:相比全自动 ORM 框架(如 Hibernate),MyBatis 更加轻量,适用于大型项目和对 SQL 控制要求较高的场景。
3. 支持动态 SQL:MyBatis 的动态 SQL 功能可以根据运行时条件生成不同的 SQL 语句,提供了极大的灵活性。
4. 良好的扩展性:MyBatis 提供了丰富的插件机制,可以方便地扩展其功能,如分页插件、性能监控插件等。

缺点:
  1. 对 SQL 依赖较重:开发者需要手动编写 SQL,复杂业务逻辑的 SQL 维护成本较高。
  2. 全局性能优化不足:由于 MyBatis 是手写 SQL,无法像全自动 ORM 框架那样全局性地优化数据库访问性能。

六、总结

MyBatis 作为一个灵活、高效的 ORM 框架,通过手写 SQL 提供了对复杂数据库操作的精细控制,并且具备优秀的动态 SQL 和映射功能。虽然 MyBatis 对 SQL 有一定的依赖,但在性能优化和灵活性方面,其表现尤为突出,尤其适合对 SQL 有严格控制和复杂查询需求的企业级项目。


http://www.ppmy.cn/ops/115362.html

相关文章

vue组件之间的数据共享

一、组件之间的关系 1.父子关系 2.兄弟关系 3.后代关系 二、父子组件之间的数据共享 1.父-->子共享数据 父组件通过v-bind属性绑定向子组件共享数据&#xff0c;子组件需要使用props接受数据。 <template><p>父组件</p><Son :msg"msg"…

可编辑PPT | 能源企业数字化框架、数字化运营及数字化平台建设方案

项目背景及需求理解 首先提出了全球能源互联网的概念&#xff0c;强调了清洁能源和电能替代的重要性&#xff0c;并介绍了德国工业4.0战略以及泛在电力物联网的创新。文档探讨了信息化与工业化的深度融合&#xff0c;以及云计算、大数据、物联网和移动应用等新技术在能源行业的…

php+mysql安装

1.卸载mysql 没启动不停止 2.下载 3.解压 4.点击安装 5.出现成功 端口占用修改 修改端口89或者87 可视化扩展 修改后重启 开启扩展

微服务保护详细笔记(一):雪崩问题--Sentinel

目录 1.雪崩问题 1.1.雪崩问题产生原因&#xff1a; 1.2.雪崩问题解决方案 1.2.1.请求限流 1.1.2.线程隔离 1.1.3.服务熔断 1.3.微服务保护技术对比 1.4.Sentinel 1.4.1.介绍与安装 1.4.2.微服务整合 1.雪崩问题 1.1.雪崩问题产生原因&#xff1a; 比如查询购物车的…

【OpenCV】场景中人的识别与前端计数

1.OpenCV代码设计讲解 突发奇想&#xff0c;搞个摄像头&#xff0c;识别一下实验室里面有几个人&#xff0c;计数一下&#xff08;最终代码是累加计数&#xff0c;没有优化&#xff09;&#xff0c;拿OpenCV来玩一玩 首先&#xff0c;还是优先启动电脑摄像头&#xff0c;本项…

Safari-常用快捷键(IPadOS版本)

cmd1 切换数字对应的的标签页cmdL 跳转到地址栏cmdf 页内搜索cmdr 重新载入当前页(刷新)cmdd 当前页加入书签cmdctrl1/2/3 显示书签/阅读列表/浏览记录cmdt 新增标签页cmdw 关闭当前页(感谢csdn自动保存功能)cmd“/-” 放大/缩小页面cmdoptb 左侧打开书签并进入编辑模式cmdshif…

网安新声 | 黎巴嫩BP机爆炸事件带来的安全新挑战与反思

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 9月17日&#xff0c;黎巴嫩境内发…

责任链模式实现规则校验

1、项目中责任链模式实战 我们使用责任链模式实现对订单中参数的校验&#xff0c;首先校验订单id是否为空&#xff0c;然后校验下单人是否为空&#xff0c;最后检验收获地址是否为空。业务的流程图如下所示&#xff1a; 针对上述的业务&#xff0c;我们使用责任链的模式来实现…