【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置.

1.基本概念

  • MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis. 2013年11月迁移到Github.
  • 持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是用来操作数据库的.

在这里插入图片描述
简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库工具.

2.相关配置

Maven配置

  • SpringBoot与MyBatis之间的对应关系参考官方网址:https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
  • 我MyBatis用的Maven依赖.
		<!-- MyBatis依赖包 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><!-- mysql驱动包 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

配置数据库连接字符串

  • 如果是application.yml文件, 配置内容如下:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 120348driver-class-name: com.mysql.cj.jdbc.Driver


如果使用 MySQL 是 5.x 之前的使用的是"com.mysql.jdbc.Driver",如果是大于 5.x 使用的是“com.mysql.cj.jdbc.Driver

  • 如果是application.properties文件, 配置内容如下:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root

打印日志配置

  • 该项配置可以看到SQL执行内容, 以及传递参数和执行结果
    在这里插入图片描述
    ①: 查询语句
    ②: 传递参数及类型
    ③: SQL执行结果
mybatis:configuration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.单元测试

  • 在Test目录下创建要测试的类的名称, 测试类上添加了注解 @SpringBootTest,该测试类在运行时,就会自动加载Spring的运行环境.我们通过@Autowired这个注解, 注⼊我们要测试的类, 就可以开始进行测试了

使用 Idea 自动生成测试类

  1. 在需要测试的Mapper接口中, 右键 -> Generate -> Test
    在这里插入图片描述

  2. 选择要测试的方法, 点击 OK
    在这里插入图片描述

  3. 书写测试代码

二.MyBatis的注解实现.

2.1.1 传参的细节.

  • 先来看两个用注解实现的MyBatis语句:
@Insert("insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})")Integer insertUserInfo(UserInfo userInfo);
@Insert("insert into userInfo (username,password,age,gender) values (#{userInfo.username},#{userInfo.password},#{userInfo.age},#{userInfo.gender})")Integer insertUserInfo2(@Param("userInfo") UserInfo userInfo);
  • 在第一种的实现方式中,传参的时候,就可以直接读取userInfo对应的属性来完成赋值.而第二种方法则是将userInfo当作一个整体的对象,需要" . "出所需要的属性.

2.2.1增.

  • Mapper接口代码:
@Insert("insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})")Integer insertUserInfo(UserInfo userInfo);
  • 生成对应的测试代码:
@Testvoid insertUserInfo() {UserInfo userInfo = new UserInfo();userInfo.setAge(18);userInfo.setGender(1);userInfo.setPassword("zhangsan");userInfo.setUsername("zhangsan2");Integer i = userInfoMapper.insertUserInfo(userInfo);System.out.println(i);}
  • 运行结果:
    在这里插入图片描述
  • 对应数据库的变化:
    在这里插入图片描述

2.2.2删.

  • Mapper接口代码:
@Delete("delete from userInfo where id = #{id}")
Integer deleteUserInfoById(Integer id);
  • 生成对应的测试代码:
@Testvoid deleteUserInfoById() {Integer i = userInfoMapper.deleteUserInfoById(11);System.out.println(i);}
  • 运行结果:
    在这里插入图片描述
  • 对应数据库的变化:
    在这里插入图片描述

2.2.3改.

  • Mapper接口代码:
@Update("update userInfo set password = #{password} ,age = #{age},gender = #{gender} where id = #{id}")Integer updateUserInfo(UserInfo userInfo);
  • 生成对应的测试代码:
@Testvoid updateUserInfo() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(100);userInfo.setGender(2);userInfo.setPassword("963852");Integer i = userInfoMapper.updateUserInfo(userInfo);System.out.println(i);}
  • 运行结果:
    在这里插入图片描述

  • 对应数据库的变化:
    在这里插入图片描述

2.2.4查.

  • Mapper接口代码:
@Select("select * from userInfo where delete_flag = #{deleteFlag}")public List<UserInfo> getUserInfoByDeleteFlag(Integer deleteFlag);
  • 生成对应的测试代码:
@Testvoid getUserInfoByDeleteFlag() {List<UserInfo> userInfoByDeleteFlag = userInfoMapper.getUserInfoByDeleteFlag(0);System.out.println(userInfoByDeleteFlag);}
  • 运行结果:
    在这里插入图片描述

