当前位置: 首页 > news >正文

【MyBatis 学习一】认识MyBatis 第一个MyBatis查询

目录

一、认识MyBatis

1、MyBatis是什么?

2、为什么要学习MyBatis?

二、配置MyBatis环境

1、建库与建表

2、创建新项目 

3、xml文件配置

(1)配置数据库连接

(2)配置 MyBatis 中的 XML 路径

三、测试:第一个MyBatis查询

1、用户实体类User:和数据库属性对应

2、添加mapper接口

3、添加UserMapper.xml

4、自行测试

5、添加 Service

6、添加Controller 


一、认识MyBatis

1、MyBatis是什么?

        MyBatis是一个持久层框架,(持久:支持数据存在硬盘上),MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作,可以通过简单的 XML 或注解来完成MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。之前的Spring是让Java代码更简单。

问题1:MyBatis和Spring的关系?

           MyBatis和Spring没有任何关系!如果非要有关系,就是Spring集成了MyBatis框架。就相当于我们之前的举例:Spring是高铁,那么MyBatis就是高铁的APP订餐系统,高铁只是集成了这个订餐框架,更加方便我们的出行,没有高铁订餐系统也可以在其他平台使用,所以两者之间并没有什么关系,MyBatis可以脱离Spring使用。

2、为什么要学习MyBatis?

        对于后端开发来说,程序是由以下两个重要的部分组成的:后端程序+数据库。⽽它两要建立连接,就要依靠数据库连接⼯具,我们学习的 JDBC,还有MyBatis都是,那已经有了 JDBC 了,为什么还要学习 MyBatis?这是因为 JDBC 的操作太繁琐了。

之前的JDBC代码流程:(非常繁琐)

1. 创建数据库连接池 DataSource;
2. 通过 DataSource 获取数据库连接 Connection;
3. 编写要执⾏带 ? 占位符的 SQL 语句;(√)
4. 通过 Connection 及 SQL 创建操作命令对象 Statement;
5. 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值;(√)
6. 使⽤ Statement 执⾏ SQL 语句;
7. 查询操作:返回结果集 ResultSet,更新操作:返回更新的数量;
8. 处理结果集;(√)
9. 释放资源。
        现在MyBatis,其中sql语句,传参,处理结果集这几步需要自己实现(可以写在Java代码中,也可以写在MyBatis配置文件中)可以帮助我们更⽅便、更快速的操作数据库。不过MyBatis底层还是依赖数据库连接的。

问题2:MyBatis与数据库的关系?

        MyBatis与数据库也没有关系!MyBatis是让数据库的连接操作更简单,但是并不是数据库。MyBatis是程序和数据库的桥梁。MyBatis提供了一个接口访问数据库,接口只是方法的定义,具体的自己要实现,主要通过xml文件实现(注解也可以实现)。


二、配置MyBatis环境

1、建库与建表

-- 创建数据库
drop database if exists myBatis_db;
create database myBatis_db DEFAULT CHARACTER SET utf8mb4;-- 使⽤数据数据
use myBatis_db;-- 创建表[⽤户表]
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'-- 插入数据
INSERT INTO `myBatis_db`.`userinfo` (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'root', 'root', '', '2023-7-23 17:10:48', '2023-7-23 17:10:48', 1)
;
-- 查询表
select * from userInfo;

2、创建新项目 

注意

 注意:可以新创建项目引入这些包,但是如果已经是一个老项目了,我没有安装SQL的包,可以通过安装插件实现。

 右键:generate

 

 

3、xml文件配置

(1)配置数据库连接

# 数据库连接配置
spring:datasource:url: jdbc:mysql://localhost:3306/myBatis_db?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

(2)配置 MyBatis 中的 XML 路径

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml#Spring打印SQL日志configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

同时在resource文件下建立一个新文件夹:mapper。


三、测试:第一个MyBatis查询

 按照下⾯的流程来实现 MyBatis 查询所有⽤户的功能。

1、用户实体类User:和数据库属性对应

@Data
public class User {private Integer Id;private String username;private String password;private String photo;private Date createTime;private Date updateTime;
}

2、添加mapper接口

数据持久层的接⼝定义。

(1)是Inteferce接口;

(2)接口上方加@Mapper注解;

(3)实现接口中的方法。

