MyBatis 初识简单操作

news2024/11/26 12:45:40

前言

上一期我们讲完Spring的配置文件以及日志的设置,这一期我们就来谈谈mybatis操作数据库的一些操作,使用这个框架可以极大地简化JDBC的冗长代码,大大增强了生产力,只需我们提供简单的sql语句以及对应的注解就可以操作数据库

我们说web应用程序主要分为三层 Controller  Service Dao

前两层我们都在之前的文章中谈论过,但是之前我们的底层数据都是使用moke的方式产生的,现在我们就来学习Spring与数据库的交互

废话不多说,我们现在就开始认识一下Mybatis   

回顾JDBC

为了更好的了解java操作数据库的代码操作,我们先回顾一下之前使用JDBC是如何操作数据库的

1.创建数据库连接池

2.使用DataSourse获取数据库连接Connection

3.编写带?占位符的SQL语句

4.通过Connection以及SQL创建操作命令对象statement

5.替换占位符,确定替换的字段类型以及替换的值需要一一对应

6.使用statement执行sql语句

7.查询操作,返回结果集.....

8.处理结果集

9.释放资源

这里我们发现增删改查都有一些共性的代码,比如都需要创建数据库连接池,都需要建立连接,需要使用带占位符的SQL语句等,我们就想能不能用一套注解将其封装起来,这样我们就只需要书写对应的SQL语句以及集合容器就可以获得所有的数据库数据

1.什么是Mybatis

Mybatis是一个优秀的持久层框架,主要用于简化JDBC的开发

首先我们创建一个项目,注意这里记得勾选Mybatis和MySQL的驱动

注意这里项目创建成功会自动在pom文件中导入需要的依赖

注:这里的SpringBoot框架的版本号记得与Mybatis对应

参考网址 MyBatis中文网

2.数据准备

这里我们首先需要创建一个数据库以便测试使用

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 = utf8mp4


插入用户信息

-- 添加⽤⼾信息
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' );

此时我们可以使用可视化工具或者是对应的数据库客户端查看是否插入成功,博主这里使用的是navicat

配置文件设置

  spring:
    datasource:
      url: jdbc:mysql://127.0.0.1:13306/mybatis_test?characterEncoding=utf8&useSSL=false
      username: root
      password: abc123
      driver-class-name: com.mysql.cj.jdbc.Driver

注:这里的数据库以及对应的密码用户,数据库名称都记得修改成自己的,否则会出现报错信息

比如密码错误等等

3.Mybatis实现数据库操作

首先我们想实现一个select*语句

在这之前,我们先得创建一个UserInfo类用来保存每一条数据库信息

@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;
}

1.实现select语句

@Mapper
public interface UserInfoMapper {
    @Select("select * from userinfo")
    List<UserInfo> getUserInfoAll();
}

Mybatis的持久层接口规范主要是叫xxxMapper

@Mapper注解表示是Mybatis中的Mapper接口

程序运行时框架就会自动生成其实现类对象交给SpringIOC管理

这里我们使用一个@Select注解来表示这里需要写一条selct语句

因为这里程序中有多条数据,所以我们使用list集合来装返回的对象数据

我们这里的返回数据测试在test单元测试中测试

在上述接口中按住alt+insert点击test

然后勾上对应的接口

然后再test的文件夹下就会出现对应的测试代码

我们只需要注入对应的对象,执行获取到返回的对象列表打印即可看到数据库中的结果

最后结果如下,点击箭头所指的小三角即可执行

我们可以和数据库中的数据进行对比一下

这里就会发现后面的几个时间选项没有展示出来,这一点我们将在下篇进行讲解

2.打印日志

这里有时候为了对比输入输出参数,我们也是需要打印参数查看的

只需要在yml文件中添加一行打印日志

  mybatis:
    configuration: # 配置打印 MyBatis⽇志
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.参数传递

我们知道其他的语句在写入数据库的时候一定得有传参,所以下面我们来谈谈对参数传递的操作

我们只需要将接口中的方法带有参数,然后和对应的语句中进行参数绑定即可

比如下面我们尝试获取id为2的用户数据

注:如果是使用阿里云虚拟的时候需要使用重命名对应参数与sql中的对应

使用@Parma("")即可修改对应的名称

下面我们来实现对应的增删改查

4.insert

这里和上面的其实是类似的,我们只需要使用对应的

@insert注解即可,我们开始演示

我们发现数据库已经更新了

如果这里使用了重命名,我们需要使用对象.属性来传参

比如

这时候我们就需要使用对象名.属性来传参

5.delete

此时我们将刚刚更新的数据进行删除

使用@Delete注解

这是一开始的数据表状态

执行成功后,我们就成功的将数据表的id=6的信息删除成功了

6.update

和上面一样的操作,这次我们将id为5的数据名称改为赵雷

7.获取自增主键 

我们在数据库中设置的id是自增主键,我们可以尝试获取id

直接获取是不会获取到的

我们可以使用一个注解完成 @Options

可能出现的错误小总结

1.sql错误

2.mysql配置信息错误

3.未配置数据库,没有填写配置信息..

4.数据库名填写错误

5.表不存在或名称填写错误

6.方法名重复

 

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

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

相关文章

使用 golang 以及 Gin 框架,将上传的图片在不保存至本地的情况下添加水印,并上传至阿里云 OSS

