Java-09 深入浅出 MyBatis - 注解开发 注解映射 基本介绍 与 一对一模型

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

常用注解

MyBatis 是一款优秀的持久层框架,它支持通过注解的方式进行开发,而无需使用传统的 XML 配置文件。这种方式更加简洁、直观,适合于简单的应用场景或轻量级开发项目。MyBatis 提供了一系列注解,用于代替 XML 配置文件中定义的 SQL 语句和映射规则。这些注解直接写在接口或方法上,使得开发更加面向对象,也减少了配置文件的维护成本。

  • Insert 新增
  • Update 更新
  • Delete 删除
  • Select 查询
  • Result 结果集封装
  • Results 与 Result 一起使用,封装多个结果集
  • One 实现一对一的结果封装
  • Many 实现一对多的结果封装

Select

用途:用于执行查询操作。
位置:放在 Mapper 接口的方法上。
支持功能:可以直接写简单的查询语句,支持动态参数。

Insert

用途:用于执行插入操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持插入单条记录或批量插入,支持自动生成主键。

Update

用途:用于执行更新操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持根据条件更新记录。

Delete

用途:用于执行删除操作。
位置:放在 Mapper 接口的方法上。
支持功能:支持根据条件删除记录。

Results 和 Result

用途:用于结果集的手动映射,将查询的字段与对象属性一一对应。
位置:放在 Mapper 接口的方法上。
支持功能:用于字段名和对象属性名不一致的情况。

Param

用途:用于给 SQL 中的参数命名,绑定方法的参数到 SQL 语句中的占位符。
位置:放在 Mapper 方法的参数上。
支持功能:解决方法参数无法直接被引用或多参数的绑定问题。

Options

用途:用于设置方法的额外选项,比如主键生成、查询的缓存等。
位置:放在 @Insert、@Update 等注解上。

ResultMap

用途:引用 XML 或注解中定义的结果映射。
位置:放在 Mapper 接口的方法上。
支持功能:简化复杂的结果映射。

ConstructorArgs 和 Arg

用途:用于在构造函数映射场景中,将查询结果映射到构造函数参数。
位置:放在 Mapper 接口的方法上。

注解优点

  • 简洁:直接在代码中定义 SQL,无需额外的 XML 文件。
  • 强类型支持:与 Java 代码紧密结合,便于重构和代码检查。
  • 便于维护:SQL 紧贴业务逻辑,便于定位问题。

注解缺点

  • 不适合复杂 SQL:对于动态 SQL 和大段查询,注解方式不够灵活。
  • 代码冗长:复杂查询可能导致注解内容过多,影响可读性。
  • SQL 可重用性差:注解中的 SQL 不能像 XML 一样被复用。

常见使用

  • 简单 SQL 使用注解,复杂 SQL 使用 XML 配置文件。
  • 使用 @Param 命名参数,避免歧义。
  • 对大段复杂 SQL 优先采用 XML 的 和 标签,提高复用性。
  • 结合 SpringBoot 使用 @MapperScan 注解统一管理 Mapper。

注解映射

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用 Results 注解,Result 注解,One 注解,Many 注解结合起来完成复杂功能的开发。

在这里插入图片描述
在这里插入图片描述

一对一

查询模型

用户表和订单表的关系,一个用户有多个订单,一个订单只从属于一个用户,一对一查询的需求是,查询一个订单,与此同时查询出该订单所属的用户。

编写代码

OrderMapper

新增了一个方法 findAllWithAnnotation,通过注解的方式进行开发:

@Select("select * from wzk_orders")
@Results({@Result(id = true, property = "id", column = "id"),@Result(property = "ordertime", column = "ordertime"),@Result(property = "total", column = "total"),@Result(property = "user", column = "uid",javaType = WzkUser.class,one = @One(select = "icu.wzk.mapper.UserMapper.findByIdWithAnnotation")),
})
List<WzkOrder> findAllWithAnnotation();

截图如下所示:
在这里插入图片描述

UserMapper

在该类中再加入一个新的方法,也用注解的方式,因为 OrderMapper 中要用到:

@Select("select * from wzk_user where id = #{id}")
WzkUser findByIdWithAnnotation(int id);

对应的截图如下所示:
在这里插入图片描述

调用代码

package icu.wzk;import icu.wzk.mapper.OrderMapper;
import icu.wzk.mapper.UserMapper;
import icu.wzk.model.WzkOrder;
import icu.wzk.model.WzkUser;
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;
import java.util.List;public class WzkIcu11 {public static void main(String[] args) throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);List<WzkOrder> dataList = orderMapper.findAllWithAnnotation();dataList.forEach(System.out::println);sqlSession.close();}
}

对应的代码截图如下所示:
在这里插入图片描述

测试结果

执行代码,对应的控制台输出结果如下所示:

WzkOrder(id=1, ordertime=Mon Nov 11 00:00:00 CST 2024, total=100.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))
WzkOrder(id=2, ordertime=Mon Nov 11 00:00:00 CST 2024, total=200.0, user=WzkUser(id=1, username=wzk, password=icu, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))
WzkOrder(id=3, ordertime=Sun Nov 10 00:00:00 CST 2024, total=150.0, user=WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null))
24/11/13 09:02:37 DEBUG jdbc.JdbcTransaction: Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@75329a49]

对应的截图如下所示:
在这里插入图片描述

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

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

相关文章

【k8s】kubelet 的相关证书