@Mapper
public interface UserMapper {//定义接口:查询数据库内容public abstract List<User> queryAll();}

3、添加UserMapper.xml

数据持久成的实现,mybatis 的固定 xml 格式。同时写UserMapper.xml 查询所有⽤户的具体实现 SQL。

(1)<mapper>标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定名,包括全包名.类名。namespace下的是UserMapper,表示实现哪个接口
(2)模板文件,自定义sql语句,queryAll表示实现的是接口中的哪个方法。sql语句为查询就写select,写id和resultType,id是接口中的方法名,表示对接⼝的具体实现⽅法;resultType是返回结果的类型:表示返回的是一个User对象。<select>查询标签:是⽤来执⾏数据库的查询操作的。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="demo1.mapper.UserMapper">
<!--表示实现的是demo1下的UserMapper接口--><select id="queryAll" resultType="demo1.model.User">select * from userinfo</select>
<!--id是方法名,resultType是返回的结果:返回的是一个User对象-->
</mapper>

4、自行测试

(1)将光标定在接口定义UserMapper的{ }里面,右键generate选择test,勾选queryAll方法。加上@SpringBootTest注解;

(2)通过@Autowired将UserMapper注入进来;

(3)查询方法上加@Test注解。

@Slf4j
@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid queryAll() {List<User> users = userMapper.queryAll();log.info(users.toString());}
}

点击测试方法上面的运行按钮,得到查询结果。 

测试通过之后,我们就可以将其应用到具体项目中了,继续下面的步骤。

5、添加 Service

服务层实现代码如下:

@Service
public class UserService {@Resourceprivate UserMapper userMapper;public List<User> queryAll(){return userMapper.queryAll();}
}

6、添加Controller 

@RestController
@RequestMapping("/web")
public class UserController {@Resourceprivate UserService userService;@RequestMapping("/queryAll")public List<User> queryAll(){return userService.queryAll();}
}

url测试通过。 


 希望自己能够更加淡定从容~说不定有一条生活也会给你一个很大的惊喜呢?😁

相关文章:

【MyBatis 学习一】认识MyBatis 第一个MyBatis查询

目录 一、认识MyBatis 1、MyBatis是什么&#xff1f; 2、为什么要学习MyBatis? 二、配置MyBatis环境 1、建库与建表 2、创建新项目 3、xml文件配置 &#xff08;1&#xff09;配置数据库连接 &#xff08;2&#xff09;配置 MyBatis 中的 XML 路径 三、测试&#x…...

TCP 和 UDP

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; 是面向连接的协议&#xff0c;即在收发数据前&#xff0c;必须和对方建立可靠的连接&#xff0c;TCP的头部为20个字节。 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协…...

springboot配置自定义数据源(Druid德鲁伊)的步骤。

今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤。 方法一&#xff1a; 1.在pom.xml配置依赖(注释里面的内容) 2.配置自己的数据源设置&#xff0c;我是在yaml文件中配置的&#xff0c;顺便提醒一下&#xff0c;在配置yaml文件的时候缩进问题一定要注意…...

K8S:容器日志收集与管理

Kubernetes 里面对容器日志的处理方式&#xff0c;都叫作 cluster-level-logging&#xff0c;即&#xff1a;这个日志处理系统&#xff0c;与容器、Pod 以及 Node 的生命周期都是完全无关的。这种设计当然是为了保证&#xff0c;无论是容器挂了、Pod 被删除&#xff0c;甚至节点…...

Flutter系列文章-Flutter进阶

在前两篇文章中&#xff0c;我们已经了解了Flutter的基础知识&#xff0c;包括Flutter的设计理念、框架结构、Widget系统、基础Widgets以及布局。在本文中&#xff0c;我们将进一步探讨Flutter的高级主题&#xff0c;包括处理用户交互、创建动画、访问网络数据等等。为了更好地…...

【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式

文章目录 1. 右值引用和移动语义1.1 左值引用和右值引用1.2 左值引用和右值引用的比较1.3右值引用的使用场景和意义1.4 左值引用和右值引用的深入使用场景分析1.5 完美转发1.5.1 万能引用1.5.2 完美转发 2. 新的类功能2.1 默认成员函数2.2 类成员变量初始化2.3 强制生成默认函数…...

rust学习-线程

Rust 标准库只提供了 1:1 线程模型 Rust 是较为底层的语言&#xff0c;如果愿意牺牲性能来换取抽象&#xff0c;以获得对线程运行更精细的控制及更低的上下文切换成本&#xff0c;使用实现了 M:N 线程模型的 crate 示例 use std::thread; use std::time::Duration;fn main() …...

题目:2180.统计各位数字之和为偶数的整数个数

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2180. 统计各位数字之和为偶数的整数个数 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 暴力遍历即可。 解题代码&#xff1a; class Solution {public int countEven(int num) {int re…...

3dsmax制作一个机器人

