数据库学习(四)mybatis

Mybatis 

Mybatis是一个基于数据持久层(DAO层)的一款框架,他能极大的简化Java中连接数据库,操作数据库也就是jdbc的操作。

在定义mybatis相关接口时,不需要定义实现类,因为在程序启动时,mybatis底层会自动生成相关的实现类。

Mybatis第一个入门程序

创建一个springboot项目的程序,使用mybatis框架将本地数据库user中的数据取出并存入创建的User实体类中,最后将存入的User实体类对象打印出。

1、连接数据库

需要使用mabatis操作数据库,首先需要连接数据库,在创建好的spingboot项目中,自动提供了一个application.properties配置文件,在其中就可以添加数据库的相关配置来连接数据库,1、相关数据库的驱动类名称2、连接数据库的url。3、数据库的用户名。4、数据库的密码,通过该配置文件就能实现在程序启动时,mybatis框架自动连接相关数据库

2、创建mapper接口

mapper接口相当于之前的DAO层中的接口,实现的是将数据库中的数据取出,该接口使用@Mapper注解表示在程序运行时,会自动创建这个接口的实例化对象,并交给IOC容器管理,而在这个接口里,使用@Select注解定义里面的抽象方法,注解后面跟上相关的查询语句,那么在该实例化对象被创建时,会自动实现该抽象方法,也就是执行@Select注解后面的查询语句,这样也就实现了对数据库的查询操作。

3、通过依赖注入创建实例化类

将查询出的数据作为该实体化类的对象进行存储,因为在之前Mapper接口已经被添加了@Mapper注解,在程序启动时会自动创建该接口的实例化对象并交给IOC容器管理,于是在启动类里直接创建该接口的对象不赋值,给该语句添加@Autowired注解,这样通过依赖注入就能自动创建Mapper接口的实例化对象,再在启动类里直接调用该对象的方法执行查询语句,再将查询后的信息转化为实体化对象User通过集合存储,最后将对象打印,这样一个mabatis对数据库进行操作的简单入门程序就完成了。

 通过mybatis实现基本增删改查操作

1、删除操作

删除一般是在前端发送过来请求删除数据,而发送过来的往往是该数据的唯一标识,也就是主键id,所以删除语句执行的判断条件就是id与前端请求的id相同,通过@delete注解就能实现写入删除sql语句进行删除数据,而在接口的编写中,由于删除的次数可以多次,所以不能将id写死,所以需要mybatis提供的占位符#{id},这样的话就能将方法传入的参数赋值给#{数据}占位符内的数据:

使用#{}占位符能实现sql预编译的功能,预编译相当于是创建了一个缓冲池,将之前执行过的sql语句放入该池中,如果后面有新的语句执行,则会直接将对应不同的部分直接带入进池中执行,不需要重新编译,能有效的避免sql注入,从而提高项目的安全性并且由于已经编译过,在下次使用时直接就能代入执行,所以性能更高。 

2、添加操作 

添加操作与删除操作类似,也是在接口里创建一个@Insert注解标识的方法,并在其后实现添加语句,但是因为添加的属性往往很多,这时我们一般是将这些属性先封装成一个实体类对象,然后再通过调用这个实体类对象的属性进行添加的操作

创建实体类对象:

编写添加接口

在测试类中给实体类对象赋值,以及创建实例化对象调用接口的方法

这样就能初步实现利用mybatis对数据库进行添加数据的操作,有时需要拿到添加元素的ID,则需要在添加注解的基础上添加一个Options注解

3、更新操作

更新操作主要使用update注解,主要更新方式与之前的删除添加语句类似,如下:

4、查询操作

在执行查询操作时,想让数据库里的属性通过对象的方式封装返回,但由于表的命名规范与Java的驼峰命名有时不一致,例如数据库中创建时间为create_time,Java中为createTime,所以容易导致有时候无法将数据库里的这类属性封装到实体类中,这时就得打开mybatis自带的驼峰命名,将create_time这种下划线格式在封装进对象时自动变为Java中的驼峰命名createTime,这样就能避免一些因为属性名不一样导致的错误