正如标题所述&#xff0c;使用golang对上传图片添加水印&#xff0c;以及将图片上传到阿里云OSS&#xff0c;网上一搜索&#xff0c;便有你想要的结果了&#xff0c;可是&#xff0c;他们却先将上传图片添加水印后保存在本地&#xff0c;而后再将添加了水印的图片上传到阿里云O…

SRS OBS利用RTMP协议实现音视频推拉流

参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5运行起来后可以http://localho…

学习笔记——C语言基本概念指针(上)——(7)

今天学习了指针&#xff0c;指针吧理解有点小难&#xff0c;慢慢分析就懂。 在开始学指针之前先回顾一下C语言的数据类型如下图所示: 按照分类分别为&#xff1a; 1->基础数据类型&#xff1a;char &#xff1b;short&#xff1b; int&#xff1b; long&#xff1b; float&…

Platypus 一种集中式的央行数字货币方案

集中式的CBDC&#xff0c;混合使用账户模型和UTXO模型。 角色分类 中央银行&#xff1a;发行货币&#xff0c;交易验证&#xff0c;公开交易日志&#xff0c;防止双花。 不是完全受信任的&#xff0c;假定为会遵守监管要求&#xff0c;但可能会破坏交易隐私&#xff0c;即获…

瑞吉外卖实战学习--5、新增员工功能

新增员工功能 效果图1、开发流程2、页面发送ajax请求,将新增员工的信息以json的形式提交给服务器2.1、在填写信息的时候会发现身份校验比较麻烦,可以在validate中将全局的校验方式去掉,方便填写2.3、看到接口未employee2.4、前端代码分析3、服务器接收到提交的数据并调用ser…

无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写

如果你拥有一台Mac设备&#xff0c;总会遇到尴尬的那一刻——你在Mac上用得好好的移动硬盘怎么都不能被PC识别到。又或者你朋友在PC上用得好好的移动硬盘&#xff0c;连上你的Mac后&#xff0c;Mac里的文件死活就是拷贝不进移动硬盘里。这种坑&#xff0c;相信大多数使用Mac的小…

Linux 基于chrony进行时钟同步方案验证

Linux 基于chrony进行时钟同步方案验证 1. 背景介绍2. 验证过程2.1 追踪配置2.2 追平记录2.2 追平时间换算 3. 疑问和思考3.1 如何统计追踪1s需要花费多长时间&#xff1f; 4. 参考文档 chrony是一个Linux系统中用于时钟同步的工具。它使用NTP&#xff08;网络时间协议&#xf…

【Java常用的API】JDK8相关时间类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

Delphi 12 安卓 部署文件,不支持中文文件名

procedure TForm3.Button1Click(Sender: TObject); var sFileName:string; begin sFileName:TPath.Combine(TPath.GetDocumentsPath,禁止吸烟.wav); showmessage(sFileName); MediaPlayer1.Stop ; MediaPlayer1.FileName: sFileName; MediaPlayer1.Play; end;

c语言:vs2022写一个一元二次方程(包含虚根)

求一元二次方程 的根&#xff0c;通过键盘输入a、b、c&#xff0c;根据△的值输出对应x1和x2的值(保留一位小数)(用if语句完成)。 //一元二次方程的实现 #include <stdio.h> #include <math.h> #include <stdlib.h> int main() {double a, b, c, delta, x1…

商品说明书的制作工具来啦,用这几个就够了!

商品说明书是用户了解产品特性、性能、使用方法的重要途径。一个明确、易懂的商品说明书&#xff0c;可以显著提升用户体验&#xff0c;进而提升产品的销量。但我们都知道&#xff0c;制作一份高质量的说明书并不容易&#xff0c;需要仔细设计、计划和撰写。幸运的是&#xff0…

Python模块与包管理使用pip与virtualenv【第151篇—模块与包管理】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python模块与包管理&#xff1a;使用pip与virtualenv 在Python开发中&#xff0c;模块和包…

【Linux系列】tree和find命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络性能提升10%,ZStack Edge 云原生超融合基于第四代英特尔®至强®可扩展处理器解决方案发布

随着业务模式的逐渐转变、业务架构逐渐变得复杂&#xff0c;同时容器技术的兴起和逐渐成熟&#xff0c;使得Kubernetes、微服务等新潮技术逐步应用于业务应用系统上。 为了充分释放性能、为业务系统提供更高效的运行环境&#xff0c;ZStack Edge 云原生超融合采用了第四代英特尔…

c语言例题,逐个打印数字

今天来分享个比较简单的程序例题&#xff0c;也是比较经典的一个新手例题&#xff0c;逐个打印输入的数字。我们直接从主函数看起&#xff0c;先定义一个num变量&#xff0c;同时变量的类型是unsigned int&#xff0c;这个类型的意思是无符号的整型变量&#xff0c;unsigned&am…

单链表求集合的交集

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

习题2-5 求平方根序列前N项和

本题要求编写程序&#xff0c;计算平方根序列 的前N项之和。可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后两位。题目保证计算结果不…

SD-WAN网络构建要点简述

近年来&#xff0c;SD-WAN已成为企业网络优化的热门选择。SD-WAN代表软件定义广域网&#xff0c;是一种基于软件的网络解决方案&#xff0c;旨在提高企业网络连接的可靠性、安全性和性能。相比传统网络架构&#xff0c;SD-WAN技术通过虚拟化网络通信&#xff0c;利用智能软件和…