Mybatis——增删改查

目录

一、准备工作

二、mybatis——新增

三、mybatis——删除

四、mybatis——更新

五、mybatis——查询

六、XML映射文件


一、准备工作

1.准备一个数据库表

69bd7434996d4ba68d1d3468f9693c23.png

2.创建一个新的springboot工程,选择引入对应的起步依赖(Mybatis、mybatis等)

3.application.properties中引入数据库连接信息

4.创建对应的实体类Emp(实体类属性采用驼峰命名)

5.准备Mapper接口EmMapper

866d104c4033444c98bfbb63d5aefc66.png

在这里我就不过多的描述,在我的上一篇博客我已经详细介绍了。

        配置mybatis日志:

#配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

二、mybatis——新增

    1.基于注解方式

37d97dfd2ece4c5ab675cba19de2ca3f.png0b6b60feca86411199adad66a2deff26.png

刷新表,数据插入成功。554e7a8dab3d4f0cad673749063a5050.png

        在某些特定的条件下,在数据添加成功后,我们是需要的获取数据库的主键。(主键返回)

//    自动将生成的主键值,赋值给emp对象id属性
    @Options(keyProperty="id",useGeneratedKeys = true)

        获取主键的值:

 System.out.println(emp.getId());

三、mybatis——删除

        根据记录的唯一标识(主键)进行删除。

        1.基于注解方式

739b7d5f31784f5196944124e9126269.png

bc62be07dc744129b35b2ba2358718c2.png

注意事项:

        如果mapper接口方法的形参只有一个普通类型的参数,#{...}里面的属性名可以随便写,如#{id},#{value}。建议两者保持一致增强可读性。

f812e450265540ff9a8b003dfe054580.png

        update后面的数字表示受影响的记录行数,如果你的后面是的1,则代表删除成功,我的是0是因为在此之前我已经把Id为17的记录给删除了。 “Id=?”:?是一个参数占位符,它最终会用Parameters来替代。被我框出来的SQL语句有一个专业的名字叫预编译SQL,在这里我们为什么要用预编译SQL而不是直接进行拼接呢?

        预编译SQL有两大优势:

        1.性能更高。

        执行SQL语句要经历以下流程:

