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

快速上手mybatis教程

基础知识

MyBatis 是一款优秀的持久层框架,其核心组件主要包括以下部分:

SqlSession

  • 作用:SqlSession 是 MyBatis 的核心接口,负责与数据库进行通信,执行 SQL 语句,并返回查询结果。它是 MyBatis 的一次会话,可以执行多个 SQL 语句。

  • 功能:提供了执行 SQL 语句、获取映射器(Mapper)、管理事务等功能。通过 SqlSession,可以执行数据库的增删改查操作,并获取操作结果。

Executor

  • 作用:Executor 是 MyBatis 用来执行 SQL 语句的接口,是 MyBatis 框架中所有数据库操作的核心。

  • 类型:MyBatis 提供了几种不同类型的 Executor 实现,如 SimpleExecutor、ReuseExecutor 和 BatchExecutor,分别适用于不同的应用场景。

Mapper接口

  • 作用:Mapper 接口是 MyBatis 实现 ORM 映射的核心机制。用户可以通过定义接口来描述数据库表结构,并使用注解或 XML 配置文件指定 SQL 语句。

  • 功能:当调用 Mapper 接口的方法时,MyBatis 会利用动态代理技术拦截这些调用,并根据方法签名生成对应的 statementId。随后,MyBatis 会查找预编译好的 SQL 语句并执行相应的数据库操作。

Configuration

  • 作用:Configuration 类是 MyBatis 所有配置信息的封装。它包含了 MyBatis 运行时所需的所有配置,如数据库连接信息(DataSource)、事务管理器(TransactionManager)、类型处理器(TypeHandlers)、映射器(Mapper)的注册信息等。

  • 功能:提供了框架的全局配置信息,使得 MyBatis 能够根据这些配置完成初始化和功能扩展。

MappedStatement

  • 作用:MappedStatement 是 MyBatis 中最重要的一个类,它封装了 SQL 语句的所有信息,包括 SQL 语句本身、输入参数的类型、返回结果的类型、是否使用缓存等。

  • 功能:在 MyBatis 中,每一个 <select><insert><update><delete> 标签都会被解析成一个 MappedStatement 对象,并存储在 Configuration 对象中。

ParameterHandler

  • 作用:ParameterHandler 是 MyBatis 中用于处理 SQL 语句参数的接口。它负责将用户传递的参数值设置到 SQL 语句的占位符中。

  • 功能:通过与 TypeHandler 的协作,将 Java 类型的参数转换为 JDBC 类型的参数,并设置到 PreparedStatement 的相应位置。

TypeHandler

  • 作用:TypeHandler 是 MyBatis 中用于处理 Java 类型和 JDBC 类型之间转换的接口。

  • 功能:定义了如何将 Java 类型转换为 JDBC 类型(用于设置 SQL 语句的参数),以及如何将 JDBC 类型转换为 Java 类型(用于从结果集中获取数据)。

ResultSetHandler

  • 作用:ResultSetHandler 是 MyBatis 中用于处理 SQL 查询结果集的接口。它负责将 JDBC 的 ResultSet 转换为 Java 对象或集合。

  • 功能:通过与 TypeHandler 的协作,从 ResultSet 中读取数据,并将其转换为 Java 类型的值。然后,它根据 Mapper 接口方法的返回类型,将这些值组装成相应的 Java 对象或集合。

StatementHandler

  • 作用:StatementHandler 是 MyBatis 中用于处理 SQL 语句的执行的接口。它封装了 JDBC 的 Statement 或 PreparedStatement,并提供了执行 SQL 语句的方法。

  • 功能:负责配置 SQL 语句的参数、执行 SQL 语句,并处理执行过程中可能出现的异常。

如何快速上手 MyBatis

  1. 搭建开发环境

    • 引入 MyBatis 依赖:在项目的 pom.xml 文件中添加 MyBatis 的 Maven 依赖。

    • 配置数据库连接:创建 mybatis-config.xml 配置文件,配置数据库连接信息、事务管理器、类型处理器等。

  2. 创建 SqlSessionFactory

    • 使用 SqlSessionFactoryBuilder 创建 SqlSessionFactory 实例,加载 mybatis-config.xml 配置文件。

  3. 获取 SqlSession

    • 通过 SqlSessionFactory.openSession() 方法获取 SqlSession 实例,用于执行数据库操作。

  4. 定义 Mapper 接口

    • 创建 Mapper 接口,定义数据库操作的方法,如 selectByIdinsert 等。

  5. 编写 Mapper XML 文件

    • 创建与 Mapper 接口对应的 XML 文件,编写 SQL 语句,如 <select><insert> 等标签。

  6. 执行数据库操作

    • 通过 SqlSession 获取 Mapper 接口的实例,调用其方法执行数据库操作。

  7. 关闭资源

    • 操作完成后,调用 SqlSession.close() 方法关闭会话,释放资源。


参考案例

1. 数据库准备

首先,创建一个简单的数据库表 Student,包含以下字段:

CREATE TABLE Student (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,age INT NOT NULL
);

2. MyBatis 核心组件用途示例

结合一个简单的 Java 应用,展示 MyBatis 的核心组件是如何协同工作的。

核心组件
  1. SqlSessionFactory:负责创建 SqlSession

  2. SqlSession:负责执行 SQL、提交或回滚事务。

  3. Mapper接口:定义数据库操作的接口。

  4. Mapper XML文件:编写 SQL 语句。

  5. Configuration:MyBatis 的全局配置文件。

  6. MappedStatement:存储 SQL 信息。

3. 代码案例

3.1 Maven 依赖

确保在 pom.xml 中添加 MyBatis 和 MySQL 的依赖:

<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>
</dependencies>
3.2 数据库配置文件(db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
username=root
password=123456
3.3 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="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/StudentMapper.xml"/></mappers>
</configuration>
3.4 Student 实体类
import lombok.Data;@Data
public class Student {private Integer id;private String name;private Integer age;
}
3.5 StudentMapper 接口
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface StudentMapper {List<Student> getAllStudents();void insertStudent(Student student);Student getStudentById(Integer id);void updateStudent(Student student);void deleteStudentById(Integer id);
}
3.6 StudentMapper.xml 文件
<?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.StudentMapper"><select id="getAllStudents" resultType="com.example.model.Student">SELECT * FROM Student</select><insert id="insertStudent" parameterType="com.example.model.Student">INSERT INTO Student (name, age) VALUES (#{name}, #{age})</insert><select id="getStudentById" parameterType="int" resultType="com.example.model.Student">SELECT * FROM Student WHERE id = #{id}</select><update id="updateStudent" parameterType="com.example.model.Student">UPDATE Student SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteStudentById" parameterType="int">DELETE FROM Student WHERE id = #{id}</delete>
</mapper>
3.7 工具类(获取 SqlSession)
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.IOException;
import java.io.InputStream;public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}
3.8 测试代码
import com.example.mapper.StudentMapper;
import com.example.model.Student;public class Main {public static void main(String[] args) {// 获取 SqlSession 实例SqlSession sqlSession = MyBatisUtils.getSqlSession();try {// 获取 Mapper 接口StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);// 插入一条数据Student student = new Student();student.setName("张三");student.setAge(20);studentMapper.insertStudent(student);sqlSession.commit(); // 提交事务// 查询所有学生List<Student> students = studentMapper.getAllStudents();for (Student s : students) {System.out.println(s);}// 查询单个学生Student studentById = studentMapper.getStudentById(1);System.out.println(studentById);// 更新学生信息studentById.setName("李四");studentById.setAge(22);studentMapper.updateStudent(studentById);sqlSession.commit();// 删除学生studentMapper.deleteStudentById(1);sqlSession.commit();} finally {// 关闭 SqlSessionsqlSession.close();}}
}

4. 核心组件总结

  1. SqlSessionFactory:通过配置文件加载全局配置信息。

  2. SqlSession:负责执行 SQL、提交或回滚事务。

  3. Mapper接口:抽象了数据库操作。

  4. Mapper XML:实际的 SQL 语句。

  5. Configuration:MyBatis 的全局配置文件。

  6. MappedStatement:存储 SQL 信息(如 getAllStudents)。

相关文章:

快速上手mybatis教程

基础知识 MyBatis 是一款优秀的持久层框架&#xff0c;其核心组件主要包括以下部分&#xff1a; SqlSession 作用&#xff1a;SqlSession 是 MyBatis 的核心接口&#xff0c;负责与数据库进行通信&#xff0c;执行 SQL 语句&#xff0c;并返回查询结果。它是 MyBatis 的一次会…...

本地部署DeepSeek-R1保姆级教程

近期&#xff0c;我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行&#xff0c;提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1&#xff0c;可以参考以下完整的教程&#xff0c;涵盖Mac 版本…...

blender 相机参数

目录 设置相机参数&#xff1a; 3. 设置相机参数示例 4. 相机透视与正交 5. 额外的高级设置 设置相机参数&#xff1a; 设置渲染器&#xff1a; 外参转换函数 转换测试代码&#xff1a; 获取blender渲染外参&#xff1a; 设置相机参数&#xff1a; 3. 设置相机参数示…...

在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用

上下拉电阻作用 在通用输入的时候&#xff0c;也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态&#xff0c;这样才能检测到不同电平状态。 如何保持电平状态&#xff1f; 1. 可以通过芯片内部的上下拉电阻&#xff0c;由于是弱上下拉一般不用 2. 硬件外界一个…...

Maven工程核心概念GAVP详解:从命名规范到项目协作的基石

Maven工程核心概念GAVP详解&#xff1a;从命名规范到项目协作的基石 一、GAVP是什么&#xff1f; 在Maven工程中&#xff0c;GAVP是四个核心属性的缩写&#xff1a;GroupId、ArtifactId、Version、Packaging。这组属性为项目在Maven仓库中提供了唯一标识&#xff0c;类似于“项…...

如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析

如何利用DeepSeek开源模型打造医疗领域专属AI助手&#xff1f;从微调到部署全流程解析 医疗人工智能正迎来爆发式增长&#xff0c;但在实际应用中&#xff0c;通用大模型往往存在医学知识不精准、诊断逻辑不严谨等问题。本文将手把手带您实现医疗垂直领域大模型的定制化训练&a…...

Redis|前言

文章目录 什么是 Redis&#xff1f;Redis 主流功能与应用 什么是 Redis&#xff1f; Redis&#xff0c;Remote Dictionary Server&#xff08;远程字典服务器&#xff09;。Redis 是完全开源的&#xff0c;使用 ANSIC 语言编写&#xff0c;遵守 BSD 协议&#xff0c;是一个高性…...

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它

据悉折叠手机开创者三星披露了一份专利&#xff0c;通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力&#xff0c;希望通过这种方式进一步增强折叠手机的可靠性和耐用性&#xff0c;来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…...

Leetcode面试高频题分类刷题总结

https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类&#xff08;Sort&#xff09;&#xff1a; 基础知识&#xff1a;快速排序&#xff08;Quick Sort&#xff09;&#xff0c; 归并排序&#xff08;Merge Sort&#xff09;的…...

Vue.js `v-memo` 性能优化技巧

Vue.js v-memo 性能优化技巧 今天我们来聊聊 Vue 3.2 引入的一个性能优化指令&#xff1a;v-memo。如果你在处理大型列表或复杂组件时&#xff0c;遇到性能瓶颈&#xff0c;那么 v-memo 可能会成为你的得力助手。 什么是 v-memo&#xff1f; v-memo 是 Vue 3.2 新增的内置指…...

Altium Designer绘制原理图时画斜线的方法

第一步&#xff1a;检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项&#xff0c;点击OK即可。如下图所示&#xff1a; 然后在划线时&#xff0c;按下shift空格就能够切换划线…...

在K8S中,有哪几种控制器类型?

在Kubernetes中&#xff0c;控制器&#xff08;Controller&#xff09;是用来确保实际集群状态与所需状态保持一致的关键组件。它们监控并自动调整系统以达到预期状态&#xff0c;以下是Kubernetes中主要的几种控制器类型&#xff1a; ReplicationController&#xff08;RC&am…...

什么是Rust?它有什么特点?为什么要学习Rust?

什么是Rust&#xff1f;它有什么特点&#xff1f;为什么要学习Rust&#xff1f; 如果你是一名编程初学者&#xff0c;或者已经有一些编程经验但对Rust感兴趣&#xff0c;那么这篇文章就是为你准备的&#xff01;我们将用简单易懂的语言&#xff0c;带你了解Rust是什么、它有什…...

Golang 并发机制-3:通道(channels)机制详解

并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang&#xff08;也称为 Go&#xff09;通过通道&#xff08;channels&#xff09;这一特性&#xff0c;能够可靠且优雅地实现并发通信。本文将揭示通道的概念&#xff0c;解释其在并发编程中的作用&#xff0c;并提供…...

kamailio的kamctl的使用

kamctl 是 Kamailio SIP 服务器的管理工具&#xff0c;用于执行各种管理任务&#xff0c;如启动、停止、重启 Kamailio 进程&#xff0c;管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明&#xff1a; 1. 启动、停止、重启 Kamailio start: 启动…...

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…...

UI线程用到COM只能选单线程模型

无论用不用UI库&#xff0c;哪怕是用Win32 API手搓UI&#xff0c;UI线程要用COM的话&#xff0c;必须初始化为单线程单元(STA)&#xff0c;即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);&#xff0c;不能用MULTITHREADTHREADED。 实际上&#xff0c;很多(WPF等)UI库若…...

LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek&#xff1a;Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介&#xff1a;处理更…...

在C语言中使用条件变量实现线程同步

互斥量、原子操作都是实现线程同步的方法&#xff0c;今日介绍使用条件变量来实现线程同步。在多线程应用中&#xff0c;当某个线程的执行依赖于另一个线程对数据的处理时&#xff0c;这个线程可能没有被阻塞&#xff0c;只是不断地检查某个条件是否成立了&#xff08;这个条件…...

图书管理系统 Axios 源码__新增图书

目录 功能介绍 核心代码解析 源码&#xff1a;新增图书功能 总结 本项目基于 HTML、Bootstrap、JavaScript 和 Axios 开发&#xff0c;实现了图书的增删改查功能。以下是新增图书的功能实现&#xff0c;适合前端开发学习和项目实践。 功能介绍 用户可以通过 模态框&#xf…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...