数据库学习(四)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.hqwc.cn/news/572239.html

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

相关文章

【晴问算法】入门篇—递归—数塔

题目描述 数塔就是由一堆数字组成的塔状结构,其中第一行1个数,第二行2个数,第三行3个数,依此类推。每个数都与下一层的左下与右下两个数相连接。这样从塔顶到塔底就可以有很多条路径可以走,现在需要求路径上的数字之和…

商标跨类异议与跨类保护!

有个朋友对普推知产老杨说收到某邮件,名下商标让某公司抢注了现在公告期,让赶紧提出来异议去处理下,怎么会有这样的事,相同的名称基本上在同类别相关产品是无法公告和获得初审的。 经详细检索分析后,发现不是这样一回…

对AOP的理解

目录 一、为何需要AOP?1、从实际需求出发2、现有的技术能解决吗?3、AOP可以解决 二、如何实现AOP?1、基本使用2、更推荐的做法2.1 “基本使用”存在的隐患2.2 最佳实践2.2.1 参考Transactional(通过AOP实现事务管理)2.…

BEVFormer v2论文阅读

摘要 本文工作 提出了一种具有透视监督(perspective supervision)的新型鸟瞰(BEV)检测器,该检测器收敛速度更快,更适合现代图像骨干。现有的最先进的BEV检测器通常与VovNet等特定深度预训练的主干相连,阻碍了蓬勃发展…

深入理解React的setState机制

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C语言牛客网BC-36 温度转换

题目如下 代码实现 #include<stdio.h> int main() {float a 0;scanf("%f",&a);float c 5.0/9*(a-32);printf("%.3f",c);return 0; } 创作不易&#xff0c;点点关注&#xff0c;感谢支持&#xff01;&#xff01;&#xff01;

HWOD:对n个字符串按照字典序排序

一、知识点 1、pow函数 引用头文件math.h 求x的y次方 2、链接数学库 math.h头文件对应的库名称是libm sudo find / -name libm.so -print ls /usr/lib/x86_64-linux-gnu/ 链接命令&#xff1a;gcc xxx.c -L. -lm 3、52进制 A的ASCII码是65&#xff0c;Z的ASCII…

ROS 2边学边练(2)-- 咱也玩玩Turtlesim

同ROS 1一样&#xff0c;Turtlesim(小海龟)例程往往是大家首次熟悉ROS世界的唯一不二之选&#xff08;如同刚接触编程的同学&#xff0c;老师会让大家打出“Hello World”的道理一样&#xff09;&#xff0c;很多教学视频及书籍也同样如此&#xff0c;为何&#xff1f;麻雀虽小…

java项目:基于JavaWeb实现企业员工工资管理系统(技术栈:javaweb+jsp+mysql 源码+数据库)

一、项目简介 本项目是一套基于ServletJsp实现的学生成绩管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#xff0…

基于java+springboot+vue实现的校园二手交易系统(文末源码+Lw+ppt)23-336

摘 要 自从新冠疫情爆发以来&#xff0c;各个线下实体越来越难做&#xff0c;线下购物的人也越来越少&#xff0c;随之带来的是一些不必要的浪费&#xff0c;尤其是即将毕业的大学生&#xff0c;各种用品不方便携带走导致被遗弃&#xff0c;造成大量的浪费。本系统目的就是让…

docker关闭全部运行容器命令是什么?

环境&#xff1a; docker v22.1 问题描述&#xff1a; docker关闭全部运行容器命令是什么&#xff1f; 解决方案&#xff1a; 要关闭所有正在运行的Docker容器&#xff0c;可以使用如下命令&#xff1a; docker stop $(docker ps -a -q)这条命令首先执行 docker ps -a -q…

主流公链 - Solana

探索Solana区块链&#xff1a;下一代高性能区块链平台 1. Solana简介 Solana是一个高性能的区块链平台&#xff08;TPS能达到10W级别&#xff09;&#xff0c;旨在实现高吞吐量和低延迟的区块链交易处理。它采用了一系列创新技术&#xff0c;其中包括Proof of History (PoH)&a…