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.rhkb.cn/news/9753.html

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

相关文章

DeepSeek-R1本地部署笔记

文章目录 效果概要下载 ollama终端下载模型【可选】浏览器插件 UIQ: 内存占用高&#xff0c;显存占用不高&#xff0c;正常吗 效果 我的配置如下 E5 2666 V3 AMD 590Gme 可以说是慢的一批了&#xff0c;内存和显卡都太垃圾了&#xff0c;回去用我的新设备再试试 概要 安装…

zyNo.19

哈希&#xff08;md5&#xff09;绕过问题 本质上是弱类型问题的延申 题型 登录的哈希验证 $a ! $b Md5($a) md5($b) 解决办法Md5绕过 var_dump ("0e123456" "0e4456789"); //true 0e545993274517709034328855841020//true 参考资料0e开头的哈希…

爬虫基础(一)HTTP协议 :请求与响应

前言 爬虫需要基础知识&#xff0c;HTTP协议只是个开始&#xff0c;除此之外还有很多&#xff0c;我们慢慢来记录。 今天的HTTP协议&#xff0c;会有助于我们更好的了解网络。 一、什么是HTTP协议 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff…

XCTF - IllIntentions wp

做 ctf 每天都是踩坑的一天 文章目录 题目概述我的做法frida hook 题目概述 这道题本身逻辑不复杂&#xff0c;有一个 MainActivity 和三个二级 Activity IsThisTheRealOne, ThisIsTheRealOne, DefinitelyNotThis。主 activity 是空白页面&#xff0c;注册了一个 Receiver Sen…

LNMP架构

一、概述 LNMP架构是一种常用于搭建动态网站的服务器架构组合&#xff0c;其名称由以下四个组件的首字母缩写组成&#xff1a; Linux&#xff1a;操作系统。Linux具有开源、稳定、安全、高性能等特点&#xff0c;是服务器领域广泛使用的操作系统。它为其他组件提供了运行环境和…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心&#xff1a;这是一个Unity粒子系统自带的一种功能&#xff0c;可将粒子生成控制在一个Texture图片网格范围内&#xff0c;并且粒子颜色会自动采样图片的像素点颜色&#xff0c;之后则是粒子编辑出消散效果。 Particle System1物体&#xff08;爆发式随机速度扩散10000个粒…

芯片AI深度实战:基础篇之langchain

基于ollama, langchain,可以构建一个自己的知识库&#xff0c;比如这个 Build Your Own RAG App: A Step-by-Step Guide to Setup LLM locally using Ollama, Python, and ChromaDB | HackerNoon 这是因为&#xff1a; 以上范例就实现了这样一个流程&#xff1a; 系列文章&…

mybatis(134/134)完结

一级缓存&#xff08;默认情况下开启&#xff09;同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 &#xff1a;同一个sqlsessionfactory&#xff0c;sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件&#xff1a;方便进行分页&#x…

C++,STL 简介:历史、组成、优势

文章目录 引言一、STL 的历史STL 的核心组成三、STL 的核心优势四、结语进一步学习资源&#xff1a; 引言 C 是一门强大且灵活的编程语言&#xff0c;但其真正的魅力之一在于其标准库——尤其是标准模板库&#xff08;Standard Template Library, STL&#xff09;。STL 提供了…

不背单词快捷键(不背单词键盘快捷键)

文章目录 不背单词快捷键 不背单词快捷键 ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ    …

EasyExcel写入和读取多个sheet

最近在工作中&#xff0c;作者频频接触到Excel处理&#xff0c;因此也对EasyExcel进行了一定的研究和学习&#xff0c;也曾困扰过如何处理多个sheet&#xff0c;因此此处分享给大家&#xff0c;希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…

JavaScript函数中this的指向

总结&#xff1a;谁调用我&#xff0c;我就指向谁&#xff08;es6箭头函数不算&#xff09; 一、ES6之前 每一个函数内部都有一个关键字是 this &#xff0c;可以直接使用 重点&#xff1a; 函数内部的 this 只和函数的调用方式有关系&#xff0c;和函数的定义方式没有关系 …

【C语言】内存函数

一、前言 在C语言中有着常见的内存函数&#xff0c;他们可以对内存进行操作&#xff0c;即可以修改内存的内容等&#xff0c;下面我们来简略地学习一下 二、memcpy(内存复制) cpy是复制的意思&#xff0c;顾名思义&#xff0c;就是将一块指定大小的内存的字节逐一赋值到新的内…

fscan全家桶更新:fscan免杀版,可过360、火绒、微步云沙箱,其他的自行测试

前言 fscan全家桶更新&#xff1a;fscan免杀版&#xff0c;可过360、火绒、微步云沙箱&#xff0c;其他的自行测试 其他版本 FscanPlus&#xff1a;fscan的plus版本 fs&#xff1a;有免杀效果 fscan低版本&#xff1a;自己重新编译的适合低版本系统的fscan FscanParser&a…

中间件安全

一.中间件概述 1.中间件定义 介绍&#xff1a;中间件&#xff08;Middleware&#xff09;作为一种软件组件&#xff0c;在不同系统、应用程序或服务间扮演着数据与消息传递的关键角色。它常处于应用程序和操作系统之间&#xff0c;就像一座桥梁&#xff0c;负责不同应用程序间…

微服务入门(go)

微服务入门&#xff08;go&#xff09; 和单体服务对比&#xff1a;里面的服务仅仅用于某个特定的业务 一、领域驱动设计&#xff08;DDD&#xff09; 基本概念 领域和子域 领域&#xff1a;有范围的界限&#xff08;边界&#xff09; 子域&#xff1a;划分的小范围 核心域…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏&#xff1a; 游戏结束&#xff1a; 二、游戏如何操作 通过监听键盘的操作&#xff0c;进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动&#xff0c;如果有两块一样的方块&#xff0c;就进行合并&#xff0c;并且在键盘每操作…

ASP.NET代码审计 SQL注入篇(简单记录)

sql注入&#xff0c;全局搜索 Request QueryString ToString() select select * aspx是设计页面&#xff0c;而aspx.cs是类页面&#xff0c;也就是说设计页面用到的类信息在这个页面里面&#xff0c;其实就是把设计和实现分离开来。 源码 using System; using System.Collect…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包&#xff0c;它应…

C++中的类与对象(中)

在上一节中&#xff0c;我们初步了解了一下&#xff0c;C中的类&#xff0c;这一概念&#xff0c;这一节让我们进一步深入了解一下。 文章目录 目录 前言 一、类中的默认成员函数 1.1 构造函数 构造函数的特点&#xff1a; 1.2 析构函数 析构函数的特点&#xff1a; 1.3 …