在有时候查询会遇到模糊查询的情况,例如查出姓张的人,这时就需要使用like和占位符,但是在sql语句的书写时,由于#{}的原因,会将里面的所有内容当作字符串进行匹配,这样就达不到占位符的目的,这时就需要concat函数对%,‘张’,%进行一个拼接。

使用xml配置文件进行sql操作 

在通常的数据库操作中,往往通过配置文件的方式使用mybatis对数据库进行操作而不使用注解

动态sql语句 

通过xml文件能实现数据库的相关操作,但是如上的代码会有一个弊端,也就是如果我只想查找姓张的员工,不想添加其他限制条件,这个时候按之前的sql语句查询的话就不行,这个时候就需要动态sql语句的执行,主要是利用动态sql标签实现

if标签和where标签

if标签修饰的sql语句跟Java中的if一样,只有if标签内的条件成立,后面的sql语句才会执行,这样的话如果我们只需要查询姓张的员工不需要其他限制条件的查询时,就能直接将其他查询需要的属性值直接设置为null,而where标签则能自动识别哪些地方需要and,哪些地方不需要,避免因为and导致不必要的sql语句语法错误。

同理在修改相关数据的时候,同样也能使用动态sql语句,且使用动态set标签能自动避免多余的逗号导致的sql语法错误,即动态更新语句会将需要修改的值进行修改,如果没传入需要修改的值,则会认为该值自动为null,则不会对其进行修改,保持该值原来的属性

foreach标签 

 使用foreach标签能对一个范围内进行遍历,例如在in关键字后面的范围中,实例如下:下面为一个批量删除的操作。传入一个集合,对该集合内部的元素进行遍历,按照该集合内的id对相应id的用户信息进行删除。

foreach标签内的各个属性如下: 

 

sql标签和include标签 

在实际开发中如果出现大量的重复需要查询的对象,如果不对其进行封装,后期维护或者修改业务需求的话会很难,所以使用sql标签将这部分重复的代码封装起来,如下:将需要查询的重复语句封装起来,如果需要,直接调用include标签传递相关名字的片段。

 

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

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

相关文章

Python环境下一种新的类谱峭度算法的旋转机械故障诊断模型

谱峭度SK的本质是计算每根谱线峭度值的高阶统计量,谱峭度对信号中的瞬态冲击成分十分敏感,能有效的从含有背景噪声信号中识别瞬态冲击及其在频带中的分布。由于谱峭度的复杂性、缺少一个正式的定义和一个容易理解的计算过程使其在很长时间内都未能引入到…

Redis入门到实战-第六弹

Redis实战热身Lists篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的(采用BSD许可证),用作数据库、缓存、消息代理和流…

kubectl 启用shell自动补全功能

