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

第十五篇:Mybatis

文章目录

  • 一、什么是MyBatis
  • 二、Mybatis入门案例
  • 三、配置SQL提示
  • 四、数据库连接池
  • 四、lombok
  • 五、mybatis基础操作
    • 5.1 根据id删除
    • 5.2 预编译SQL
    • 5.3 新增员工
    • 5.4 更新员工
    • 5.5 查询员工(用于页面回显)
    • 5.6 条件查询
  • 七、XML映射文件
  • 八、动态SQL
    • 8.1 if语句
    • 8.2 foreach语句
    • 8.3 sql/include语句
  • 小结

一、什么是MyBatis

MyBatis是一款优秀的持久层框架,用于简化JDBC的开发
在这里插入图片描述

二、Mybatis入门案例

使用MyBatis查询所有用户的数据
在这里插入图片描述

三、配置SQL提示

在这里插入图片描述

四、数据库连接池

数据库连接池是个容器,负责分配,管理数据库连接(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个
释放空间时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

在这里插入图片描述

  • 如果没有连接池,每次访问数据库时候,需要开启一个新的连接,用完需要关闭,比较浪费资源
  • 有了数据库连接池,程序在初始化的时候,会在这个容器中创建一定量的连接对象,后面客户端在访问数据库时候,会在连接池中来获取连接,用完之后再归还,就可以做到连接的复用,而不用每次都新建一个在关闭

数据库连接池的优势:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

标准接口:DataSource

  • 官方提供的数据库连接池接口,由第三方组织实现此接口
  • 功能:获取连接

Connection getConnection() throws SQLException;

在这里插入图片描述
Springboot默认Hikari(追光者)

Druid(德鲁伊):

  • Druid连接池是阿里巴巴开源的数据库连接池项目
  • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

四、lombok

lombok是一个使用的Java类库,能够通过注解的形式自动生成构造器,getter/setter,equals,hashcode,tostring等方法,并可以自动化生成日志变量,简化Java开发,提高效率

注解作用
@Getter/Setter为所有的属性提供get/set方法
@ToString给雷自动生成toString方法。
@EqualsAndHashCode根据类所拥有的非静态字段自动重写equals方法和hashCode方法
@Data注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@NoArgsConstructor生成无参的构造方法。
@AllArgsConstructor生成包含类中所有字段的构造方法。

在这里插入图片描述
需要在pom.xml中加入lombok依赖

五、mybatis基础操作

准备工作

  • 准备数据表emp
  • 创建一个新的springboot工程,引入起步依赖(mybatis,mysql驱动,lombok)
  • 配置文件中引入数据库的连接信息
  • 创建Emp实体类(采用驼峰命名法)
  • 准备Mapper接口EmpMapper
    在这里插入图片描述

5.1 根据id删除

在mapper接口中写入代码如下:

@Mapper
public interface EmpMapper {
//    根据id删除@Delete("delete from mybatis.emp where id = #{id}")public void  delect(Integer id);
}

在测试类中调用如下:

@SpringBootTest //整合单元测试的类
class SpringbootMybatisApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void test(){int delete = empMapper.delect(17);System.out.println(delect)}
}

返回值为1(受影响的行数):
在这里插入图片描述


在这里插入图片描述

5.2 预编译SQL

在这里插入图片描述
性能更高
更安全(防止SQL注入)
在这里插入图片描述

只需要编译一次,后面直接把参数传进去就可以执行,所以性能更高,

在这里插入图片描述

5.3 新增员工

在mapper接口中写入代码如下:

//    新增员工@Insert("insert mybatis.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +"values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")public void insert(Emp emp);

在测试类中测试如下:

在这里插入图片描述
在这里插入图片描述
useGeneratedKeys:是否要获取到返回来的数据
keyProperty:返回来的数据往那个地方封装

5.4 更新员工

在mapper接口中写入代码如下:

//    更新员工@Update("update mybatis.emp set username = #{username},name = #{name},gender = #{gender},image = #{image}" +",job = #{job},entrydate = #{entrydate},dept_id = #{dept_id},create_time = #{createTime},update_time = #{updateTime}")public void update(Emp emp);

在测试类中测试如下:

在这里插入图片描述

5.5 查询员工(用于页面回显)

在mapper接口中写入代码如下:

//    根据id查询员工@Select("select * from mybatis.emp where id = #{}")public Emp getById(Integer id);

在测试类中测试如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
但是运行结果中,其中dept_id,creat_time,update_time 并没有结果

原因是因为没有进行数据封装
在这里插入图片描述
开启mybatis自动映射开关
在application配置文件中
在这里插入图片描述

