MyBatis 初识简单操作

前言

上一期我们讲完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=falseusername: rootpassword: abc123driver-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.rhkb.cn/news/291827.html

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

相关文章

vue3封装Element分页

配置当前页 配置每页条数 页面改变、每页条数改变都触发回调 封装分页 Pagination.vue <template><el-paginationbackgroundv-bind"$attrs":page-sizes"pageSizes"v-model:current-page"page"v-model:page-size"pageSize":t…

HarmonyOS 应用开发之Stage模型绑定FA模型ServiceAbility

本小节介绍Stage模型的两种应用组件如何绑定FA模型ServiceAbility组件。 UIAbility关联访问ServiceAbility UIAbility关联访问ServiceAbility和UIAbility关联访问ServiceExtensionAbility的方式完全相同。 import common from ohos.app.ability.common; import hilog from o…

Unity-通过AB包使用SpriteAtlas图集(基于unity2018)

项目遇到了一个性能问题&#xff0c;需要优化UI。其中就涉及UI的合批问题&#xff0c;其中自然而然就会关联到图集的概念。旧版图集&#xff0c;Legacy Atlas&#xff0c;还没有太研究。今天主要看一下SpriteAtlas怎么使用的。 因为我们项目资源工程和Runtime是分离的&#xf…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起&#xff0c;想写两篇文章来拿个卷吧&#xff0c;今天也是又来写一篇博客了&#xff0c;也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己&#xff0c;所以要给自己的努力留下足迹。 为今天努力的自己打个卡&#xff0c;留个痕迹吧 2024.03.30 小闭…

2024年度第五届全国大学生算法设计与编程挑战赛(春季赛)(测试赛A~B)

B. IMissYou! 求和输出就行了&#xff0c;字符串容易看走眼打错&#xff0c;直接复制题目的。 #include <bits/stdc.h> //#define int long long #define per(i,j,k) for(int (i)(j);(i)<(k);(i)) #define rep(i,j,k) for(int (i)(j);(i)>(k);--(i)) #define deb…

Unity -- 遮挡剔除

很多童鞋的Unity作品完成后&#xff0c;发现场景卡的要死&#xff0c;尽管在模型阶段采用了很多优化建模方法&#xff0c;但还是卡顿。电脑端都这么卡&#xff0c;发布到移动端就更不用说了。遇到这种情况&#xff0c;很多童鞋急得团团转&#xff0c;不知如何是好。此时&#x…

【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)

组合数学 数位排序 【问题描述】 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如,2022 排在 409 前面, 因为 2022 的数位之和是 6,小于 409 的数位 之和 13。…

(完结)Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(三)项目优化

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第&#xff08;三&#xff09;章——项目优化&#xff0c;本篇将讲解该项目最后的优化部分以及一些压测知识点 本章目录 一、压力测试-高并发优化前后的性能对比1.压力测试相关…

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…

【送书福利第六期】:《AI绘画教程:Midjourney使用方法与技巧从入门到精通》

文章目录 一、《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》二、内容介绍三、作者介绍&#x1f324;️粉丝福利 一、《AI绘画教程&#xff1a;Midjourney使用方法与技巧从入门到精通》 一本书读懂Midjourney绘画&#xff0c;让创意更简单&#xff0c;让设计…

Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理

我用navicat连接我的阿里云服务器的mysql服务器的时候,出现了1130的报错。&#xff08;mysql Server version: 5.7.42-0ubuntu0.18.04.1 (Ubuntu)&#xff09; 我来记录一下这个原因&#xff0c;以及修改过程&#xff01; 1.首先进入mysql -u root -p&#xff0c; mysql客户端…

车辆充电桩管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 1. 前台功能…

命名空间【C++】(超详细)

文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符&#xff1a;&#xff1a; 编译器找一个变量/函数等的定义&#xff0c;寻找域的顺序为什么要有命名空间&#xff1f;1.解决库与程序员定义的同名的重定义问题2.解决程序员…

变分信息瓶颈

变分信息瓶颈和互信息的定义 1 变分信息瓶颈 定义&#xff1a;变分信息瓶颈&#xff08;Variational Information Bottleneck&#xff09;是一种用于学习数据表示的方法&#xff0c;它旨在通过最小化输入和表示之间的互信息来实现数据的压缩和表示学习。这种方法通常用于无监…

pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程

浅尝pnpm monorepo 多包管理方案 &#x1f4a1;tips: 创建pnpm monorope多包管理框架流程 初始化 mkdir taurus & cd taurus pnpm init创建基础文件 创建文件pnpm-workspace.yaml packages:- packages/**创建文件夹packages/ -packages/ -package.json -pnpm-workspace…

Java类与对象:从概念到实践的全景解析!

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;javaSE的修炼之路 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、类的定义格式 在java中定义类时需要用到…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;所有地址均配为公有IP地址。 - 在R5上&#xff0c;将接口配置为公有IP地址&#xff0c;并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b;R2于R5之间…

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

一分钟了解三极管到底放大了什么?

目录 三极管放大原理 三极管的工作状态 截止区 放大区 饱和区 三极管的放大作用 电流放大 电压放大 功率放大 在电子学中&#xff0c;三极管通常用于实现信号放大、开关控制等多种功能&#xff0c;三极管主要功能是放大电流信号。下面&#xff0c;将详细解释三极管放大的原理和…

海格里斯助推实体制造业转型升级 “算法定义硬件”解题AIoT市场

随着自动化的发展&#xff0c;电子商务和智能制造推动了自动化立体仓库的快速发展与创新&#xff0c;产生了“密集仓储”的概念。对于一个实体企业来讲&#xff0c;其数智物流转型正在趋向于“去伪存真”&#xff0c;企业追求高ROI与真实经济价值&#xff0c;具有降本增效的业务…