官网手册参考:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-linux/ 系统:centos7 补全脚本依赖于工具 bash-completion, 所以要先安装它(可以用命令 type _init_completion 检查 bash-completion 是否已安装&a…

2024年腾讯云优惠券领取教程及使用攻略分享

随着云计算技术的快速发展,腾讯云作为国内领先的云计算服务提供商,为企业和个人提供了丰富的云产品和服务。为了帮助大家更好地了解和使用腾讯云,本文将为大家详细介绍2024年腾讯云优惠券领取教程及使用攻略。 一、腾讯云优惠券介绍说明 腾讯…

成都克鲁斯机器人电路板故障维修攻略,快来了解一下!

一、克鲁斯机器人电路板维修步骤 断开电源:在进行电路维修前,务必断开机器人的电源,确保安全。 拆卸电路板:根据电路图或维修手册,小心拆卸故障电路板。注意记录拆卸过程中的细节,以便后续重新安装。 更换损…

基于 VB6的猜拳游戏

基于 VB6的猜拳游戏 1 欢迎页的制作 welcomeFrom 添加一个定时器 代码如下: Private Sub Form_Load()定时器Timer1的时间间隔设置为1000毫秒Timer1.Interval 1000Timer1.Enabled TrueEnd SubPrivate Sub Timer1_Timer()关闭当前窗体Unload MeReadyFrom.Show…

验证码/数组元素的复制.java

1,验证码 题目:定义方法实现随机产生一个5位的验证码,前面四位是大写或小写的英文字母,最后一位是数字 分析:定义一个包含所有大小写字母的数组,然后对数组随机抽取4个索引,将索引对应的字符拼…

内网exp对抗

内网工具对抗 首先,你需要分析: 1、安全工具是否有源代码 2、安全工具源代码逻辑复杂程度 3、当前源代码你是否有能力修改 其次,你需要考虑: 1、无源码或无能力修改 2、各种异常bug打包问题 3、修改打包后效果也不太好 故…

【Linux】详解进程终止进程等待

一、页表&&写时拷贝的进一步理解 页表中不仅仅只有虚拟地址到物理地址的映射,还包括了很多选项,其中就包括了映射条目的权限。当我们进程的代码和数据加载到内存并和进程地址空间建立映射关系时,如果数据的内容不允许被修改&#xff…

【Java.mysql】——数据删改(DU) 附加数据库约束

目录 🚩更新(Update) 🚩删除(Delete) 🚩数据库约束 🎈约束类型 ✅NULL约束 ✅NNIQUE 唯一约束 ✅DEFAULT:默认值约束 ✅PRIMARY KEY:主键约束 ✅FOREIGN KEY:外键…

【前端】Layui的表格常用功能,表单提交事件,表格下拉按钮点击事件,表格外的按钮点击事件

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《前端》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

高阶SQL语句(二)

一 子查询 也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句 是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。 ①子语句可以与主语句所查询的表相同,也可以是不…

STM32收发HEX数据包

在实际应用中,STM32的串口通信都是以数据包格式进行收发,这个数据包一般都包含包头和包尾,表示一个数据包。源代码在文末给出 数据包格式: 固定长度,含包头包尾 可变包长,含包头包尾 问题1:当…

YoloV5改进策略:BackBone改进|ECA-Net:用于深度卷积神经网络的高效通道注意力

摘要 本文使用ECA-Net注意力机制加入到YoloV5中。我尝试了多种改进方法,并附上改进结果,方便大家了解改进后的效果,为论文改进提供思路。(更新中。。。。) 论文:《ECA-Net:用于深度卷积神经网…

86.分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1: ​ 输入:head [1,4,3,2,5,2], x 3 输出&…

前端学习之JavaScript有关字符串的一些方法

&#xff08;注释是对各个方法的一些解释&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>字符串</title> </head> <body><script>let str1 test1let str2 n…

前端性能优化:掌握解决方案

课程介绍 我们常说性能永远是第一需求&#xff0c;作为一个前端工程师&#xff0c;不管使用什么框架&#xff0c;不管从事什么类型的网站或应用开发&#xff0c;只要是项目被用户使用&#xff0c;性能优化就永远是你需要关注的问题。通常情况下&#xff0c;工程师们在深入了解…

白板手推公式性质 AR模型 时间序列分析

白板手推公式性质 AR模型 时间序列分析 视频讲解&#xff1a;https://www.bilibili.com/video/BV1D1421S76v/?spm_id_from.dynamic.content.click&vd_source6e452cd7908a2d9b382932f345476fd1 B站对应视频讲解(白板手推公式性质 AR模型 时间序列分析)

hdlbits系列verilog解答(Hadd)-65

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们创建一个半加法器。半加法器将两个位相加(无进位)并产生求和和进出。 模块声明 module top_module( input a, b, output cout, sum ); 思路: 可用真值表写出逻辑表达式,或者直接用数据流方式。 二…

Qt 压缩/解压文件

前面讲了很多Qt的文件操作&#xff0c;文件操作自然就包括压缩与解压缩文件了&#xff0c;正好最近项目里要用到压缩以及解压缩文件&#xff0c;所以就研究了一下Qt如何压缩与解压缩文件。 QZipReader/QZipWriter QZipReader 和 QZipWriter 类提供了用于读取和写入 ZIP 格式文…