5.6 条件查询

//    条件查询员工@Select("select * from mybatis.emp where name like concat('%','#{name}','%') and gender = #{gender} and" +" entrydate between #{begin} and #{end} order by update_time desc " )public List<Emp> list(String name , Short gender , LocalDate begin , LocalDate end);

运行结果
在这里插入图片描述

七、XML映射文件

规范:

  • XML映射文件的名称与Mapper接口名称保持一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  • XML映射文件的namespace属性为Mapper接口全限定名一致
  • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

在这里插入图片描述

在这里插入图片描述

以xml定义sql语句例如:
先加上xml约束

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--     nampespace 绑定Mapper接口的全名-->
<mapper namespace="com.itzhangxx.mapper.EmpMapper"><!--     条件查询员工--><select id="list" resultType="com.itzhangxx.Pojo.Emp">select * from mybatis.emp where name like concat('%','#{name}','%') and gender = #{gender} andentrydate between #{begin} and #{end} order by update_time desc</select>
</mapper>

八、动态SQL

8.1 if语句

随着用户的输入或外部条件的变化而变化的SQL语句,称为动态SQL

<mapper namespace="com.itzhangxx.mapper.EmpMapper"><!--     条件查询员工--><select id="list" resultType="com.itzhangxx.Pojo.Emp">select *from mybatis.emp<where><if test="name != null">name like concat('%', '#{name}', '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if><where>order by update_time desc</select>
</mapper>

这样就可以动态的满足需求的再进行SQL的查找

优化上面更新员工代码:
原SQL:

@Update("update mybatis.emp set username = #{username},name = #{name},gender = #{gender},image = #{image}" +",job = #{job},entrydate = #{entrydate},dept_id = #{dept_id},create_time = #{createTime},update_time = #{updateTime}")public void update(Emp emp);

改造后如下

    <update id="update2">update mybatis.emp<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{dept_id},</if><if test="updateTime != null">update_time = #{updateTime},</if> </set></update>
  • <if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
  • <where>:只用于在子元素有内容的情况下才插入where子句,而且会自动取出子句的开头的AND 或 OR
  • <set>:动态的在行首插入set关键字,会删除额外的逗号(用于update中)

8.2 foreach语句

如果想要删除多个员工数据的话,就可以使用foreach语句进行遍历
例如:

    <delete id="deleteById">delete from mybatis.emp where id in<foreach collection="ids" item="id"  open="(" separator="," close=")">#{id}</foreach></delete>

测试如下:传入11,12,13,14

    @Testpublic void testDeleteById(){List<Integer> ids = Arrays.asList(11,12,13,14);empMapper.deleteById(ids);return ;}

然后实际执行的sql语句如下:

delete from mybatis.emp where id in(11,12,13,14)
属性含义
collection要遍历的集合
item遍历出来的元素
separator分隔符
open遍历开始前拼接的片段
close遍历结束后的拼接的片段

8.3 sql/include语句

在查找中不建议使用select * ,会降低代码效率,但是输入全部字段的话,也会有大量重复的,所以 使用<sql>定义相同的SQL,并且设定唯一标识,使用<include>调用这个唯一标识即可
在这里插入图片描述

在这里插入图片描述
实现效果如下:

    <sql id="selectAll">select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_timefrom mybatis.emp</sql><!--     条件查询员工--><select id="list" resultType="com.itzhangxx.Pojo.Emp"><include refid="selectAll"></include><where><if test="name != null">name like concat('%', '#{name}', '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select>

重点规范:

  • XML映射文件的名称与Mapper接口名称保持一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  • XML映射文件的namespace属性为Mapper接口全限定名一致
  • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
语句含义
<if>用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL
<where>只用于在子元素有内容的情况下才插入where子句,而且会自动取出子句的开头的AND 或 OR
<set>动态的在行首插入set关键字,会删除额外的逗号(用于update中)
<foreach>按照规范进行遍历
<sql>使用<sql>定义相同的SQL,并且设定唯一标识
<include>使用中按照唯一标识进行调用定义的SQL

小结

写本文主要是为了分享我的学习过程,也是给自己记个笔记,哪里忘记了,回来再看一眼,也可以很快的回想起来

相关文章:

第十五篇:Mybatis

文章目录 一、什么是MyBatis二、Mybatis入门案例三、配置SQL提示四、数据库连接池四、lombok五、mybatis基础操作5.1 根据id删除5.2 预编译SQL5.3 新增员工5.4 更新员工5.5 查询员工&#xff08;用于页面回显&#xff09;5.6 条件查询 七、XML映射文件八、动态SQL8.1 if语句8.2…...

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…...

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程&#xff0c;就是利用 JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化&#xff08;还原&#xff09;js对象&#xff1b;序列化的作用是存储和传输。&#xff08…...

RabbitMQ在云原生环境中部署和应用实践

一、RabbitMQ和云原生技术的关系 RabbitMQ是一种开源的、实现了先进的消息队列协议&#xff08;AMQP&#xff09;的消息队列软件。而云原生技术就是为在公共云、私有云以及其他各种云环境提供应用的一种方法。RabbitMQ和云原生技术在分布式系统和微服务架构中都起到了关键作用…...

flask 后端 + 微信小程序和网页两种前端:调用硬件(相机和录音)和上传至服务器

选择 flask 作为后端&#xff0c;因为后续还需要深度学习模型&#xff0c;python 语言最适配&#xff1b;而 flask 框架轻、学习成本低&#xff0c;所以选 flask 作为后端框架。 微信小程序封装了调用手机硬件的 api&#xff0c;通过它来调用手机的摄像头、录音机&#xff0c;…...

蓝桥杯嵌入式(G431)备赛笔记——ADC+LCD

目录 题目要求&#xff08;真题&#xff09;&#xff1a; cubeMX配置&#xff1a; 小试牛刀&#xff1a; Keil代码&#xff1a; 效果演示&#xff1a; 题目要求&#xff08;真题&#xff09;&#xff1a; 使用第十一届第二场真题&#xff0c;练习ADC波部分的代码 cubeMX配…...

最近公共祖先(LCA)

题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以…...

ABBYY FineReader15免费电脑OCR图片文字识别软件

产品介绍&#xff1a;ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术&#xff0c;能够识别…...

2024年第十七届 认证杯 网络挑战赛 (A题)| 保暖纤维的保暖能力 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (A题&#xff09;&#xff01…...

算法训练营第37天|LeetCode 738.单调递增的数字 968.监控二叉树

LeetCode 738.单调递增的数字 题目链接&#xff1a; LeetCode 738.单调递增的数字 解题思路&#xff1a; 从后向前遍历&#xff0c;当不满足递增条件时&#xff0c;当前位置赋值为9&#xff0c;前一位减一。之后记录不满足位置&#xff0c;将后续全部赋值为9. 代码&#x…...

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …...

大恒相机-程序异常退出后显示被占用

心跳时间代表多久向相机发送一次心跳包&#xff0c;如果超时则设备会认为断开了&#xff0c;停止工作并主动释放占用资源。 在相机打开后添加代码&#xff1a; #ifdef _DEBUG//设置心跳超时时间 3sObjFeatureControlPtr->GetIntFeature("GevHeartbeatTimeout")-&…...

头歌-机器学习 第16次实验 EM算法

第1关:极大似然估计 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握: 什么是极大似然估计; 极大似然估计的原理; 极大似然估计的计算方法。 什么是极大似然估计 没有接触过或者没有听过”极大似然估计“的同学…...

电脑启动引导的两种方式

电脑启动引导的两种方式 电脑启动引导有两种方式&#xff1a;Legacy 传统模式 和 UEFI 新型模式。 一、Legacy&#xff1a;指 主板的 传统的 BIOS 传输模式引导启动加载操作系统。 1.只支持 MBR 分区表&#xff0c;支持 32位和64位操作系统&#xff08;如&#xff1a;winXP&…...

用php编写网站源码的一些经验

一、var_dump()函数 var_dump()函数在有页面跳转的情况下会看不到信息。因为 var_dump()函数输出信息默认显示到本页面。因此要看到var_dump()函数的输出&#xff0c;在有页面跳转时&#xff0c;需要将页面跳转改成显示本页面。 放在var_dump()函数里的变量如果是空值&#x…...

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息

背景&#xff1a; 统计信息在计算引擎的优化器模块中经常被提及&#xff0c;尤其是在基于成本成本优化&#xff08;CBO&#xff09;框架中统计信息发挥着至关重要的作用。CBO旨在通过评估执行查询的可能方法&#xff0c;并选择最有效的执行计划来提高查询性能。而统计信息则提…...

视频图像的两种表示方式YUV与RGB(4)

本篇主要讲YUV与RGB之间的转换&#xff0c;包括YUV444 颜色编码格式 转为 RGB 格式 &#xff0c;RGB颜色编码格式转为 YUV444 格式。 一、 YUV与RGB之间的转换 YUV与RGB颜色格式之间进行转换时 , 涉及一系列的数学运算 ; YUV 颜色编码格式转为RGB格式的转换公式 取决于 于 YUV …...

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…...

分布式数据库中间件 Mycat 和 ShardingSphere 对比

Mycat 和 ShardingSphere 都是流行的分布式数据库中间件&#xff0c;都可以用于实现数据分片、读写分离和分布式事务等功能&#xff0c;但它们在设计理念、特点和功能实现上有一些区别 1. 设计理念&#xff1a; Mycat&#xff1a; 基于 MySQL 协议的代理式架构&#xff0c;主要…...

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…...

Torch-Pruning支持神经辐射场(NERF):3D重建模型压缩终极指南

Torch-Pruning支持神经辐射场(NERF)&#xff1a;3D重建模型压缩终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning 神…...

SDXL 1.0电影级绘图工坊真实案例:文化遗产数字化重建与风格复原实践

SDXL 1.0电影级绘图工坊真实案例&#xff1a;文化遗产数字化重建与风格复原实践 想象一下&#xff0c;你面前有一张因年代久远而模糊不清的古建筑照片&#xff0c;或是仅存于文字描述中的历史场景。如何将它们清晰地、生动地、甚至以不同艺术风格再现出来&#xff1f;这曾是考…...

OWL ADVENTURE应用场景解析:如何用AI助手提升工作效率

OWL ADVENTURE应用场景解析&#xff1a;如何用AI助手提升工作效率 1. 为什么选择OWL ADVENTURE作为AI助手 在当今快节奏的工作环境中&#xff0c;我们每天都要处理大量视觉信息——从产品图片到数据图表&#xff0c;从设计稿到文档扫描件。传统的工作流程往往需要人工逐一查看…...

MogFace人脸检测模型-WebUI详细步骤:如何通过service_ctl.sh管理服务生命周期

MogFace人脸检测模型-WebUI详细步骤&#xff1a;如何通过service_ctl.sh管理服务生命周期 1. 服务管理工具介绍 MogFace人脸检测服务提供了一个强大的管理工具service_ctl.sh&#xff0c;这个脚本让你能够轻松控制服务的整个生命周期。无论你是需要启动、停止、重启服务&…...

4步打造高效能开源路由器:OpenWrt固件安装指南

4步打造高效能开源路由器&#xff1a;OpenWrt固件安装指南 【免费下载链接】openwrt openwrt编译更新库X86-R2C-R2S-R4S-R5S-N1-小米MI系列等多机型全部适配OTA自动升级 项目地址: https://gitcode.com/GitHub_Trending/openwrt5/openwrt OpenWrt固件安装是提升R5S设备性…...

OpenClaw硬件控制实验:ollama-QwQ-32B通过串口操控智能家居

OpenClaw硬件控制实验&#xff1a;ollama-QwQ-32B通过串口操控智能家居 1. 为什么选择OpenClaw做硬件控制 去年冬天的一个深夜&#xff0c;我被空调定时关闭后冻醒的经历&#xff0c;让我开始思考如何让AI真正理解物理世界。传统智能家居App的固定场景模式已经不能满足我的需…...

手把手教你解决MMLab中ImportError: cannot import name ‘set_random_seed‘错误

深度解析MMLab中set_random_seed导入错误的本质与系统化解决方案 当你第一次在MMLab生态中遇到ImportError: cannot import name set_random_seed from mmdet.apis这个错误时&#xff0c;可能会感到困惑和沮丧。这个看似简单的导入错误背后&#xff0c;实际上反映了开源计算机视…...

避坑指南:OpenClaw连接Qwen3-32B镜像的5大常见错误

避坑指南&#xff1a;OpenClaw连接Qwen3-32B镜像的5大常见错误 1. 为什么连接Qwen3-32B镜像容易踩坑&#xff1f; 上周我在本地尝试用OpenClaw对接Qwen3-32B镜像时&#xff0c;经历了从满怀期待到怀疑人生的全过程。本以为有了官方镜像就能一键连通&#xff0c;结果从环境配置…...

OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手

OpenClaw儿童模式&#xff1a;基于百川2-13B打造家长控制的作业辅导助手 1. 为什么需要AI作业辅导助手&#xff1f; 作为两个小学生的家长&#xff0c;我深刻体会到辅导作业的"痛"。每天晚上检查数学题、批改作文、讲解错题的过程&#xff0c;常常让亲子关系变得紧…...

League-Toolkit:基于LCU API的英雄联盟本地化效率工具集

League-Toolkit&#xff1a;基于LCU API的英雄联盟本地化效率工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的…...