在 Kubernetes 集群中&#xff0c;kubelet 使用的证书通常存放在节点上的特定目录。这些证书用于 kubelet 与 API 服务器之间的安全通信。具体的位置可能会根据你的 Kubernetes 安装方式和配置有所不同&#xff0c;下图是我自己环境【通过 kubeadm 安装的集群】中的kubelet的证…

ES语法(一)概括

一、语法 1、请求方式 Elasticsearch&#xff08;ES&#xff09;使用基于 JSON 的查询 DSL&#xff08;领域特定语言&#xff09;来与数据交互。 一个 ElasticSearch 请求和任何 HTTP 请求一样由若干相同的部件组成&#xff1a; curl -X<VERB> <PROTOCOL>://&l…

Redis开发实践

在现代开发中&#xff0c;Redis 已经成为一种重要的高性能内存数据库。无论是作为缓存、消息队列还是排行榜的实现工具&#xff0c;它都表现出了极高的性能和灵活性。本文将带你了解 Redis 的基本概念&#xff0c;并通过 Python 示例代码实现 Redis 的核心功能。 文章目录 1. R…

【el-table】表格后端排序

在需要排序的列添加属性 sortable&#xff0c;后端排序&#xff0c;需将sortable设置为custom 如果需要自定义轮转添加 sort-orders 属性&#xff0c;数组中的元素需为以下三者之一&#xff1a;ascending 表示升序&#xff0c;descending 表示降序&#xff0c;null 表示还原为原…

Linux迁移gitlab容器

Linux迁移gitlab容器并配置 迁移gitlab容器本文分两部分&#xff0c;第一步在新服务器上安装相同版本的gitlab容器&#xff0c;可以在确定gitlab版本之后直接在docker上拉取&#xff0c;我这里直接从原服务器上将镜像打包加载到新服务器上。第二步从原服务器上操作备份文件&am…

3.建立本地仓库及常用命令

1.建立本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 1&#xff09;在电脑的任意位置创建一个空目录&#xff0c;作为我们的本地Git仓库 2&#xff09;进入这个目录&#xff0c;右键点击Git Bash 窗口 3&#xff09;执行命令git init 4) 如果创…

Narya.ai正在寻找iOS工程师!#Mixlab内推

如果你对AI技术和iOS开发充满热情&#xff0c;这里有一个绝佳的机会加入一家专注于AI应用创新的初创公司。Narya.ai正在招聘iOS工程师&#xff0c;帮助他们开发下一代效率工具&#xff0c;旨在提升用户的日常生活效率与幸福感。 关于Narya.ai&#xff1a; 专注于AI应用层创新&a…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

网络安全攻击和防范措施

常见的有四种网络安全攻击方式. 第一种是XSS跨站脚本攻击,往网页中插入恶意脚本代码以攻击用户. 防范措施有三种. 第一种是输入过滤,对用户的所有输入数据进行检测,过滤掉可能导致脚本的字符. 第二种是输出编码,使用工具对用户输入进行编码,使其中可能含有的HTML脚本变成普通…

Redis服务配置文件 redis.conf 更新修改配置参数说明

场景&#xff1a; 在安装redis服务中&#xff0c;默认的配置项通常不能实际使用&#xff0c;需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件&#xff0c;此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容&#xff0c;主要修改项如下 protect…

成功解决logs is not a directory [Op:CreateSummaryFileWriter] name

成功解决logs is not a directory [Op:CreateSummaryFileWriter] name 目录 解决问题 解决思路 解决方法 1、确保日志目录存在 2、权限问题 3、日志路径配置问题 解决问题 tensorflow.python.framework.errors_impl.FailedPreconditionError: {{function_node __wrapped…

数据集增强:提升深度学习模型泛化能力的关键技术

在深度学习中&#xff0c;数据是模型性能的基石。大规模、高质量的数据集通常能显著提高模型的泛化能力&#xff0c;帮助模型在真实场景中做出更准确的预测。然而&#xff0c;在很多实际应用中&#xff0c;数据收集困难、昂贵或者受限&#xff0c;尤其是当数据集相对较小或标注…

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 以下展示部分颜色源码&#xff1a; namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public s…

第1章:CSS简介 --[CSS零基础入门]

1. 什么是CSS CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于描述HTML或XML&#xff08;包括各种XML方言如SVG、XHTML等&#xff09;文档表现的样式语言。CSS的主要目的是将网页的内容与它的表现形式分离&#xff0c;从而使得开发者能够…

Android 中绘制带箭头的线

在 Android 中绘制带箭头的线&#xff0c;可以使用 Canvas 和 Paint 类。以下是一个示例&#xff0c;展示了如何在自定义 View 中绘制一条带有箭头的线。 自定义 View 实现 你可以创建一个自定义的 View&#xff0c;并覆盖其 onDraw() 方法来实现这个功能。 java public clas…

面试题整理(二)

芯冰乐知识星球入口:芯冰乐

JS +CSS @keyframes fadeInUp 来定义载入动画

JSCSS 更完美展现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>跳动加载指示器</title>&l…

【SpringBoot】整合篇

1、log4j2 第一步&#xff0c;导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <…

C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static

文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作&#xff0c;他们按时他们的习惯在同一个屏幕内显示若干个子视图&#xff0c;尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验&#xff1a; 设计为最多支持5行6列页面展示后&#xff0c;右侧的布局则动…