MyBatis(JavaEE进阶系列4)

news2024/11/24 16:31:24

目录

前言:

1.MyBatis是什么

2.为什么要学习MyBatis框架

3.MyBatis框架的搭建

3.1添加MyBatis框架

3.2设置MyBatis配置

4.根据MyBatis写法完成数据库的操作

5.MyBatis里面的增删改查操作

5.1插入语句

5.2修改语句

5.3delete语句

5.4查询语句

5.5like查询

5.6MyBatis注解方式实现多表查询

6.动态SQL的使用

6.1<if>标签

6.2<trim>标签

6.3<where>标签

6.4<set>标签

6.5<foreach>标签

结束语:


前言:

在前几节中小编重点与大家分享了有关于Spring Boot和Spring MVC的相关的一些基础知识,那么接下来小编就与大讲解一下有关于MyBatis的一些基础知识,那么经过前期的学习中让我们知道了在Spring中的一些基础操作,那么接下来我们就需要学习有关于如何将前端传递的数据保存起来,或者是查询数据库里面的一些数据。

1.MyBatis是什么

MyBatis是一款优秀的持久层框架它支持自定义的SQL、存储过程以及高级映射。它的底层是基于JDBC的,通过它可以实现更加简单的数据库的操作。MyBatis去除了几乎所有JDBC代码以及设置参数和获取结果集的工作,MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。简单来说MyBatis是更简单完成程序和数据库交互的工具,也就是更加简单的操作和读取数据库工具。大家也可以参考一下MyBatis的官网的定义☞https://mybatis.org/mybatis-3/zh/index.html

2.为什么要学习MyBatis框架

对于后端开发来说,程序是由以下两个重要的部分组成的:

  • 后端程序
  • 数据库

而这两个重要的组成部分要通讯就要依靠数据库连接工具,那数据库连接工具有哪些呢?比如我们之前学习的JDBC,还有我们现在介绍的MyBatis,那么既然我们以及有了JDBC了为什么我们还要学习MyBatis呢?我们先来回顾一下我们之前学习JDBC的时候是怎么连接数据库的。

  1. 创建数据库连接池DataSource。
  2. 通过DataSource获取数据库连接Connection。
  3. 编写执行带,占位符的SQL语句。
  4. 通过Connection及SQL创建操作命令对象Statement。
  5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值。
  6. 使用Statement执行SQL语句。
  7. 查询操作:返回结果集ResultSet,更新操作:返回更新的数量。
  8. 处理结果集。
  9. 释放资源。

你会发现JDBC的操作步骤太过于繁琐了,所以我们就有了MyBatis,这就会让我们操作数据库的时候更加快捷方便。

3.MyBatis框架的搭建

3.1添加MyBatis框架

创建一个Spring MVC的项目,和我们之前创建的步骤一样,只不过在添加依赖的时候多了下面两个。

注意:新建MyBatis启动时报错时正常的,因为未设置要连接的具体MySQL的详细信息。

3.2设置MyBatis配置

①数据库相关的连接

# 设置数据库的相关连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/myblog2023_10_06?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注意:如果使用 mysql-connector-java 是 5.x 之前的使用的是“ com.mysql.jdbc.Driver ” ,如果是大于 5.x 使用的是“ com.mysql.cj.jdbc.Driver ” 。

②xml保存路径和命名格式

# 设置 MyBatis XML 存放路径和命名格式
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
# 配置 MyBatis 执行时打印 SQL(可选配置)
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.example.demo=debug

注意:里面的配置项的信息有些是需要根据自己的数据库来进行改动的。 

上述的常用配置大家可以去我的Gitee中自行获取:配置文件: spring中的一些配置文件 

4.根据MyBatis写法完成数据库的操作

在我们对数据库进行操作之前我们先来创建一个数据库。

如下Sql语句所示:

-- 创建数据库
drop database if exists myblog2023_10_06;
create database myblog2023_10_06 DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
use myblog2023_10_06;

-- 创建表[⽤户表]
drop table if exists userinfo;
create table userinfo(
 id int primary key auto_increment,
 username varchar(100) not null,
 password varchar(32) not null,
 photo varchar(500) default '',
 createtime datetime default now(),
 updatetime datetime default now(),
 `state` int default 1
) default charset 'utf8mb4';

-- 创建⽂章表
drop table if exists articleinfo;
create table articleinfo(
 id int primary key auto_increment,
 title varchar(100) not null,
 content text not null,
 createtime datetime default now(),
 updatetime datetime default now(),
 uid int not null,
 rcount int not null default 1,
 `state` int default 1
)default charset 'utf8mb4';

