Mybatis使用简述

news/2025/10/28 21:34:57/文章来源:https://www.cnblogs.com/syf0824/p/19172780

什么是 MyBatis?

MyBatis 是一款优秀的 Java 持久层框架,它通过 XML 或注解的方式将 Java 对象与数据库中的记录进行映射。与传统的 JDBC 相比,MyBatis 极大地简化了数据库操作代码,让开发者能够更专注于业务逻辑而不是繁琐的数据访问细节。

MyBatis 的核心特点:

简化了 JDBC 的复杂操作

支持动态 SQL,能够根据条件灵活构建查询语句

提供了强大的映射机制,支持复杂的对象关系映射

Spring 等主流框架无缝集成

学习曲线平缓,配置灵活

 

为什么选择 MyBatis?

与其它持久层框架的对比

相比于 Hibernate 这样的全自动 ORM 框架,MyBatis 提供了更多的灵活性。MyBatis 允许你直接编写原生 SQL,这在处理复杂查询或需要优化 SQL 性能时具有明显优势。

主要优势:

灵活性:可以编写原生 SQL,灵活控制查询逻辑

性能优化:直接控制 SQL 语句,便于性能调优

简化开发:减少了大量 JDBC 模板代码

易于学习:学习曲线平缓,上手快速

Spring 集成良好:可以无缝集成到 Spring 框架中

 

 

环境搭建

创建springboot项目

屏幕截图 2025-10-28 164451

 导入mybatis起步依赖、mysql驱动及其他需求(首次使用下载时间会较长)

屏幕截图 2025-10-28 164546

 连接数据源

72ef5423-bc2e-4a4a-b659-db516725fa58

 

屏幕截图 2025-10-28 192902

 建立数据库

范例代码:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS demo;
USE demo;-- 创建员工表
CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,employee_id VARCHAR(20) UNIQUE NOT NULL,name VARCHAR(50) NOT NULL,gender ENUM('', '') NOT NULL,age INT,department VARCHAR(50) NOT NULL,position VARCHAR(50) NOT NULL,salary DECIMAL(10,2),hire_date DATE NOT NULL,email VARCHAR(100),phone VARCHAR(20),address VARCHAR(200),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 插入示例数据
INSERT INTO employees (employee_id, name, gender, age, department, position, salary, hire_date, email, phone, address)
VALUES
('EMP001', '张三', '', 28, '技术部', '软件工程师', 15000.00, '2020-03-15', 'zhangsan@company.com', '13800138001', '北京市海淀区'),
('EMP002', '李四', '', 32, '人力资源部', 'HR经理', 12000.00, '2018-06-20', 'lisi@company.com', '13800138002', '北京市朝阳区'),
('EMP003', '王五', '', 35, '财务部', '财务主管', 18000.00, '2016-09-10', 'wangwu@company.com', '13800138003', '北京市西城区'),
('EMP004', '赵六', '', 26, '市场部', '市场专员', 8000.00, '2021-01-08', 'zhaoliu@company.com', '13800138004', '北京市东城区'),
('EMP005', '钱七', '', 30, '技术部', '高级工程师', 20000.00, '2019-11-25', 'qianqi@company.com', '13800138005', '北京市丰台区'),
('EMP006', '孙八', '', 29, '销售部', '销售经理', 16000.00, '2020-07-30', 'sunba@company.com', '13800138006', '北京市石景山区'),
('EMP007', '周九', '', 27, '技术部', '前端开发', 13000.00, '2021-03-12', 'zhoujiu@company.com', '13800138007', '北京市通州区'),
('EMP008', '吴十', '', 33, '行政部', '行政主管', 11000.00, '2017-05-18', 'wushi@company.com', '13800138008', '北京市昌平区'),
('EMP009', '郑十一', '', 31, '财务部', '会计', 10000.00, '2019-08-22', 'zhengshiyi@company.com', '13800138009', '北京市大兴区'),
('EMP010', '王芳', '', 25, '市场部', '市场助理', 7000.00, '2022-02-14', 'wangfang@company.com', '13800138010', '北京市房山区');

范例效果:

屏幕截图 2025-10-28 181527

 若已有数据库,则直接连接

bf14800f-7189-4630-b774-ec6a16e201b3

 在application.properties文件中配置数据库连接信息:

屏幕截图 2025-10-28 193852

spring.application.name=demo
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/demo
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234

实体类设计

MyBatis 中,实体类对应数据库中的表结构。良好的实体类设计是使用 MyBatis 的基础。

 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id; //IDprivate String username; //用户名private String password; //密码private String name; //姓名private Short gender; //性别 , 1 男, 2 女private String image; //图像urlprivate Short job; //职位 , 1 班主任 , 2 讲师 , 3 学工主管 , 4 教研主管 , 5 咨询师private LocalDate entrydate; //入职日期private Integer deptId; //部门IDprivate LocalDateTime createTime; //创建时间private LocalDateTime updateTime; //修改时间
}

 

Mapper 接口设计

Mapper 接口定义了数据访问的方法,可以使用注解完成接口的实现。(例如实例代码中“分页查询”“查询数据总数”“新增员工”“根据id查询员工信息”这些功能的实现)

 

@Mapper
public interface EmpMapper {//分页查询@Select("select * from emp limit #{start},#{pageSize}")List<Emp> page(Integer start, Integer pageSize);//条件分页查询List<Emp> list(Integer start, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);//查询数据总数@Select("select count(*) from emp")Long count();//批量删除员工void delete(List<Integer> ids);//新增员工@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"value(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")void save(Emp emp);//根据id更新员工信息void update(Emp emp);//根据id查询员工信息@Select("select * from emp where id = #{id}")Emp getById(Integer id);
}

 

Mapper XML 映射文件

XML 映射文件是 MyBatis 的核心,它定义了 SQL 语句和结果映射。在sql语句较复杂的情况下,不建议使用注解实现mapper接口(这样会使得代码显得杂乱不易阅读),而是在XML映射文件中编写sql语句。需要注意的是,XML映射文件的路径名称必须于mapper接口路径名称相同。(EmpMapper接口文件路径名称为:cn.nuist.tlias.mapper.EmpMapper,XML映射文件路径名称也为:cn.nuist.tlias.mapper.EmpMapper)

 

屏幕截图 2025-10-28 210058

 mapper接口中的分页条件查询”“批量删除员工信息根据id更新员工信息功能在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="cn.nuist.tlias.mapper.EmpMapper"><select id="list" resultType="cn.nuist.tlias.pojp.Emp">select *from emp<where><if test="name != null and name != ''">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desclimit #{start},#{pageSize}</select><delete id="delete">deletefrom empwhere id in<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach></delete><update id="update">update emp<set><if test="username != null and username != ''">username = #{username}</if><if test="name != null and name != ''">name = #{name}</if><if test="gender != null">gender = #{gender}</if><if test="image != null and image != ''">image = #{image}</if><if test="job != null">job = #{job}</if><if test="entrydate != null">entrydate = #{entrydate}</if><if test="deptId != null">dept_id = #{deptId}</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update></mapper>

动态 SQL:灵活构建查询

MyBatis 的强大特性之一就是动态 SQL,它允许你根据条件动态生成 SQL 语句。

 

<if> 根据条件包含 SQL 片段

 

<choose>, <when>, <otherwise>:实现类似 switch-case 的逻辑

 

<where>:智能处理 WHERE 条件,自动去除多余的 AND/OR

 

<set>:用于 UPDATE 语句,智能处理 SET 子句

 

<foreach>:遍历集合,常用于 IN 条件或批量操作

 

<trim>:更灵活的字符串修剪功能

 

<bind>:创建变量并在当前上下文使用

 

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

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

相关文章

重组蛋白表达服务:CHO HEK293细胞系选择与表达优化方案

重组蛋白表达服务:CHO/HEK293细胞系选择与表达优化方案在生命科学研究领域,重组蛋白作为重要的科研试剂,其质量直接影响实验结果的可靠性。选择合适的表达系统并进行表达优化,是获得高质量重组蛋白的关键环节。本文…

C++里的代码命名规范

以下是 C++ 中最主流的几种命名规范: 1. 蛇形命名法 这是 C++ 标准库和许多 C++ 社区(如 Boost)最推荐的风格。小写蛇形命名法:所有字母小写,单词之间用下划线 _ 连接。适用于:变量、函数、命名空间、文件。 示例…

最小二乘问题详解6:梯度下降法

介绍了使用梯度下降法求解非线性最小二乘问题的原理与实现,通过C++和Eigen库对指数模型进行参数拟合,展示了算法流程、雅可比矩阵计算及收敛行为,并对比了其在机器学习与计算机视觉中的应用差异。1. 引言 在之前的两…

JavaWeb01

1.JavaWeb介绍 什么是JavaWeb?Web:全球广域网,也称万维网(www),能够通过浏览器访问的网站 JavaWeb:使用Java技术来解决相关web互联网领域的技术栈网页:展现数据 数据库:存储和管理数据 JavaWeb程序:逻辑处理数…

现代C++编程初体验

##实验任务1 ##代码#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); …

Delphi 利用接口实现frame窗体间的通讯(互动)