文章目录 建模身子&#xff1a;眼睛&#xff1a;头饰&#xff1a;肩膀手臂腿调整细节 渲染导出objMarmoset Toolbag 3.08渲染给眼睛添加材质&#xff0c;设置为自发光添加背景灯光 建模 身子&#xff1a; 眼睛&#xff1a; 头饰&#xff1a; 肩膀 手臂 腿 调整细节 渲染 导出…...

C++的类型转换运算符:reinterpret_cast

C的类型转换运算符&#xff1a;reinterpret_cast reinterpret_cast 是 C 中与 C 风格类型转换最接近的类型转换运算符。它让程序员能够将一种对象类型转换为另一种&#xff0c;不管它们是否相关&#xff1b;也就是说&#xff0c;它使用如下所示的语法强制重新解释类型&#xf…...

flask中的cookies介绍

flask中的cookies介绍 “Cookie” 在 web 开发中是一种非常重要的技术&#xff0c;用于在客户端&#xff08;即用户的浏览器&#xff09;存储信息&#xff0c;以便在多个页面和多个访问会话之间保持状态。Cookies 通常用于记住用户的登录信息&#xff0c;跟踪用户在站点上的浏…...

adnroid 11. 0 Activity启动流程图解

从Launcher到ActivityTaskManager 从ActivityTaskManagerService 到 ApplicationThread 从ApplicationThread到onCreate...

了解Unity编辑器之组件篇Physics(四)

Physics&#xff1a;用于处理物理仿真和碰撞检测。它提供了一组功能强大的工具和算法&#xff0c;用于模拟真实世界中的物理行为&#xff0c;使游戏或应用程序更加真实和可信。 主要用途包括&#xff1a; 碰撞检测&#xff1a;Unity Physics 提供了高效的碰撞检测算法&#x…...

“数字中华 点亮未来”中华线上客户节 盛大开幕

2023年是中华保险数字化转型落地之年&#xff0c;峥嵘37载&#xff0c;中华保险在数字化转型上已经涌现了一批彰显辨识度、具有影响力的应用成果。7月15日&#xff0c;中华保险围绕数字化转型之路开展以“数字中华 点亮未来”为主题的37周年线上客户节活动&#xff0c;倾力打造…...

中文分词入门:使用IK分词器进行文本分词(附Java代码示例)

1. 介绍 中文分词是将连续的中文文本切分成一个个独立的词语的过程&#xff0c;是中文文本处理的基础。IK分词器是一个高效准确的中文分词工具&#xff0c;采用了"正向最大匹配"算法&#xff0c;并提供了丰富的功能和可定制选项。 2. IK分词器的特点 细粒度和颗粒…...

CTFSHOW web 信息收集

web入门的刷题 web1 教我们多看看源代码 web2 抓包 web3 抓包 web4 robots.txt robots.txt web5 phps源代码泄露 phps 就是php的源代码 用户无法访问 php 只可以通过phps来访问 web6 源代码备份 web7 git web8 svn web9 swp /index.php.swp web10 cookie web11 查域名…...

速锐得开发社区-新一代汽车网络通信技术CAN FD的特点归纳

随着汽车工业的快速发展&#xff0c;汽车逐渐走向智能化&#xff0c;功能也越来越丰富&#xff0c;例如特斯拉、比亚迪、理想汽车为代表&#xff0c;在车载导航、驻车雷达、胎压监测、倒车影像、无钥匙启动、定速巡航、自动泊车、高级辅助驾驶系统、自动驾驶、域控制器、智能网…...

Android adb shell 查看App内存(java堆内存/vss虚拟内存/详细的内存状况/内存快照hprof)和系统可用内存

1.adb shell 获取app 进程的pid adb shell "ps|grep com.xxx包名"根据某个渠道包&#xff0c;去查询对应的pid&#xff0c;如下所示&#xff1a; 2.通过adb shell 查看设备的java dalvik 堆内存的最大值 执行命令行&#xff1a; adb shell getprop dalvik.vm.h…...

java篇 类的进阶0x0A:万类之祖:Object 类

文章目录 万类之祖&#xff1a;Object 类hashCode() 与 equals()hashCode() 方法equals() 方法 vs. equals()String 的 equals() 为什么要重写 hashCode 和 equals 方法重写&#xff08;覆盖&#xff09;前 hashCode() 和 equals() 的作用什么情况下需要重写&#xff08;覆盖&a…...

AVFoundation - 音频录制

文章目录 需要调用到麦克风方法,别忘记添加 Privacy - Microphone Usage Description @interface AudioRecorder ()<AVAudioRecorderDelegate>@property (strong, nonatomic) AVAudioRecorder *recorder;@end@implementation AudioRecorder- (void...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...