-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(
 vid int primary key,
 `title` varchar(250),
 `url` varchar(1000),
createtime datetime default now(),
updatetime datetime default now(),
 uid int
)default charset 'utf8mb4';
-- 添加⼀个⽤户信息
INSERT INTO myblog2023_10_06.userinfo (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1)
;
-- ⽂章添加测试数据
insert into articleinfo(title,content,uid)
 values('Java','Java正⽂',1);

-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://ww
w.baidu.com',1);

那么根据MyBatis写法完成数据的操作常规写法包含了两个文件:

  • 接口:方法的声明(给其他层调用)。
  • XML:实现接口。

那么接下来我们就按照上述的两步来编写一下查询全部用户信息的代码。

①定义接口

②使用XML实现接口

 接下来我们就写一个测试,来进行测试。

测试代码展示:

package com.example.demo.dao;

import com.example.demo.model.Userinfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
@SpringBootTest //不可以省略,告诉当前的测试程序,目前项目是运行在Spring Boot容器中的
class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    void getAll() {
        List<Userinfo> list = userMapper.getAll();
        System.out.println(list);
    }
}

结果展示:

这里注意一定要在测试代码中加上@SpringBootTest注解,否决就会报以下的错误。

当然在MyBatis中国也可以传递参数来查询。

如下所示:

定义接口:

这里使用注解@Param来表明传入的参数。 

编写XML:

这里接收参数的时候使用${参数名}或者是也可以使用#{参数名} 的方式来进行参数的传递。

那么这里使用这两个的区别是什么呢?

使用${参数名}的方式是对其进行了及时执行。

而使用#{参数名}的方式是对其进行了预执行。

它的优点在于可以防止SQL注入,是安全的。

所以 ${参数名} VS #{参数名} 的区别在于:

  • ${}是直接替换;#{}是预执行。
  • ${}是不安全的存在SQL注入的风险;而#{}是安全的,不存在SQL注的风险。

那么${}可以实现的功能#{}都可以实现,并且${}还有SQL注入的风险,为什么还存在${}的写法呢?
这里就要提到${}的使用场景了,当业务中需要传递SQL命令的时候,就只能使用${}不能使用#{}了。但是他也有使用中的注意事项:如果要使用${},那么传递的参数一定要能被穷举,否则是不可以使用的。

测试代码:

结果展示:

大家也可以和小编一样使用MyBatis的一个插件MyBatisX,这样就可以更加方便的实现XML和对应接口之间的跳转了。

以上就是MyBatis的一个简单的使用案例了。

接下来当我们熟悉了MyBatis的基本使用方法之后我们就来继续探讨一下MyBatis的其他使用方式。

5.MyBatis里面的增删改查操作

接下来我们来实现一下用户信息的增加、删除和修改的操作,对应使用MyBatis的标签如下所示:

  • <insert>标签:插入语句。
  • <updata>标签:修改语句。
  • <delete>标签:删除语句。
  • <select>标签:查询操作。

具体的操作我们来看下面。

5.1插入语句

<insert>标签:插入语句。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

当然我们也可以在数据库中看到插入的数据信息。

当然在编写插入操作的SQL语句的时候还有一些属性可以使用如下所示:

解释:

  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys ⽅法来取出由数据库内部⽣成的主键(⽐如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的⾃动递增字段)默认值:false。 特殊的添加:返回⾃增 id
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果⽣成列不⽌⼀个,可以⽤逗号分隔多个属性名称。

5.2修改语句

<updata>标签:修改语句。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

在数据库中查看数据的修改情况。

5.3delete语句

<delete>标签:删除语句。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

数据库中的表现:

5.4查询语句

<select>标签:查询操作。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

和我之前在XML中编写方式不同的点是这里我们使用了<resultMap>标签。

当类中的属性和数据库表中的字段名不一致时,那么查询的结果为null,解决方案:

  1. 将类中的属性和表中的字段名保持一致(最简单的解决方法)。
  2. 使用SQL语句中的as进行列名的重命名,让列名等于属性名。
  3. 定义一个resultMap,将属性名和字段名进行手动映射。

5.5like查询

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

5.6MyBatis注解方式实现多表查询

我们先来重新定义一个实体类。

package com.example.demo.model;

import lombok.Data;

import java.time.LocalDateTime;

@Data
public class Articleinfo {
    private int id;
    private String title;
    private String content;
    private LocalDateTime createtime;
    private LocalDateTime updatetime;
    private int uid;
    private int rcount;
    private int state;
}

①定义接口并使用@Select注解进行SQL语句的编写

②编写测试代码

③测试结果展示