e2871a7a1b4d40fd9cbbd62ecb7010c5.png

        如果进行拼接,不同Id 表示不同的SQL语句,需要执行多次。而预编译采用?进行占位,然后用参数去替代,在数据库中是同一条SQL语句,不用再去重新缓存(缓存中已存在),速度更快性能更优。

        2.更安全(防止SQL注入)。

        SQL注入是指通过操作输入数据来修改实现定义好的SQL语句,已达到执行代码对服务器进行攻击的方法。('or'1'='1')

        参数占位符:#{}(生成预编译SQL,会自动设置参数值),${}(直接进行拼接,存在SQL注入问题)。

四、mybatis——更新

        1.基于注解方式

2c1ccd4dcf014daf9f802c1fe1e43594.png30585f69fa3a40ef83e0eb901a569134.png7858d2294bed4f5fb1fc64ee50fd28b0.png

更新成功。5a70a6f81ca84e058a0994220ac5760a.png

五、mybatis——查询

        1.基于注解方式

        根据id进行查询

54660fc97d2e4b89acd89acde85dc4d8.png

680ccb6c00f74893bf649d04e7118cae.png7d25d4bc25024d4bb8bb32b05dcfdb2c.png

        虽然idea没有报错,但是我们仔细看一下控制台的输出会发现,后面三个变量值为null,为什么会出现这样的结果呢?之前有提到过,实体类属性名和数据库表查询返回的字段名一致,myBatis会自动进行封装。但是如果不一致就不能就行自动封装。有一下几种方案可以解决上述问题:

        方案一:给字段起别名,让别名和实体类属性保持一致

1a0e76af67994a718a57f2024d778da8.png

        方案二:通过@results,@result注解手动进行映射

ff271b07c0634ec5bc8a054b475ee268.png

        方案三:开启mybatis的驼峰命名的自动映射的开关(前提:字段名和属性名符合驼峰命名的规则,才能自动映射)

bf4fe8cee58b4ab2b3001ed2dbcee261.png

        经过上述任意操作,我们可以后面三个的属性值已经不再为空,已经成功封装。

28fa728dbb38459aa8cbc35fb01f4b51.png

       根据条件查询(员工姓名支持模糊匹配,性别进行精准查询,入职时间进行范围查询,进行排序)9c8b096d98754242bd1eac294d5978c8.png9a2e10648fea412681efdc8044af00cb.png

        #{}不能出现在单引号内,再进行预编译的时候?在单引号内,会变成一个普通的?,起不到预编译的作用,在这里我们可以使用${}。虽然可以达到想要的结果,但是${}性能低,会存在SQL注入问题,我们可以使用concat函数(推荐使用)。(and前后有空格不要忘记)

5230920444af48f188e7539352429909.pngacca9c9678e44ce7a44d7255bf4db215.png        测试代码

6a10dee95fe840ea8863bffc2891fa24.png        参数名的说明:在早期springboot中,多个参数与参数值不能进行对应,需要通过一个@Param注解 

80b37253b0224d00b4409acfc903e456.png

        恭喜你,你已经成功学习mybatis的基本操作增删改查 (基于注解方式的)。

六、XML映射文件

        我们除了可以通过注解配置SQL语句,还可以通过xml进行配置。下面介绍一下xml映射文件:

  • xml映射文件的名称与Mapper接口名称一致,并且xml映射文件和Mapper接口要在相同的包下(目录使用/分隔)
  • xml映射文件的namespace属性为Mapper接口全限定名一致
  • xml映射文件中SQL语句的id与Mapper接口中的方法名保持一致,并保持返回类型一致(resultType 单条记录封装的类型一致)

xml映射文件的约束

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

         使用注解配置简单的SQL语句会使代码更加的简洁,但是对于稍微复杂一点的语句,java注解会使本就复杂的SQL语句更加的混乱不堪,因此做一些复杂的操作最好用xml语句。没有统一的标准,永远不要拘泥一种方式,你可以在基于注解和xml语句映射方式自由的进行切换。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C:数据结构---算法

1.1排序算法 稳定排序 不稳定排序 ①冒泡排序&#xff08;稳定&#xff09; 比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对 ②选择排序 在未排序序列中找到最小&#xff08;大…

一文入门【NestJs】Providers

Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS&#xff0c;作为Node.js的一个现代框架&#xff0c;采用了Angular的一些核…

【Dison夏令营 Day 16】如何使用 Python 中的 PyGame 制作俄罗斯方块游戏

俄罗斯方块(Tetris)是一款经典的益智游戏&#xff0c;游戏的目的是将落下的几何图形片&#xff08;称为 “俄罗斯方块”&#xff09;排列起来&#xff0c;填满水平线&#xff0c;不留空隙。当一条线被完全填满时&#xff0c;它就被清除了&#xff0c;玩家就能获得分数。随着四角…

【企业级监控】源码部署Zabbix与监控主机

Zabbix企业级分布式监控 文章目录 Zabbix企业级分布式监控资源列表基础环境一、LNMP环境搭建&#xff08;在zbx主机上&#xff09;1.1、配置Yum仓库1.1.1、下载阿里云的仓库文件1.2.2、安装PHP7的仓库1.2.3、生成Mariadb10.11的仓库文件1.2.4、快速重建Yum缓存 1.2、安装PHP7.4…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度&#xff0c;这家来自英国的品牌&#xff0c;有着鲜明的黑金设计色彩&#xff0c;以及低调奢华的质感&#xff0c;当然最重要的是&#xff0c;欧尼士的音质表现非常出色&#xff0c;因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

uniapp中使用uni-ui组件库

src目录下新建components目录从uni-ui引入对应的组件目录&#xff0c;如下图 直接使用组件&#xff0c;demo <template><view id"my" data-name"王五" data-age"18">my页面</view><uni-data-select :localdata"local…

WebDriver与浏览器通信的深度剖析与探索

在自动化测试的世界里&#xff0c;WebDriver无疑是连接测试脚本与浏览器之间的桥梁&#xff0c;它让复杂的自动化测试成为可能。本文将深入探讨WebDriver与浏览器之间的通信机制&#xff0c;揭示它们之间如何协同工作&#xff0c;以及这一过程中涉及的关键技术和挑战。 一、We…

sqlmap使用之-post注入、head注入(ua、cookie、referer)

1、post注入 1.1、方法一&#xff0c;通过保存数据包文件进行注入 bp抓包获取post数据 将数据保存到post.txt文件 加上-r指定数据文件 1.2、方法二、通过URL注入 D:\Python3.8.6\SQLmap>python sqlmap.py -u "http://localhost/login.php" --data "userna…

2024年06月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C等级认证CCF-GESP真题解析》&#xff0c;专栏总目录&#xff1a;点这里。订阅后可阅读专栏内所有文章。 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&…

【JavaScript 报错】未捕获的范围错误:Uncaught RangeError

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、错误原因分析1. 递归调用次数过多2. 数组长度超出限制3. 数值超出允许范围 二、解决方案1. 限制递归深度2. 控制数组长度3. 检查数值范围 三、实例讲解四、总结 Uncaught RangeError 是JavaScript中常见的一种错误&…

k8s集群离线部署

K8s离线部署 环境 目标 k8s离线部署 步骤 部署docker 详情见文章&#xff1a;《离线安装docker及后端项目离线打包》 https://blog.csdn.net/qq_45371023/article/details/140279746?spm1001.2014.3001.5501 所用到的所有文件在&#xff1a; 链接&#xff1a;https://pan…

9.Python学习:Socket

1.网络通信要素&#xff08;IP端口传输协议&#xff09; 2.Socket编程 2.1TCP、UDP协议了解 2.2 Socket流程 服务端有两个socket对象&#xff0c;客户端有一个 3.Socket实战 服务端代码&#xff1a; import socket #创建Socket对象 sksocket.socket() #绑定ip与端口号-使…

上机算法刷题暑期篇(一) —— AcWing 3692. 最长连续公共子序列(西电)

题目链接 AcWing 3692. 最长连续公共子序列 题目详情 题目解析 我们一看到题目,最长和连续子串&#xff0c;我们第一反应应该是什么?没错,就是dp,一般来说&#xff0c;子串问题常见的解法有两种&#xff1a; 双指针 dp 这道题无疑就是一道最常见的dp问题&#xff0c;而dp问…

vue + echart 饼形图

图表配置&#xff1a; import { EChartsOption, graphic } from echarts import rightCircle from /assets/imgs/index/right_circle.png export const pieOption: EChartsOption {title: {text: 100%,subtext: 游客加量,left: 19%,top: 42%,textStyle: {fontSize: 24,color:…

唐刘:当 SaaS 爱上 TiDB(一)- 行业挑战与 TiDB 的应对之道

导读 在 TiDB 8.1 发布后&#xff0c;TiDB 展现了强大的支持 SaaS 业务的能力&#xff0c;成为 SaaS 业务数据库的优先选择之一。 本文为“当 SaaS 爱上 TiDB”系列文章的第一篇&#xff0c;系列文章将从技术原理和真实用户体验两个角度深入探讨 TiDB 在 SaaS 业务中的表现&a…

kafka发送消息流程

配置props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, RoundRobinPartitioner.class); public Map<String,Object> producerConfigs(){Map<String,Object> props new HashMap<>();props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrapServers…

ISO/OIS的七层模型②

OSI模型是一个分层的模型&#xff0c;每一个部分称为一层&#xff0c;每一层扮演固定的角色&#xff0c;互不干扰。OSI有7层&#xff0c;从上到下分别是&#xff1a; 一&#xff0c;每层功能 7.应用层&#xff08;Application layer &#xff09;&#xff1a;应用层功能&#x…

计算机基础 进制转化

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

用Apipost压力测试接口

用Apipost压力测试接口 1.点击自动化测试 2.选择要测试的接口 3.如果没有接口&#xff0c;就先在api调试中添加要测试的接口 4.根据自己的需求设置相应的参数&#xff0c;这里我压测10次 5.这样就可以压测接口了&#xff0c;非常nice

c++ 建造者模式

文章目录 建造者模式为什么使用建造者模式建造者模式实现步骤实现示例建造者模式优缺点 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是面向对象设计模式中的一种&#xff0c;主要用于创建复杂对象。这种模式将对象的构建过程与其表示分离&#xff0c;允许用…