当前位置: 首页 > 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...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...