使用注解最大的优点就是不需要我们在编写程序的时候跳来跳去了。

6.动态SQL的使用

动态SQL是MyBatis的强大特征之一,它能够完成不同条件下的不同SQL的拼接。

6.1<if>标签

在有些业务场景下会有必填字段和非必填字段,那么如果有些字段是不确定的字段传入,此时程序又该怎么实现呢?接下来就需要使用if标签来进行判断了,在if标签中有一个属性是test属性,它用来判断这个字段是否是需要填写的字段,如果是填写的字段则进行添加操作,如果不是则不进行添加。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

6.2<trim>标签

在之前的插入用户的功能中,只有一个sex字段可能是选填项,如果所有字段都是非必填项,就考虑使用<trim>标签结合<if>标签,对多个字段都采取动态生成的方式。

在<trim>标签中有以下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀 。
  • suffix:表示整个语句块,以suffix的值作为后缀 。
  • prefixOverrides:表示整个语句块要去除掉的前缀 。
  • suffixOverrides:表示整个语句块要去除掉的后缀。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

6.3<where>标签

当传入的用户对象需要根据属性做where条件查询时,此时我们就需要在SQL语句后面拼接上一句where条件查询语句,那么<where>标签就可以很好的做到,当需要进行条件查询的时候我们就在后面进行拼接,如果不需要的时候就不会拼接。具体我们来看下面的例子。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

当然这里我们在编写XML里面的SQL语句的时候也可以将其换成<trim>搭配<if>标签,也会达到同样的效果,如下所示:

 

6.4<set>标签

根据传入的用户对象属性来更新用户数据,可以使用<set>标签来指定动态内容,具体操作如下所示。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

6.5<foreach>标签

对集合进⾏遍历时可以使⽤该标签。<foreach>标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象 。
  • item:遍历时的每⼀个对象 。
  • open:语句块开头的字符串 。
  • close:语句块结束的字符串 。
  • separator:每次遍历之间间隔的字符串。

①定义接口

②编写XML中的SQL语句

③编写测试代码

④测试结果展示

结束语:

好了这节小编就给大分享到这里啦,希望这节对大家有关于MyBatis的基础知识的了解有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

【广州华锐互动】动物解剖学AR互动学习平台

增强现实&#xff08;AR&#xff09;是一种将虚拟信息叠加到现实世界中的技术。通过智能手机、平板电脑或AR眼镜等设备&#xff0c;AR技术可以创建出逼真的虚拟物体&#xff0c;这些物体可以与现实世界的环境相互交互。 AR技术在教育领域的应用非常广泛&#xff0c;包括历史、科…

【redis学习笔记】分布式锁

什么是分布式锁 以往的锁都是只能在当前进程中⽣效, 在分布式的这 种多个进程多个主机的场景下就⽆能为⼒了。 因此提供分布式锁&#xff0c;加锁就是往redis上设置一个特殊的key:value&#xff0c;完成操作后&#xff0c;释放锁就是删除这个key:value&#xff1b;其他服务器尝…

数据结构——多重链表的实现

//多重列表的实现 #include<stdio.h> #include<stdlib.h> struct lnode {int row,col,value; }; //没有用到down指针 //没有用到tag和next指针 typedef struct node {int tag;//区分头结点(0)和非零元素结点(1)struct node* right;struct node* down;//共用体与结…

达梦数据库 视图 错误 [22003]: 数据溢出

今天通过DBeaver连接访问达梦数据库的一个视图&#xff0c;报错&#xff1a;错误 [22003]: 数据溢出 经过分析&#xff0c;原因是视图字段的数据类型和原表的数据类型不一致造成的

加密密钥应用范围及特点优势分析

加密密钥是一种用于保护数据和信息安全的重要工具。它通过在数据传输和存储过程中对数据进行加密&#xff0c;使得未经授权的人无法访问和解读数据。加密密钥的应用范围广泛&#xff0c;包括网络通信、电子商务、金融交易、数据存储等领域。安策将对加密密钥的应用范围和特点优…

AP2400 LED电源驱动 降压恒流IC 机场灯 指示灯 交通照明灯

产品描述 AP2400 是一款 PWM 工作模式,高效率、外围简单、外驱功率管&#xff0c;适用于 5-100V输入的高精度降压 LED 恒流驱动芯片。外驱 MOS&#xff0c;最大输出电流可达 6A。AP2400 可实现三段功能切换&#xff0c;通过MODE1/2/3 切换三种功能模式&#xff1a;全亮&#xf…

PyQt5配置踩坑

