MyBatis 框架:简化 Java 数据持久化的利器


Java学习资料

Java学习资料

Java学习资料


一、引言

在 Java 企业级应用开发中,数据持久化是一个至关重要的环节,它涉及到将应用程序中的数据保存到数据库,以及从数据库中读取数据供应用程序使用。传统的 JDBC 编程虽然可以实现数据持久化,但存在代码冗余、可维护性差等问题。MyBatis 框架的出现,为解决这些问题提供了一个优秀的方案,它是一个基于 Java 的持久层框架,能够帮助开发者更高效、更便捷地实现数据持久化操作。

二、MyBatis 框架概述

2.1 核心概念

MyBatis 是一个半自动的 ORM(对象关系映射)框架。与全自动的 ORM 框架(如 Hibernate)不同,MyBatis 允许开发者自己编写 SQL 语句,在 SQL 映射和对象映射方面提供了更高的灵活性。它通过 XML 配置文件或注解的方式,将 Java 对象与数据库表进行映射,将 SQL 语句与 Java 方法进行绑定,使得开发者可以通过调用 Java 方法来执行数据库操作。

2.2 框架优势

灵活的 SQL 控制:开发者可以自由编写 SQL 语句,能够根据具体的业务需求进行优化,充分发挥数据库的性能。

简单易学:MyBatis 的配置和使用相对简单,对于有一定 JDBC 基础的开发者来说,很容易上手。

与 Spring 集成良好:可以与 Spring 框架无缝集成,借助 Spring 的依赖注入、事务管理等功能,进一步提高开发效率。

三、MyBatis 框架的基本架构

3.1 主要组件

SqlSessionFactory:它是 MyBatis 的核心组件之一,负责创建 SqlSession 对象。通常通过读取 MyBatis 的配置文件(如 mybatis-config.xml)来初始化 SqlSessionFactory。

SqlSession:代表与数据库的一次会话,类似于 JDBC 中的 Connection。通过 SqlSession 可以执行 SQL 语句,进行数据库的增删改查操作。

Mapper 接口和 Mapper XML 文件(或注解):Mapper 接口定义了一系列的方法,每个方法对应一个 SQL 操作。Mapper XML 文件(或使用注解)中编写具体的 SQL 语句,并将其与 Mapper 接口的方法进行绑定。

3.2 工作流程

读取 MyBatis 的配置文件,创建 SqlSessionFactory 对象。

通过 SqlSessionFactory 创建 SqlSession 对象。

获取 Mapper 接口的代理对象。

调用 Mapper 接口的方法,执行相应的 SQL 语句。

处理 SQL 执行结果。

关闭 SqlSession。

四、MyBatis 框架的配置与使用

4.1 环境搭建

首先,需要在项目中引入 MyBatis 的依赖。如果使用 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version>
</dependency>

4.2 配置 MyBatis

创建 mybatis-config.xml 配置文件,配置数据库连接信息、映射文件位置等:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<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/testdb"/><property name="username" value="root"/><property name="password" value="password"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>

4.3 创建实体类

创建与数据库表对应的 Java 实体类,例如 User 类:

public class User {private int id;private String username;private String password;// 构造方法、getter 和 setter 方法public User() {}public User(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

4.4 创建 Mapper 接口和 XML 文件
创建 UserMapper 接口:

import java.util.List;public interface UserMapper {List<User> getAllUsers();User getUserById(int id);void insertUser(User user);void updateUser(User user);void deleteUser(int id);
}

创建 UserMapper.xml 文件,编写具体的 SQL 语句:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><select id="getAllUsers" resultType="com.example.entity.User">SELECT * FROM users</select><select id="getUserById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM users WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO users (username, password) VALUES (#{username}, #{password})</insert><update id="updateUser" parameterType="com.example.entity.User">UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete>
</mapper>

4.5 使用 MyBatis 进行数据库操作

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.util.List;public class MyBatisExample {public static void main(String[] args) throws Exception {// 读取配置文件String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建 SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 创建 SqlSessiontry (SqlSession session = sqlSessionFactory.openSession()) {// 获取 Mapper 接口的代理对象UserMapper userMapper = session.getMapper(UserMapper.class);// 查询所有用户List<User> users = userMapper.getAllUsers();for (User user : users) {System.out.println(user.getUsername());}// 插入用户User newUser = new User(0, "testuser", "testpassword");userMapper.insertUser(newUser);session.commit();}}
}

五、MyBatis 的高级特性

5.1 动态 SQL

MyBatis 提供了强大的动态 SQL 功能,允许开发者根据不同的条件动态生成 SQL 语句。常用的动态 SQL 标签有 、、、、、、 等。例如:

<select id="getUsersByCondition" resultType="com.example.entity.User">SELECT * FROM users<where><if test="username != null and username != ''">AND username LIKE CONCAT('%', #{username}, '%')</if><if test="password != null and password != ''">AND password = #{password}</if></where>
</select>

5.2 缓存机制

MyBatis 支持一级缓存和二级缓存。一级缓存是基于 SqlSession 的缓存,同一个 SqlSession 中执行相同的 SQL 语句时,会从缓存中获取结果,提高查询效率。二级缓存是基于 SqlSessionFactory 的缓存,多个 SqlSession 可以共享缓存数据。可以通过在 Mapper XML 文件中配置 标签来开启二级缓存。

六、MyBatis 与 Spring 框架的集成

MyBatis 与 Spring 框架集成后,可以借助 Spring 的依赖注入、事务管理等功能,进一步提高开发效率。集成步骤如下:
引入 MyBatis - Spring 依赖:

<dependency><groupId>org.mybatis.spring</groupId><artifactId>mybatis-spring</artifactId><version>2.0.7</version>
</dependency>

配置 Spring 和 MyBatis:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置数据源 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/testdb"/><property name="username" value="root"/><property name="password" value="password"/></bean><!-- 配置 SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><!-- 配置 Mapper 扫描 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mapper"/></bean>
</beans>

在 Spring 管理的类中使用 Mapper 接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public List<User> getAllUsers() {return userMapper.getAllUsers();}
}

七、总结

MyBatis 框架以其灵活的 SQL 控制、简单易学的特点,成为 Java 数据持久化开发的热门选择。通过合理运用 MyBatis 的基本架构、配置方法、高级特性以及与 Spring 框架的集成,开发者能够高效地实现数据库操作,提高代码的可维护性和可扩展性。无论是小型项目还是大型企业级应用,MyBatis 都能在数据持久化方面发挥重要作用,帮助开发者构建出稳定、高效的 Java 应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOI1995] 石子合并

[NOI1995] 石子合并 题目描述 在一个圆形操场的四周摆放 N N N 堆石子&#xff0c;现要将石子有次序地合并成一堆&#xff0c;规定每次只能选相邻的 2 2 2 堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出一个算法,计算出将 …

未来无线技术的发展方向

未来无线技术的发展趋势呈现出多样化、融合化的特点&#xff0c;涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升&#xff1a;Wi-Fi 技术迭代加快&#xff0c;如 Wi-Fi7 理论峰值速率达 46Gbps&#…

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP&#xff1a;10.10.16.21 靶机IP&#xff1a;10.10.10.161 靶机Domain&#xff1a;forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

芯片AI深度实战:实战篇之vim chat

利用vim-ollama这个vim插件&#xff0c;可以在vim内和本地大模型聊天。 系列文章&#xff1a; 芯片AI深度实战&#xff1a;基础篇之Ollama-CSDN博客 芯片AI深度实战&#xff1a;基础篇之langchain-CSDN博客 芯片AI深度实战&#xff1a;实战篇之vim chat-CSDN博客 芯片AI深度…

JavaScript - Web APIs(下)

日期对象 目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 学习路径&#xff1a; 实例化 日期对象方法 时间戳 实例化 目标&#xff1a;能够实例化日期对象 在代码中发…

selenium自动化测试框架——面试题整理

目录 1. 什么是 Selenium&#xff1f;它的工作原理是什么&#xff1f; 2. Selenium 主要组件 3. 常见 WebDriver 驱动 4. Selenium 如何驱动浏览器&#xff1f; 5. WebDriver 协议是什么&#xff1f; 6. Page Object 模式与 Page Factory 7. 如何判断元素是否可见&#x…

【安全测试】测开方向学习遇到的问题记录

【问题一】springboot如何访问静态资源文件 springboot启动根路径位置 F:\untitled05\demo4\src\main\resources\static 例如图片位置存放在F:\untitled05\demo4\src\main\resources\static即可 配置文件配置 spring.web.resources.static-locationsfile:/F:/untitled05/de…

Unity|小游戏复刻|见缝插针2(C#)

控制针的运动 新建一个Pin脚本 将Pin脚本拖到针Pin的下面 保存代码 using UnityEngine;public class Pin : MonoBehaviour {public float speed 5;private bool isFly false;private bool isReach false;private Transform startPosition;// Start is called once bef…

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

DeepSeek大模型技术解析:从架构到应用的全面探索

一、引言 在人工智能领域&#xff0c;大模型的发展日新月异&#xff0c;其中DeepSeek大模型凭借其卓越的性能和广泛的应用场景&#xff0c;迅速成为业界的焦点。本文旨在深入剖析DeepSeek大模型的技术细节&#xff0c;从架构到应用进行全面探索&#xff0c;以期为读者提供一个…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习&#xff08;DL&#xff09;是现代人工智能&#xff08;AI&#xff09;的核心之一&#xff0c;但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用&#xff0c;深度学习经历了几乎一个世纪的不断探索与发展。今天&#xff0c;我们一起回顾深度学习的历史…

嵌入式Linux:如何监视子进程

目录 1、wait()函数 2、waitpid()函数 3、SIGCHLD信号 在嵌入式Linux系统中&#xff0c;父进程通常需要创建子进程来执行特定任务&#xff0c;例如处理网络请求、执行计算任务等。监视子进程的状态不仅可以确保资源的合理利用&#xff0c;还能防止僵尸进程的产生&#xff0c…

「 机器人 」扑翼飞行器控制策略浅谈

1. 研究背景 • 自然界中的蜂鸟以极高的机动能力著称,能够在短至0.2秒内完成如急转弯、快速加速、倒飞、躲避威胁等极限机动。这种表现对微型飞行器(Flapping Wing Micro Air Vehicles, FWMAVs)具有重要的仿生启示。 • 目前的微型飞行器距离自然生物的飞行能力仍有相当差距…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格&#xff0c;比如在mysql中%0a是换行&#xff0c;可以代替空格 这个方法也可以部分绕过最新版本的…

c++ map/multimap容器 学习笔记

1 map的基本概念 简介&#xff1a; map中所有的元素都是pair pair中第一个元素是key&#xff08;键&#xff09;&#xff0c;第二个元素是value&#xff08;值&#xff09; 所有元素都会根据元素的键值自动排序。本质&#xff1a; map/multimap 属于关联式容器&#xff0c;底…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

PyTorch 与 Python 版本对应关系

PyTorch 支持多个 Python 版本&#xff0c;但不同版本的 PyTorch 可能对 Python 版本有不同的要求。一般来说&#xff1a; PyTorch 与 Python 版本对应关系 PyTorch 版本支持的 Python 版本2.2.x3.8 - 3.122.1.x3.8 - 3.112.0.x3.8 - 3.101.13.x3.7 - 3.101.12.x3.7 - 3.101.…

JavaScript系列(47)--音频处理系统详解

JavaScript音频处理系统详解 &#x1f3b5; 今天&#xff0c;让我们深入探讨JavaScript的音频处理系统。Web Audio API为我们提供了强大的音频处理和合成能力&#xff0c;让我们能够在浏览器中实现复杂的音频应用。 音频系统基础概念 &#x1f31f; &#x1f4a1; 小知识&…

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …