快速上手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
-
搭建开发环境:
-
引入 MyBatis 依赖:在项目的
pom.xml文件中添加 MyBatis 的 Maven 依赖。 -
配置数据库连接:创建
mybatis-config.xml配置文件,配置数据库连接信息、事务管理器、类型处理器等。
-
-
创建 SqlSessionFactory:
-
使用
SqlSessionFactoryBuilder创建SqlSessionFactory实例,加载mybatis-config.xml配置文件。
-
-
获取 SqlSession:
-
通过
SqlSessionFactory.openSession()方法获取SqlSession实例,用于执行数据库操作。
-
-
定义 Mapper 接口:
-
创建 Mapper 接口,定义数据库操作的方法,如
selectById、insert等。
-
-
编写 Mapper XML 文件:
-
创建与 Mapper 接口对应的 XML 文件,编写 SQL 语句,如
<select>、<insert>等标签。
-
-
执行数据库操作:
-
通过
SqlSession获取 Mapper 接口的实例,调用其方法执行数据库操作。
-
-
关闭资源:
-
操作完成后,调用
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 的核心组件是如何协同工作的。
核心组件
-
SqlSessionFactory:负责创建
SqlSession。 -
SqlSession:负责执行 SQL、提交或回滚事务。
-
Mapper接口:定义数据库操作的接口。
-
Mapper XML文件:编写 SQL 语句。
-
Configuration:MyBatis 的全局配置文件。
-
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. 核心组件总结
-
SqlSessionFactory:通过配置文件加载全局配置信息。
-
SqlSession:负责执行 SQL、提交或回滚事务。
-
Mapper接口:抽象了数据库操作。
-
Mapper XML:实际的 SQL 语句。
-
Configuration:MyBatis 的全局配置文件。
-
MappedStatement:存储 SQL 信息(如
getAllStudents)。
相关文章:
快速上手mybatis教程
基础知识 MyBatis 是一款优秀的持久层框架,其核心组件主要包括以下部分: SqlSession 作用:SqlSession 是 MyBatis 的核心接口,负责与数据库进行通信,执行 SQL 语句,并返回查询结果。它是 MyBatis 的一次会…...
本地部署DeepSeek-R1保姆级教程
近期,我国一款开源模型 DeepSeek-R1以低成本和高性能震撼了全球科技界。该模型的开源性使开发者能够在本地环境中部署和运行,提供了更高的灵活性和控制力。如果你也想在本地部署 DeepSeek-R1,可以参考以下完整的教程,涵盖Mac 版本…...
blender 相机参数
目录 设置相机参数: 3. 设置相机参数示例 4. 相机透视与正交 5. 额外的高级设置 设置相机参数: 设置渲染器: 外参转换函数 转换测试代码: 获取blender渲染外参: 设置相机参数: 3. 设置相机参数示…...
在GPIO控制器中,配置通用输入,读取IO口电平时,上拉和下拉起到什么作用
上下拉电阻作用 在通用输入的时候,也就是在读某个IO的电平的时候 一定要让IO口先保持一个电平状态,这样才能检测到不同电平状态。 如何保持电平状态? 1. 可以通过芯片内部的上下拉电阻,由于是弱上下拉一般不用 2. 硬件外界一个…...
Maven工程核心概念GAVP详解:从命名规范到项目协作的基石
Maven工程核心概念GAVP详解:从命名规范到项目协作的基石 一、GAVP是什么? 在Maven工程中,GAVP是四个核心属性的缩写:GroupId、ArtifactId、Version、Packaging。这组属性为项目在Maven仓库中提供了唯一标识,类似于“项…...
如何利用DeepSeek打造医疗领域专属AI助手?从微调到部署全流程解析
如何利用DeepSeek开源模型打造医疗领域专属AI助手?从微调到部署全流程解析 医疗人工智能正迎来爆发式增长,但在实际应用中,通用大模型往往存在医学知识不精准、诊断逻辑不严谨等问题。本文将手把手带您实现医疗垂直领域大模型的定制化训练&a…...
Redis|前言
文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…...
眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它
据悉折叠手机开创者三星披露了一份专利,通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力,希望通过这种方式进一步增强折叠手机的可靠性和耐用性,来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…...
Leetcode面试高频题分类刷题总结
https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类(Sort): 基础知识:快速排序(Quick Sort), 归并排序(Merge Sort)的…...
Vue.js `v-memo` 性能优化技巧
Vue.js v-memo 性能优化技巧 今天我们来聊聊 Vue 3.2 引入的一个性能优化指令:v-memo。如果你在处理大型列表或复杂组件时,遇到性能瓶颈,那么 v-memo 可能会成为你的得力助手。 什么是 v-memo? v-memo 是 Vue 3.2 新增的内置指…...
Altium Designer绘制原理图时画斜线的方法
第一步:检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项,点击OK即可。如下图所示: 然后在划线时,按下shift空格就能够切换划线…...
在K8S中,有哪几种控制器类型?
在Kubernetes中,控制器(Controller)是用来确保实际集群状态与所需状态保持一致的关键组件。它们监控并自动调整系统以达到预期状态,以下是Kubernetes中主要的几种控制器类型: ReplicationController(RC&am…...
什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...
Golang 并发机制-3:通道(channels)机制详解
并发编程是一种创建性能优化且响应迅速的软件的强大方法。Golang(也称为 Go)通过通道(channels)这一特性,能够可靠且优雅地实现并发通信。本文将揭示通道的概念,解释其在并发编程中的作用,并提供…...
kamailio的kamctl的使用
kamctl 是 Kamailio SIP 服务器的管理工具,用于执行各种管理任务,如启动、停止、重启 Kamailio 进程,管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明: 1. 启动、停止、重启 Kamailio start: 启动…...
HarmonyOS:ArkWeb进程
ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…...
UI线程用到COM只能选单线程模型
无论用不用UI库,哪怕是用Win32 API手搓UI,UI线程要用COM的话,必须初始化为单线程单元(STA),即CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);,不能用MULTITHREADTHREADED。 实际上,很多(WPF等)UI库若…...
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略
LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介:处理更…...
在C语言中使用条件变量实现线程同步
互斥量、原子操作都是实现线程同步的方法,今日介绍使用条件变量来实现线程同步。在多线程应用中,当某个线程的执行依赖于另一个线程对数据的处理时,这个线程可能没有被阻塞,只是不断地检查某个条件是否成立了(这个条件…...
图书管理系统 Axios 源码__新增图书
目录 功能介绍 核心代码解析 源码:新增图书功能 总结 本项目基于 HTML、Bootstrap、JavaScript 和 Axios 开发,实现了图书的增删改查功能。以下是新增图书的功能实现,适合前端开发学习和项目实践。 功能介绍 用户可以通过 模态框…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