需求说明: 程序设计:效果演示:设计思路: FrmCK 只负责发布事件,不关心谁在监听. FrmGrid 只负责响应事件,不关心事件来源. 创建过程: 一.创建接口单元FrmInterface. 全部代码如下:unit FrmInterface;interfaceusessy…

Python冒泡排序:简单易懂的算法实现

在编程的世界里,排序算法是数据处理的基础之一。冒泡排序(Bubble Sort)是一种简单且直观的排序算法,虽然它的效率不是最高的,但它非常适合初学者学习排序算法的基本概念。今天,我们就来详细探讨如何在Python中实…

SAM+ARM

一、首先是图像caption的生成。 输入的图像,被输入进BLIP的图像编码器得到图像嵌入,图像嵌入再经过(BLIP Image-grounded Text Decoder) 得到图像caption。ti表示caption的第i个单词,总共有L个单词。 但是,capti…

《代码大全2》观后感(二):需求分析——代码质量的“源头防线”

《代码大全2》观后感(二):需求分析——代码质量的“源头防线” “为什么明明按需求写的代码,最后还是要推翻重写?”这是我过去常有的困惑,直到读了《代码大全2》中“需求分析”的章节,才找到答案:很多时候,我…

NRF54LM20A 芯片的优点

多达 66 个 GPIO 7 个串行接口(SPI、TWI、UART、HS-SPI) 14 位 ADC、全局 RTC(在系统关闭状态下可用)、TDM、PDM、NFC、PWM、QDEC 等 显著降低的功耗 - 与 nRF52 系列相比,典型蓝牙低功耗应用场景下功耗降低约 30-50% …

零散点小总结(25.10.28)

今天练习了Dp,主要把Dp重新看待了一下,有以下几点Dp其实本质是一种表,用于储存子问题的答案 Dp中其实还有枚举,只是由于子问题被存入表中了,所以减少了时间复杂度 一个搜索其实就是Dp的暴力解,有很多的子问题,但…

Top Tree大学习

前言 \(Top Tree\) 用来解决 路径查询,动态 \(dp\) 等问题。 信息储存在 簇 中。 簇(\(Cluster\)) 树上一个边联通块,可以收缩成一条边,我们成这样的联通子图为 簇。 簇上的某些点与其它簇相接,我们称其为簇的 端…

乱学点东西目录

这里记录了各种各样的奇奇怪怪的算法/思路/数据结构,好玩! 乱学点东西#1 :二进制警报器可以自由转载

CFS任务的负载均衡(load balance)

前言 我们描述CFS任务负载均衡的系列文章一共三篇,第一篇是框架部分,第二篇描述了task placement和active upmigration两个典型的负载均衡场景。本文是第三篇,主要是分析各种负载均衡的触发和具体的均衡逻辑过程。 …

EVE-NG导入华为等镜像的方法

镜像下载Dynamips:思科设备真实IOS镜像,类似GNS3,电脑CPU利用率非常高。 IOL:IOU模拟器的镜像,基本完全支持思科设备二、三层功能。 QEMU:这已经不是镜像文件,而是KVM虚拟机安装操作系统后生成的磁盘文件,通常…

(简记)一类支配点对解决区间查询问题

前言:最近好像见了挺多这种题,记录一下。 支配点对 我们经常遇到树上或区间上关于 \(x,y\in[l,r]\) 一类的区间统计问题,且通常要求区间内点两两任意匹配并统计总贡献,这个贡献不具有简单可加性。我们往往通过找支…

2025 云斗

10/27 Contest 5 A:小分讨+dp C:发现是所有的数和它的倍数有限制,对于值域 \(n\) 这样的限制也只有 \(\sum\limits_{i=1}^n\frac{n}{i}=n\log n\) 个,考虑如何表示这些限制。 考虑对于限制 u,v,若两点都不是对方的…

c++ ranges随笔

ranges c++20引入,在<ranges>头文件中 建立在 std::algo 和 iterator基础上,并做了进一步的抽象集成 与之前相比更加的 安全、简洁、方便 // ranges concept template <typename T> concept range = req…

qoj14458. 调色滤镜

qoj14458. 调色滤镜 平面 \([1,10^9]\times[1,10^9]\) 上有 \(n\) 个点,点 \(i\) 位于 \((x,y)\),有颜色 \(c_i\in [0,9]\)。 有 \(q\) 次操作,每次对平面上一个矩形范围内的点的颜色作用映射 \(f:[0,9]\rightarrow…

第8天(中等题 不定长滑动窗口、哈希表)

打卡第八天 3道中等题滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。 熟练度+++ 可以十几分钟独立写出相似题了^O^/ 耗时≈一小时 明天继续