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

【MyBatis】Java 数据持久层框架:认识 MyBatis

Java 数据持久层框架:认识 MyBatis

  • 1.CRUD 注解
  • 2.映射注解
  • 3.高级注解
    • 3.1 高级注解
    • 3.2 MyBatis 3 注解的用法举例

MyBatis 和 JPA 一样,也是一款优秀的 持久层框架,它支持定制化 SQL、存储过程,以及高级映射。它可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通 Java 对象)映射成数据库中的记录。

MyBatis 3 提供的注解可以取代 XML。例如,使用注解 @Select 直接编写 SQL 完成数据查询;使用高级注解 @SelectProvider 还可以编写动态 SQL,以应对复杂的业务需求。

1.CRUD 注解

增加删除修改查询 是主要的业务操作,必须掌握这些基础注解的使用方法。MyBatis 提供的操作数据的基础注解有以下 4 个。

  • @Select:用于构建查询语句。
  • @lnsert:用于构建添加语句。
  • @Update:用于构建修改语句。
  • @Delete:用于构建删除语句。

下面来看看它们具体如何使用,见以下代码:

@Mapper
public interface UserMapper{@Select("SELECT * FROM user WHERE id = #{id}")User queryById(@Param("id") int id);@Select("SELECT * FROM user")List<User> queryAll();@Insert(("INSERT INTO user(name,age) VALUES(#{name},#{age})"))int add(User user);@Delete("DELETE FROM user WHERE id = #{id}")int delById(int id);@Update("UPDATE user SET name=#{name},age=#{age} WHERE id = #{id}")int updateById(User user);@Select("SELECT * FROM user")Page<User> getUserList();
}

从上述代码可以看出:首先要用 @Mapper 注解来标注类,把 UserMapper 这个 DAO 交给 Spring 管理。这样 Spring 会自动生成一个实现类,不用再写 UserMapper 的映射文件了。最后使用基础的 CRUD 注解来添加要实现的功能。

2.映射注解

MyBatis 的映射注解用于建立实体和关系的映射。它有以下 3 个注解。

  • @Results:用于填写结果集的多个字段的映射关系。
  • @Result:用于填写结果集的单个字段的映射关系。
  • @ResultMap: 根据 ID 关联 XML 里面的 <resultMap>

可以在查询 SQL 的基础上,指定返回的结果集的映射关系。其中,property 表示实体对象的属性名,column 表示对应的数据库字段名。使用方法见以下代码:

@Results({@Result(property = "username", column = "USERNAME"),@Result(property = "password", column = "PASSWORD")
})
@Select("select * from user")
List<User> list();

3.高级注解

3.1 高级注解

MyBatis 3.x 版本主要提供了以下 4 个 CRUD 的高级注解。

  • @SelectProvider:用于构建动态查询 SQL。
  • @InsertProvider:用于构建动态添加 SQL。
  • @UpdateProvider:用于构建动态更新 SQL。
  • @DeleteProvider:用于构建动态删除 SQL。

高级注解主要用于编写动态 SQL。这里以 @SelectProvider 为例,它主要包含两个注解属性, 其中,type 表示工具类,method 表示工具类的某个方法(用于返回具体的 SQL)。

以下代码可以构建动态 SQL,实现查询功能:

@Mapper
public interface UserMapper {@SelectProvider(type = UserSql.class, method = "listAll")List<User> listAllUser();
}

UserSql 工具类的代码如下:

public class UserSql {public String listAll() {return "select * from user";}
}

3.2 MyBatis 3 注解的用法举例

如果要查询所有的值,则基础 CRUD 的代码是:

@Select("SELECT * FROM user3")
List<User> queryAll();

也可以用映射注解来一一映射,见以下代码:

// 使用注解编写 SQL, 完成映射 @Select("select * from user3")
@Results({  @Result(property = "id", column = "id"),@Result(property = "name", column = "name"),@Result(property = "age", column = "age")
})
List<User> listAll;

如果要用多个参数进行查询,则必须加上注解 @Param,否则无法使用 EL 表达式获取参数。

UserMapper 接口的写法如下:

@Select("select * from user where name like #{name} and age like #{age}")
User getByNameAndAge(@Param("name") String name, @Param("age") int age);

对应的控制器代码如下:

@RequestMapping("/querybynameandage")
User querybynameandage(String name, int age) {return userMapper.getByNameAndAge(name,age);
}

还可以根据官方提供的 API 来编写动态 SQL:

public String getUser(@Param("name") String name, @Param("age") int age) { return new SQL() {{SELECT("*");FROM("user3");if (name != null && age != 0) {WHERE("name like #{name} and age like #{age}")} else {WHERE("1=2");}}}.toString();
}

相关文章:

【MyBatis】Java 数据持久层框架:认识 MyBatis

Java 数据持久层框架&#xff1a;认识 MyBatis 1.CRUD 注解2.映射注解3.高级注解3.1 高级注解3.2 MyBatis 3 注解的用法举例 MyBatis 和 JPA 一样&#xff0c;也是一款优秀的 持久层框架&#xff0c;它支持定制化 SQL、存储过程&#xff0c;以及高级映射。它可以使用简单的 XML…...

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings&#xff0c;以便创建只需很少或无需源代码的应用程序。 在本教程中&#xff0c;您将创建一个高清多设备应用程序&#xff0c;该应用程序使用 LiveBindings 绑定多个对象&#xff0c;以更改圆…...

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…...

