第十五篇: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

小结

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

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

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

相关文章

(学习日记)2024.04.12:UCOSIII第四十节:软件定时器函数接口讲解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

JavaScript_语法--变量

1.4 变量 变量&#xff1a;一小块存储数据的内存空间 Java语言是强类型语言&#xff0c;而JavaScript是弱类型的语言 强类型&#xff1a; 在开辟变量存储空间时&#xff0c;定义了空间将来存储的数据的数据类型。只能存储固定类型的数据 弱类型&#xff1a; 在开辟变量存储空间…

VS中使用QT的UI提升类时,找不到头文件的情况

1、情况简述 在使用VS时&#xff0c;会发现与QCreator存在一些差异。最主要的就是要设置很多东西&#xff0c;如果不配置的话&#xff0c;就会遇到一些问题。下面我分享下我调试过程中遇到的一个问题。使用Qdesigner的UI提升类时&#xff0c;找不到头文件的情况&#xff1a; …

Kivy 学习2

from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Colorclass FloatLayoutApp(App):def build(self):def update_rect(layout, *args):设置背景尺寸&#xff0c;可忽略layout…

Spring Cloud学习笔记:Eureka简介,Eureka简单样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 [TOC](目录)1、Eureka 1.1、架构 Eureka是SpringCloud Nexflix的核心子模块&#xff0c;其中包含Server和Client。 Server提供服务注册&#xff0c;存储所有可用服务节点。 Client用于简化和Server的通讯复杂…

【学习心得】Python中的queue模块使用

一、Queue模块的知识点思维导图 二、Queue模块常用函数介绍 queue模块是内置的&#xff0c;不需要安装直接导入就可以了。 &#xff08;1&#xff09;创建一个Queue对象 import queue# 创建一个队列实例 q queue.Queue(maxsize20) # 可选参数&#xff0c;默认为无限大&am…

物理随机接入信道PRACH数据生成

NR随机接入前导码&#xff08;Preamble&#xff09;采用Zadoff Chu序列&#xff0c;长度分别为839和139。 物理随机接入信道&#xff08;PRACH&#xff09;前导码格式的定义包括PRACH OFDM符号个数、循环前缀&#xff08;CP&#xff09;长度和保护时间&#xff08;GT&#xff…

软件库V1.2版本开源-首页UI优化

iAppV3源码&#xff0c;首页的分类更换成了标签布局&#xff0c;各位可以参考学习&#xff0c;界面名称已经中文标注&#xff01; 老版本和现在的版本还是有较大的区别的&#xff0c;建议更新一下&#xff01; 新版本改动界面如下&#xff1a; 1、首页.iyu&#xff1a;分类按…

Windows:Redis数据库图形化中文工具软件——RESP(3)

这个是用于连接redis数据库的软件工具&#xff0c;安装在windows上的图形化界面&#xff0c;并且支持中文&#xff0c;是在github上的一个项目 1.获取安装包 发布 lework/RedisDesktopManager-Windows (github.com)https://github.com/lework/RedisDesktopManager-Windows/rel…

Java复习第十八天学习笔记(MVC,三层架构,分页),附有道云笔记链接

【有道云笔记】十八 4.4 MVC模式、三层架构、分页 https://note.youdao.com/s/PRQ62OUV 一、MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c; 用一种业务…

C++ 为什么不能在构造函数中调用虚函数

最近在Clion编辑器中看到构造函数中调用虚函数提示&#xff1a; Do not invoke virtual member functions from constructor 这里记录一下为什么不能在构造函数中调用虚函数。 #include <iostream> #include <string>using namespace std;class BaseClass {publi…

超越ChatGPT,国内快速访问的强大 AI 工具 Claude

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

2024年第十七届 认证杯 网络挑战赛 (C题)| 云中的海盐 | 辐射传输方程 Stefan-Boltzmann分析 |数学建模完整代码+建模过程全解全析

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

SQL Serve---查询

概要 1、order by子句 —默认asc&#xff08;升序&#xff09;、desc&#xff08;降序&#xff09; 2、distinct关键字 3、group by子句 4、聚合函数 —max()、min()、sum()、avg()、count() 5、having子句 6、compute子句 英文关键字 order by 排序 asc…

【无标题】nodejs+mogoodb数据库写注册接口

描述 本篇文章主要记录使用nodejs express搭建服务器&#xff0c;并链接mogoodb数据来书写简单的后台接口&#xff1b;前端项目使用的vue2的一个酒店管理项目。阅读本文章&#xff0c;可以了解如何连接mogoodb数据库&#xff0c;和一些对数据库进行操作的命令。前端如何进行跨…

二分查找-图文详解,看不懂你来打我。。。

一、查找算法 在计算机科学和算法领域&#xff0c;搜索是一项基本的任务。在海量数据中寻找特定的元素是一项常见的任务&#xff0c;而二分查找&#xff08;Binary Search&#xff09;是一种非常高效的搜索算法&#xff0c;特别适用于有序数组。 二、二分查找 二分查找是一种…

Java日期正则表达式(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于正则匹配&#xff0c;在项目实战中运用比较广泛 原先写过一版Python相关的&#xff1a;ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例&#xff1a; 年-月-日&a…

React复习全攻略:浅尝Redux的全局滋味

是什么? Redux 是一个使用叫做 “action” 的事件来管理和更新应用状态的模式和工具库 提供全局状态数据的单一仓库&#xff08;对象树&#xff09;&#xff0c;管理应用的全局状态单一数据源&#xff0c;状态只读&#xff0c;状态修改只由纯函数完成 为什么用&#xff08;特点…

关于游戏当中击退/击飞效果的制作

关于游戏当中击退/击飞效果的制作 在游戏当中我们免不了会有一些炫酷的效果&#xff0c;特别是RPG游戏&#xff0c;比如放一个技能&#xff0c;直接大范围杀伤&#xff0c;然后把敌人全部击飞或者击退&#xff0c;那效果真的很舒服。把自己想象成武林高手&#xff0c;一套江湖…

常用的深度学习自动标注软件

0. 简介 自动标注软件是一个非常节省人力资源的操作&#xff0c;而随着深度学习的发展&#xff0c;这些自动化标定软件也越来越多。本文章将会着重介绍其中比较经典的自动标注软件 1. AutoLabelImg AutoLabelImg 除了labelimg的初始功能外&#xff0c;额外包含十多种辅助标注…