安装步骤比较简单&#xff0c;这里只说一下我踩的坑&#xff0c;以及希望一些大佬可以给点建议。 一、QtDesigner 这个配置比较简单&#xff0c;直接就能用&#xff0c;我的配置如下图&#xff1a; C:\Users\lenovo\AppData\Roaming\Python\Python311\site-packages\qt5_app…

数据结构——排序算法(C语言)

本篇将详细讲一下以下排序算法&#xff1a; 直接插入排序希尔排序选择排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某写关键字的大小&#xff0c;按照递增或递减0排列起来的操作。 稳定性的概念…

海外网红营销:打造热门短视频的秘诀

在当今数字化时代&#xff0c;短视频已成为社交媒体上最热门的内容形式之一。无论是TikTok、Instagram、YouTube还是其他平台&#xff0c;短视频都吸引了海内外网红和品牌的注意。本文将详细探讨海外网红营销中如何打造爆款短视频&#xff0c;以便帮助品牌在竞争激烈的市场中脱…

一些常见分布-正态分布、对数正态分布、伽马分布、卡方分布、t分布、F分布等

目录 正态分布 对数正态分布 伽马分布 伽马函数 贝塔函数 伽马分布 卡方分布 F分布 t分布 附录 参考文献 本文主要介绍一些常见的分布&#xff0c;包括正态分布、对数正态分布、伽马分布、卡方分布、F分布、t分布。给出了分布的定义&#xff0c;推导了概率密度函数&…

Python实现JavaScript中AES加密有关填充问题

1. 先展示一下JS端的格式&#xff08;没找到没混淆的。。。&#xff0c;将就看吧&#xff09; 2. 在python加密中是没有选择填充模式的&#xff0c;需要自己来填充 3. 对加密不懂的朋友可能跟我一样刚开始很懵逼&#xff0c;因为遇到的基本都是pksc7填充模式&#xff0c;但是网…

解析图片文件格式

图片文件幻数 关于JPEG格式 二进制形式打开文件&#xff0c;文件开始字节为FF D8&#xff0c;文件结束两字节为FF D9 JPEG 文件有两种不同的元数据格式&#xff1a;JFIF 和 EXIF。 JFIF 以 ff d8 ff e0 开头&#xff0c;EXIF 以 ff d8 ff e1 开头。 代码示例 private static…

Visual Studio自定义模板参数、备注

模板路径&#xff1a; VS2022 x64&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplatesVS2022 x86&#xff1a;C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\ItemTemplates 一、声明和启用模板…

六、循环表达式

6.1 循环表达式语法 thymeleaf使用th:each属性可以对数组&#xff0c;集合进行循环&#xff0c;此属性用在容器元素上&#xff0c;循环生成子元素。 语法 th:each"循环出的元素 , 循环状态 : 集合或数组" .6.2、数组的循环 示例 在TestServlet中定义一个数组 …

Vue中如何进行自定义动画与动画效果设计(如CSS动画、Web动画)

当我们构建现代的Web应用程序时&#xff0c;动画和过渡效果变得越来越重要。它们可以增强用户体验&#xff0c;使用户界面更具吸引力&#xff0c;并帮助用户更好地理解应用程序的功能。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了许多强大的工具和功能&#xff0c;使…

大数据技术标准推进委员会发布《地球大数据白皮书(2023年)》

导读 地球大数据的应用领域范围广阔&#xff0c;包括生态保护、自然资源管理、气象服务、城市规划、应急容灾等方面&#xff0c;但目前仍处于发展初期&#xff0c;面临着数据来源、结构多样&#xff0c;数据管理门槛高&#xff0c;数据应用场景复杂、落地方法论较少等痛点。如…

Linux系统常用指令篇---(三)

Linux系统常用指令篇—(三) 1.tree指令 ​ tree这条指令需要安装,不是自带就有的. 安装指令:yum -y install tree作用: ​ 以树状图的形式展开目录 2.which指令 which命令用于查找文件 指令在本质上就是可执行程序,因此也属于文件 3.cp指令 语法&#xff1a; cp [选项] …

【力扣每日一题】2023.10.7 股票价格跨度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示不同时间的股票的价格&#xff0c;要我们按照顺序返回每天的股票价格跨度&#xff0c;价格跨度就是股票价格小于或等于…

如何批量获取京东商品详情数据,京东商品详情API接口

批量获取京东商品详情数据可以通过京东开放平台接口来实现。 首先&#xff0c;您需要在京东开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的App Key和App Secret等信息。然后&#xff0c;使用获取到的App Key和App Secret进行签名和认证&#xff0c;获取Access…

前后端分离计算机毕设项目之基于SpringBoot的旅游网站的设计与实现《内含源码+文档+部署教程》

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…