三.MyBatis的XML配置文件实现.

  • 此步骤需要进行两项设置,数据库连接字符串设置和 MyBatis 的 XML 文件配置。
    application.yml文件, 配置内容如下:
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 120348driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:mybatis/**Mapper.xmlconfiguration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 写持久层代码, 持久层代码分两部分
    1. 方法定义 Interface
    2. 方法实现:XXX.xml
      在这里插入图片描述

在这里插入图片描述

3.1 增.

  • Mapper接口代码:
Integer insert(UserInfo userInfo);
  • 对应的实现xml.
<insert id="insert">insert into userInfo (username,password,age,gender) values (#{username},#{password},#{age},#{gender})</insert>
  • 生成对应的测试代码:
    @Test
    void insert() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername(“tiantian”);
    userInfo.setPassword(“123456”);
    userInfo.setAge(9);
    userInfo.setGender(1);
    userInfoXmlMapper.insert(userInfo);
    }

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

3.2 删.

  • Mapper接口代码:
Integer deleteById(Integer id);
  • 对应的实现xml.
<delete id="deleteById" parameterType="integer">delete from userInfo where id = #{id}</delete>
  • 生成对应的测试代码:
@Testvoid deleteById() {Integer id = 10;Integer i = userInfoXmlMapper.deleteById(id);System.out.println(i);}
  • 运行结果:
    在这里插入图片描述

3.1 改.

  • Mapper接口代码:
Integer updateById(UserInfo userInfo);
  • 对应的实现xml.
<update id="updateById">update userInfo set age = #{age} where id = #{id}</update>
  • 生成对应的测试代码:
@Testvoid updateById() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(99);userInfoXmlMapper.updateById(userInfo);}
  • 运行结果:
    在这里插入图片描述

3.1 查.

  • Mapper接口代码:
List<UserInfo> selectAll();
  • 对应的实现xml.
<select id="selectAll" resultType="com.tuanzi.ssm.springmybatis.model.UserInfo">select * from userInfo</select>
  • 生成对应的测试代码:
@Testvoid selectAll() {List<UserInfo> list = userInfoXmlMapper.selectAll();System.out.println(list);}
  • 运行结果:
    在这里插入图片描述

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

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

相关文章

.net core webapi跨域

var builder WebApplication.CreateBuilder(args);// Add services to the container. // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();//此处1 …

13 RTP包的使用

RTP RTP包最主要的就是Sequence number。 对于发送者来说&#xff0c;视频的每一个帧都有很多包组成。对于接收端来接收的时候是有一个队列进行接收的。这个队列大小都是通过计算的。有了队列之后就会不断的往队列中插入数据。当队列中有的数据超时一直组不成包的时候&#xf…

STM32 UART串口与RTOS的结合使用

STM32 UART串口与RTOS的结合使用 摘要&#xff1a; 实时操作系统&#xff08;RTOS&#xff09;为嵌入式系统提供了多任务处理和实时性能。STM32微控制器结合RTOS&#xff0c;可以有效地管理串口通信任务&#xff0c;提高系统的响应速度和稳定性。本文将探讨STM32 UART串口与RT…

MacOS升级ruby版本

MacOS自带ruby版本是2.x&#xff0c;可以通过“ruby -v”查看版本号 $ ruby -v ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin22]homebrew安装的ruby版本号可以通过“brew info ruby”命令参看 $ brew info ruby > ruby: stable 3.3.2 (bottled)…

深度学习的可微渲染

深度学习的可微渲染 可微渲染&#xff08;Differentiable Rendering&#xff09;是深度学习领域的一个重要概念&#xff0c;它将传统的计算机图形学与深度学习结合起来&#xff0c;通过使渲染过程可微分&#xff08;differentiable&#xff09;&#xff0c;以便于在深度学习模…

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模…

如何使用Pandas处理数据?

一、技术难点 Pandas是Python中一个强大的数据处理和分析库&#xff0c;它提供了高效、灵活且易于使用的数据结构&#xff0c;主要用于数据清洗、转换、聚合和可视化等任务。然而&#xff0c;在使用Pandas处理数据时&#xff0c;也会遇到一些技术难点。 数据导入与导出&#…

Python装饰器:打造强大的日志记录系统

题目:Python装饰器:打造强大的日志记录系统 摘要: 在Python编程中,装饰器是一种强大的工具,它允许我们以一种非常灵活的方式增强函数的功能。本文将详细介绍如何使用装饰器来实现日志记录,这是一种在开发过程中追踪函数调用和执行情况的有效手段。我们将从装饰器的基本…

Go singlefight 源码详解|图解

写在前面 通俗的来说就是 singleflight 将相同的并发请求合并成一个请求&#xff0c;进而减少对下层服务的压力&#xff0c;通常用于解决缓存击穿的问题。 详解 基础结构 golang.org/x/sync/singleflight singleflight结构体&#xff1a; type call struct {wg sync.WaitGro…

Linux系统下非高精度对时实操

测试对时偏差 使用 ntpdate -d 选项, 挑选一个合适的ntp对时地址比如 ntp.tencent.com 或者 time.pool.aliyun.com 使用 /usr/sbin/ntpdate -d ntp.tencent.com, 可以看到如下结果, 其中offset 就代表NTP服务器时间- 系统时间, 所以offset 0.012036 sec 就代表系统时间比NTP服…

[Java] TDengine时序数据库时间戳(timestamp)字段插入数据的实现方法

&#x1f449;原文阅读 目录 &#x1f449;[原文阅读](https://b1ankc-mov.github.io/posts/tdengine_timestamp/) &#x1f4d8;正文开始实体类Mapper接口Controller控制器 &#x1f4d8;正文开始 实体类 定义实体类&#xff0c;插入数据分别代表打卡时间、员工id&#xff0…

如何在WPS中加载EndNote X9插件

如何在WPS中加载EndNote X9插件 步骤1&#xff1a;关闭WPS 确保所有WPS文档和窗口都已关闭。 步骤2&#xff1a;修改文件后缀 打开文件资源管理器&#xff0c;导航到路径&#xff1a;C:\Program Files (x86)\EndNote X9\Product-Support\CWYW。找到文件 Cwyw_X86.dat&#…

正排索引和倒排索引的区别

正排索引和倒排索引是数据库中常见的两种索引方式&#xff0c;它们有以下区别&#xff1a; 1. 数据结构不同&#xff1a;正排索引是按照文档的顺序存储索引&#xff0c;而倒排索引是根据关键词来存储索引。 2. 查询方式不同&#xff1a;正排索引适合按文档顺序进行查询&a…

glibc函数malloc的工作原理

glibc提供了malloc函数来动态分配内存&#xff0c;我们只知道调用malloc会返回给我们一个指针&#xff0c;指向一块内存空间或NULL&#xff0c;那么malloc的工作原理是什么呢&#xff1f; 概述&#xff1a; 1.小于128kB的空间&#xff0c;使用内存池&#xff08;在堆上&#…

高效能光伏监控解决方案 —— ARMxy工业计算机深度解析

在浩瀚的戈壁滩上&#xff0c;一座现代化的光伏电站正沐浴在烈日之下&#xff0c;将无尽的阳光转化为清洁的电能。这背后&#xff0c;离不开一项关键技术的支撑——ARMxy工业计算机&#xff0c;它如同一位智慧的指挥官&#xff0c;精确掌控着这座绿色能源基地的心跳。 面对广袤…

鱼香肉丝ROS一键安装

鱼香肉丝ROS一键安装实际上是指通过特定的脚本和工具&#xff0c;快速地在Ubuntu系统上安装ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;。由于“鱼香肉丝”并非与ROS安装直接相关的术语&#xff0c;我猜测这里可能是对某个特定ROS安装脚本或…

王学岗鸿蒙开发(北向)——————(十三)音乐播放器

AudioRenderer适合录音 AVPlayer:简单的本地单曲播放 MP3文件放置的地方 import media from ohos.multimedia.media import common from ohos.app.ability.common; Entry Component struct Index {//第1步&#xff1a;avPlayer:media.AVPlayer nullasync onPageShow(){//第…

常见的100道java面试题及答案【java学习+面试指南】(五)

消息队列有哪些应用场景&#xff1f; 异步处理、流量控制、服务解耦、消息广播 ZGC收集器中的染色指针有什么用&#xff1f; 染色指针是一种直接将少量额外的信息存储在指针上的技术&#xff0c;可是为什么指针本身也可以存储额外信息呢&#xff1f;在64位系统中&#xff0c…

kafka集成spark

1.新建Scala项目 具体教程可见在idea中创建Scala项目教程-CSDN博客 1.1右键项目名-添加框架支持-勾选scala 1.2main目录下新建scala目录-右键Scala目录-将目录标记为-勾选源代码根目录 1.3创建包com.ljr.spark 1.4引入依赖&#xff08;pox.xml) <dependencies><…

[FreeRTOS 基础知识] 保存现场与恢复现场

文章目录 什么是现场&#xff1f;保存现场的数据存放在哪里&#xff1f;保护现场的场景 什么是现场&#xff1f; 在[FreeRTOS 基础知识] 栈 与 汇编语言文章中解析了fun_c汇编函数&#xff0c;假设在执行fun_c函数的过程中产生高优先级的中断。如下图所示。 此时刚从RAM的SP栈…