MyBatis 框架学习(I)

news2024/9/25 15:25:04

MyBatis 框架学习(I)

文章目录

  • MyBatis 框架学习(I)
    • 1. 介绍
    • 2. 准备&测试
    • 3. MyBatis 注解基础操作
      • 3.1 日志输出
      • 3.2 Insert 操作
      • 3.3 Delete 操作
      • 3.4 Update 操作
      • 3.5 Select 操作
    • 总结

1. 介绍

之前我们学习过利用JDBC操作数据库进行项目开发,但我们发现它操作起来会比较复杂,而MyBatis就是一款简化JDBC操作的优秀持久层框架

持久层:可以理解为进行持久化操作的层,通常指数据访问层(dao),是用来操作数据库

在这里插入图片描述

简单来说MyBatis就是更简单完成程序和数据库交互的框架,也是一个更好操作数据库的工具!

2. 准备&测试

在我们开始MyBatis具体操作之前,我们需要完成环境的配置:

  1. 创建SpringBoot工程、引入相关依赖;
  2. 数据库准备、实体类准备;
  3. 配置MyBatis连接信息;
  4. 创建Mapper接口

先创建SpringBoot项目:

在这里插入图片描述

在创建项目时引入相关驱动依赖,pom.xml就会自动引入这些相关依赖:

在这里插入图片描述

项目创建好后,我们来创建测试用的数据库

-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使⽤数据数据
USE mybatis_test;
-- 创建表[⽤⼾表]
DROP TABLE IF EXISTS userinfo;
CREATE TABLE `userinfo` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `username` VARCHAR ( 127 ) NOT NULL,
 `password` VARCHAR ( 127 ) NOT NULL,
 `age` TINYINT ( 4 ) NOT NULL,
 `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
 `phone` VARCHAR ( 15 ) DEFAULT NULL,
 `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
 `create_time` DATETIME DEFAULT now(),
 `update_time` DATETIME DEFAULT now(),
 PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 
-- 添加⽤⼾信息
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

在这里插入图片描述

同时创建实体类,即该实体类中的属性要与数据库中的字段对应:

import lombok.Data;
import java.util.Date;

@Data
public class UserInfo {
    
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime; 
    private Date updateTime;

}

注:数据库中的字段有时候是多个单词拼接,数据库中使用_分割,在Java中我们使用小驼峰的方式来进行命名

之后配置MyBatis连接信息, MyBaits连接数据库需要配置以下信息:

  • MySQL驱动类
  • 数据库连接的URL
  • 用户名
  • 密码

如果是配置文件是application.properties,代码如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_test // 刚刚创建的表
#连接数据库的用户名
spring.datasource.username=root // 填写自己的用户名
#连接数据库的密码
spring.datasource.password=123456 // 填写自己的密码

如果配置文件是application.yml,代码如下:

# 数据库连接配置 每个空格都不能省略,yml严格要求格式正确
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

最后创建接口,并通过测试类进行测试(测试类Spring在创建时已经给我们配置好,在test目录下,我们只需要根据需求编写相关代码即可,或者右击mapper接口->Generate->Test, 勾选相应mapper方法,然后编写需求代码即可):

package org.example.blog_mybatis.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.example.blog_mybatis.pojo.UserInfo;

import java.util.List;

@Mapper
public interface UserInfoMapper {

    @Select("select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo")
    public List<UserInfo> queryAllUser();
    
}

在这里插入图片描述

这样我们就能通过Mybatis来获取数据库中的信息了!

小技巧:当我们在进行sql语句编写时,有时候字段多起来后我们自己手写可能会出现问题,对此我们可以将数据库引入IDEA,这样当我们编写sql语句时它就会自动为我们提示字段信息

按以下步骤配置:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这样就配置好了,同时它也能自动为我们获取字段信息了:

在这里插入图片描述

3. MyBatis 注解基础操作

对于MyBatis操作数据库的方式有两种,一种的通过注解的方式进行调用,一种是通过xml文件进行调用,对于使用那个没有固定的标准,根据情况选择使用(比较简单的数据库操作可以使用注解,较复杂的操作可以使用xml文件进行动态SQL操作)。xml后面会再开一篇文章进行讲解,本文使用注解的方式进行操作!

3.1 日志输出

上面我们通过println函数打印输出信息来观察数据库操作状态,这样的方式观察起来效果不是很好,对此,我们可以使用MyBatis提供的日志输出来进行观察:

application.properties配置如下:

#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

3.2 Insert 操作

当我们要给数据库中的userinfot表添加一条数据时,它的SQL语句是:

insert into mybatis_test(username, password, age, gender, phone) values ('zhangsan', '111', 18, 1, '123');

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

@Insert("insert into userinfo(username, password, age, gender, phone) values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
void InsertUser(UserInfo userInfo);

在注解中,为了使我们的sql语句的操作条件不为固定值,我们通过方法形参获取需求参数,在注解中我们接收参数的方式是 #{},在括号里传入对应的方法参数

注:

  • 括号中填入的参数要与方法参数的名称相同
  • 如果传入的方法参数是对象的话,填入括号的参数名称与对象的属性相同

编写测试类代码,这里使用自己构建的测试类:

package org.example.blog_mybatis.mapper;

import org.example.blog_mybatis.pojo.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class UserInfoMapperTest {

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void insertUser() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("zhangsan");
        userInfo.setPassword("111");
        userInfo.setAge(18);
        userInfo.setGender(1);
        userInfo.setPhone("123");
        userInfoMapper.InsertUser(userInfo);
    }
}

在这里插入图片描述

在这里插入图片描述

同时我们也可以通过@Param注解给方法参数设置别名,则注解在接收参数时#{}中的内容需要与@Param中的参数一样,如果参数是对象则需要为参数.属性

@Insert("insert into userinfo(username, password, age, gender, phone) values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender}, #{userInfo.phone})")
void InsertUser(@Param("userInfo") UserInfo userInfo);

拓展:

Insert语句默认返回的是受影响的行数,但在有些情况下我们需要获取新插入数据的ID,这时如果我们想要拿到这个自增ID,需要在Mapper接口的方法上添加一个@Options注解:

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into userinfo(username, password, age, gender, phone) values (#{username}, #{password}, #{age}, #{gender}, #{phone})")
void InsertUser(UserInfo userInfo);
  • useGeneratedKeys:这会令MyBatis使用JDBC的getGeneratedKeys方法来取出数据库内部生成的主键,默认为false;
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey子元素设置它的值,默认值:未设置(unset)

编写测试代码:

@Test
void insertUser() {
    UserInfo userInfo = new UserInfo();
    userInfo.setUsername("XiaoMa");
    userInfo.setPassword("111");
    userInfo.setAge(18);
    userInfo.setGender(1);
    userInfo.setPhone("10086");
    Integer count = userInfoMapper.InsertUser(userInfo);
    System.out.println("添加数据条数:" + count + " 数据ID:" + userInfo.getId());
}

在这里插入图片描述

3.3 Delete 操作

当我们要删除数据库中的userinfo表中的一条数据时,它的SQL语句是:

delete from maybatis_test where id = 3;

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

@Delete("delete from userinfo where id = #{id}")
void DeleteUser(Integer id);

编写测试类代码:

@Test
void deleteUser() {
    userInfoMapper.DeleteUser(3);
}

在这里插入图片描述

在这里插入图片描述

3.4 Update 操作

当我们要修改数据库中的userinfo表中的数据时,它的SQL语句是:

update userinfo set username = "zhaoliu", age = "36" where id = 5;

将SQL中的常量替换为动态的参数,在Mapper接口中它的注解为:

@Update("update userinfo set username = #{username}, age = #{age} where id = #{id}")
Integer UpdateUser(UserInfo userInfo);

编写测试类代码:

@Test
void updateUser() {
    UserInfo userInfo = new UserInfo();
    userInfo.setId(5);
    userInfo.setUsername("zhaoliu");
    userInfo.setAge(36);
    userInfoMapper.UpdateUser(userInfo);
}

在这里插入图片描述

在这里插入图片描述

3.5 Select 操作

当我们要查询数据库中的userinfo表中的数据时,它的SQL语句是:

select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo where id = 5;

在Mapper接口中它的注解为:

@Select("select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo where id = #{id}")
UserInfo queryUser(Integer id);

编写测试类代码:

@Test
void queryUser() {
    UserInfo userInfo = userInfoMapper.queryUser(5);
    System.out.println(userInfo);
}

在这里插入图片描述

MyBatis会根据方法返回的结果进行赋值:

若方法用对象UserInfo接收返回结果,MySQL查询出来的数据为一条就会自动赋值给对象;

若方法用集合List接收返回结果,MySQL查询出来的数据若为多条就会自动赋值集合List;

但若MySQL返回的结果为多条数据,却用UserInfo去接收多条数据,则MyBatis就会报错

通过上述查询语句,数据能够被显示出来,但却存在着一些问题:后面三个数的值为null

原因就在于在返回结果时,MyBaits会自动获取结果中返回的列名并在Java类中查找相同名字的属性,若名称相同则会将结果数据赋值给该属性,但是我们的UserInfo中的属性名称为deleteFlag,而数据库中对应的字段名称为delete_flag,两者从名称上看并不相同,则UserInfo中的deleteFlag属性无法被赋到值:

在这里插入图片描述

那怎么解决上面这个问题呢?这里我们开启驼峰命名解决(还有其它方法如起别名,结果映射等,这里使用驼峰命名,只要配置好就能直接使用,方便高效):

通常数据库中使用蛇形命名法进行命名(下划线分割各个单词),而Java属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将map-underscore-to-camel-case设置为true

在配置文件application.properties中加入:

#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true

在这里插入图片描述

这样缺失的数据也能查询到了!

总结

以上就是本文对MyBatis框架学习注解方式的介绍与使用了,接下来也会更新MyBatis框架学习XML的方式的文章,敬请期待!!

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

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

相关文章

Mybatis多表查询和注解开发

文章目录 Mybatis多表查询套路一对一查询一对多查询 注解开发概述相关注解步骤新增主键回填 查询别名映射模糊查询 动态SQL(了解) Mybatis多表查询 套路 基于需求编写SQL语句基于SQL语句的查询结果&#xff0c;分析类与类之间关联(建立实体类和实体类的关联)在映射文件中&…

2024年51cto视频如何提取

2024年51cto视频如何提取出来&#xff0c;本文就教大家如何下载51cto网页上的视频 首先要准备以下工具 小白51cto链接&#xff1a;https://pan.baidu.com/s/1kbsK2w4rjK8VQcSSg_B0aw?pwd1234 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先下载我给大家…

【Linux】破解工具John the Ripper和端口扫描工具NMAP

一、弱口令检测---John the Ripper 1.了解 John the Ripper John the Ripper 是一款开源的密码破解工具&#xff0c;可使用密码字典&#xff08;包含各种密码组合的列表文件&#xff09;来进行暴力破解。 一款密码分析工具&#xff0c;支持字典式的暴力破解通过对shadow文件…

数据结构系列-堆排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 昨天我们实现的堆的搭建&#xff0c;我们今天实现以下堆的排序&#xff0c; 堆的排序的最大的优点就是提高的效率&#xff0c;减小了时间复杂度&#xff0c;在这个里面我们有一个…

YoloV8改进策略:卷积改进|DOConv轻量卷积,即插即用|适用各种场景

摘要 本文使用DOConv卷积&#xff0c;替换YoloV8的常规卷积&#xff0c;轻量高效&#xff0c;即插即用&#xff01;改进方法非常简单。 DO-Conv&#xff08;Depthwise Over-parameterized Convolutional Layer&#xff09;是一种深度过参数化的卷积层&#xff0c;用于提高卷…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引;将文本转换为数字索引序列&#xff0c;方便模型操作。

清华新突破,360°REA重塑多智能体系统:全方位提升复杂任务表现

引言&#xff1a;多智能体系统的新篇章——360REA框架 在多智能体系统的研究领域&#xff0c;最新的进展揭示了一种全新的框架——360REA&#xff08;Reusable Experience Accumulation with 360 Assessment&#xff09;。这一框架的提出&#xff0c;不仅是对现有系统的一次重大…

模块三——二分:704.二分查找

文章目录 前言二分查找算法简介特点学习中的侧重点算法原理模板 题目描述算法原理解法一&#xff1a;暴力解法解法二&#xff1a;二分查找算法算法流程细节问题循环结束的条件为什么是正确的&#xff1f;时间复杂度 代码实现 前言 本系列博客是逐渐深入的过程&#xff0c;建议…

函数的内容

一&#xff0c;概念 封装一份可以被重复执行的代码块&#xff0c;让大量代码重复使用 二&#xff0c;函数使用 大体分两步&#xff1a;声明函数&#xff0c;调用函数 声明函数有关键字&#xff1a;function 函数名&#xff08;&#xff09;{ 函数体 } 为基本格式&#xf…

代码随想录算法训练营第四十八天| 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

题目与题解 198.打家劫舍 题目链接&#xff1a;198.打家劫舍 代码随想录题解&#xff1a;​​​​​​​198.打家劫舍 视频讲解&#xff1a;动态规划&#xff0c;偷不偷这个房间呢&#xff1f;| LeetCode&#xff1a;198.打家劫舍_哔哩哔哩_bilibili 解题思路&#xff1a; 这道…

阿里巴巴Java开发规范——编程规约(3)

# 阿里巴巴Java开发规范——编程规约&#xff08;3&#xff09; 编程规约 &#xff08;四&#xff09; OOP规约 1.【强制】构造方法里面禁止加入任何业务逻辑&#xff0c;如果有初始化逻辑&#xff0c;请放在 init 方法中 这条编程规范的目的是为了保持代码的清晰性、可读性…

非计算机专业考软考高项有必要吗?

我认为这非常重要。 看了你的介绍&#xff0c;如果你已经考取了会计证书&#xff0c;而且想要考取计算机专业的证书&#xff0c;或者你的职业规划涉及到计算机岗位&#xff0c;又或者你对计算机感兴趣&#xff0c;我建议你优先考虑软考&#xff0c;因为这个证书的含金量是有保…

问题带来多少成长,看你挖得有多深多痛

原文: 一次Redis访问超时的“捉虫”之旅 力是相互的&#xff0c;成长与痛苦也是相互的。 01-引言 最近在对一个老项目使用的docker镜像版本升级过程中碰到一个奇怪的问题&#xff0c;发现项目升级到高版本镜像后&#xff0c;访问Redis会出现很多超时错误&#xff0c;而降回之…

【数学建模】虫子追击问题(仿真)

已知 有四个虫子,分别是 A , B , C , D A,B,C,D A,B,C,D A , B , C , D A,B,C,D A,B,C,D分别在 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) , ( 1 , 0 ) (0,0),(0,1),(1,1),(1,0) (0,0),(0,1),(1,1),(1,0)四个虫子A追B&#xff0c;B追C&#xff0c;C追D&#xff0c;D追A四个速度相同 …