QT实现升级进度条页面

一.功能说明 在Qt中实现固件升级的进度条显示窗口&#xff0c;你可以通过创建一个自定义的对话框&#xff08;Dialog&#xff09;来完成。这个对话框可以包含一个进度条&#xff08;QProgressBar&#xff09;、一些文本标签&#xff08;QLabel&#xff09;用于显示状态信息&am…...

JavaWeb--纯小白笔记04:Tomcat整合IDEA

IDEA整合Tomcat 1.点击Idea的导航栏里的Run&#xff0c;选择Edit Configurations 2.点击左上角的""&#xff0c;向下翻找到Tomcat Server 选择里面的Local 3.创建一个web工程&#xff0c;点击IDEA的File-->new-->project 然后选择Java Enterprise&#xff0c;…...

【jvm】动态链接为什么需要常量池

目录 1. 常量池的作用2. 动态链接与常量池的关系3. 动态链接的必要性 1. 常量池的作用 1.常量池是JVM&#xff08;Java虚拟机&#xff09;中用于存储字面量&#xff08;如字符串常量、整数常量等&#xff09;和符号引用&#xff08;如类和接口的完全限定名、字段的名称和描述符…...

HTTPS详解

文章目录 HTTPS加密 常见加密方式对称加密非对称加密非对称对称数据指纹 证书CA认证数字签名非对称证书对称 中间人 HTTPS 这也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层 为什么要加密呢&#xff0c;这主要是因为如果不对传输主体加密&#xff0c;当…...

redis作为mybaits(mybatisplus)的缓存

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>配置application.yml文件 spring:data:redis:# 地址host: 127.0.0.1# 端口port: 6379# 数据…...

【环境配置】AST: Asymmetric Student-Teacher Networks for Industrial Anomaly Detection

文章目录 一、环境的配置二、预处理三、训练四、问题 一、环境的配置 # zheP04_cmp_AST $ conda create -n P04_cmp_AST python3.9 $ conda activate P04_cmp_AST $ conda install -y anaconda::scikit-learn $ conda install -y conda-forge::scipy $ conda install -y conda…...

TinkerTool System for Mac实用软件系统维护工具

TinkerTool System 是一款功能全面且强大的 Mac 实用软件&#xff0c;具有以下特点和功能&#xff1a; 软件下载地址 维护功能&#xff1a; 磁盘清理&#xff1a;能够快速扫描并清理系统中的垃圾文件、临时文件以及其他无用文件&#xff0c;释放宝贵的磁盘空间&#xff0c;保…...

物理学基础精解【9】

文章目录 直线与二元一次方程两直线夹角直线方程斜率两点式方程截距式方程将不同形式的直线方程转换为截距方程直线的一般方程直线一般方程的系数有一个或两个为零的直线 参考文献 直线与二元一次方程 两直线夹角 两直线 y 1 k 1 x b 1 , y 2 k 2 x b 2 形成夹角 a 1 和 a…...

Flask-JWT-Extended登录验证

1. 介绍 """安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&…...

Altium Designer(AD)百度云下载与安装(附安装步骤)

在我们日常使用当中&#xff0c;Altium designer常常也被简称为AD&#xff0c;是一款一体化的电子产品开发系统软件&#xff0c;主要运行在Windows操作系统上。 我们通过Altium designer把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技…...

无人机视角下的车辆数据集

车辆数据集 无人机视角下的车辆数据集。数据集为无人机俯拍的真实场景下的车辆机动车数据集。数据集已经标注好&#xff0c;yolo格式&#xff0c;txt标签。数据集已经划分好训练集&#xff08;20970张图片&#xff09;验证集&#xff08;5242张图片&#xff09;测试集&#xff…...

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…...

使用IDA Pro动态调试Android APP

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server&#xff0c;IDA Pro …...

JS中的for...in和for...of有什么区别?

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在 JavaScript 中&#xff0c;for...in 和 for...of 是两种用于遍历数组&#xff08;或其他可迭代对象&#xff09;的循环语句&#xff0c;但它们之间存在显著的差异。 一、遍历数组 for…in const arr …...

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程&#xff1f;1.1.1 为什么要有泛型编程&#xff1f;1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板&#xff1f;1.2.2 函数模板的定义格式1.2.3 示例&#xff1a;通用的交换函数输出示例&am…...

在react中 使用redux

1.安装redux npm install reduxjs/toolkit react-redux 2.创建切片模块化数据 在Src目录下创建store目录&#xff0c;创建moude目录 创建tab.js import { createSlice } from reduxjs/toolkit; const tabSlice createSlice({name: tab,initialState: {Collapse: false,},re…...

计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《PythonSpark知识图谱房价预测系统》开题报告 一、研究背景与意义 随着城市化进程的加速和房地产市场的不断发展&#xff0c;房价成为影响人们生活质量的重要因素之一。准确预测房价不仅有助于政府制定科学的房地产政策&#xff0c;还能为开发商提供市场参考&#xff0c;同时…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...