XTuner 微调 LLM:1.8B、多模态、Agent——笔记

XTuner 微调 LLM&#xff1a;1.8B、多模态、Agent——笔记 一、Finetune 简介1.1、两种 Finetune 范式1.2、一条数据的一生1.2.1、标准格式数据1.2.2、添加对话模板1.2.3、LoRA & QLoRA 二、XTuner2.1、XTuner 简介2.2、LLaMA-Factory vs XTuner2.3、XTuner 数据引擎2.3.1、…

【InternLM 实战营第二期笔记04】XTuner微调LLM:1.8B、多模态、Agent

一、微调的原因 大模型微调&#xff08;Fine-tuning&#xff09;的原因主要有以下几点&#xff1a; 适应特定任务&#xff1a;预训练的大模型往往是在大量通用数据上训练的&#xff0c;虽然具有强大的表示学习能力&#xff0c;但可能并不直接适用于特定的下游任务。通过微调&…

低代码新时代:6款免费开发平台助你畅行编码之路

本篇文章为您介绍的六款免费又好用的低代码开发平台有&#xff1a;Zoho creator、Baserow、OS.bee、nuBuilder、JHipster、Appian。 一、Zoho creator Zoho Creator是一款国际化的低代码开发平台&#xff0c;有超17年低代码经验。近些年&#xff0c;Zoho Creator以其成本低、国…

一键还原精灵 V12.1.405.701 装机版

网盘下载 个人版&#xff1a;不划分分区不修改分区表及MBR&#xff0c;安装非常安全&#xff0c;备份文件自动隐藏&#xff0c;不适用于WIN98系统。 装机版&#xff1a;需用PQMAGIC划分分区作隐藏的备份分区&#xff0c;安装过程中有一定的风险&#xff0c;安装后就非常安全。…

基于SpringBoot的宠物领养网站管理系统

基于SpringBootVue的宠物领养网站管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宠物领养 宠物救助站 宠物论坛 登录界面 管理员界面 摘要 基于Spr…

[RTOS 学习记录] 复杂工程项目的管理

[RTOS 学习记录] 复杂工程项目的管理 这篇文章是我阅读《嵌入式实时操作系统μCOS-II原理及应用》后的读书笔记&#xff0c;记录目的是为了个人后续回顾复习使用。 前置内容&#xff1a; 工程管理工具make及makefile 文章目录 1 批处理文件与makefile的综合使用1.1 批处理文件…