MyBatis入门(上)---初识

news2025/1/13 6:05:37

        在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao . 之前的案例中,请求流程如下: 浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调⽤ Service进⾏业务逻辑处理, Service再调⽤Dao, 但是Dao层的数据是Mock的, 真实的数据应该从数据库中读取. 我们学习MySQL数据库时,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了,所以我们要学习MyBatis的真正原因,它可以帮助我们更方便、更快速的操作数据库。

1. 什么是MyBatis

1、MyBatis是一块优秀的持久层框架,用于简化JDBC的开发

2、MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache迁移到了google code,并且改名为MyBaits。2013年11月迁移到Github。

3、官网:MyBatis中文网

4、持久层:指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的

        MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具 ;

2. MyBatis入门

        MyBatis操作数据库的步骤:

1、准备工作(创建Spring Boot工程、数据库表准备、实体类)。

2、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)。

3、编写SQL语句(注解 / XML)。

4、测试。

2.1 准备工作

2.1.1 创建工程

        创建Spring Boot 工程,并且导入MyBatis的起步依赖、MySQL驱动包。

         MyBatis是一个持久层框架,具体的数据存储和数据操作还是在MySQL中操作的,所以需要添加MySQL驱动。项目工程创建完成后,会自动在pom.xml文件中导入MyBatis依赖和MySQL驱动依赖,如图:

         它们的版本会随着SpringBoot版本发生变化,SpringBoot 3.X 对应 MyBatis版本为 3.X,对应关系参考:mybatis-spring-boot-autoconfigure – Introduction ,如图:

2.1.2 数据准备

        1、创建用户表,sql代码如下:

drop database if exists mybaties_test_0822;

create database mybaties_test_0822 default character set utf8mb4;

use mybaties_test_0822;
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 mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'shangjialu', '111111', 18, 1, '15809211621' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'shenmengyao', '222222', 18, 2, '18612340002' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'yuanyiqi', '333333', 18, 2, '18612340003' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zuojinyuan', '555555', 18, 2, '18612340004' );

        2、  创建对应的实体类,代码如下:

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

 2.2. 配置数据库连接字符串

        MyBatis中要连接数据库,需要数据库相关的参数配置:MySQL驱动类、登录名、密码、数据库连接字符串。

        application.yml文件,配置内容如下

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybaties_test_0822?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: ******
    driver-class-name: com.mysql.cj.jdbc.Driver

          application.properties文件,配置内容如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybaties_test_0822?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=******

2.3 写持久层代码

        在项目中,创建持久层接口UserInfoMapper,如图:

代码如下:

package com.example.zxslzw_mybaties.mapper;

import com.example.zxslzw_mybaties.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

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

        Mybatis的持久层接⼝规范⼀般都叫 XxxMapper :

        @Mapper注解:表⽰是MyBatis中的Mapper接⼝ :程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理 ;

        @Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容;

2.4 单元测试

        在Spring Boot工程下中,src下的test目录中,已经自动帮我们创建好了测试类,我们可以直接使用这个测试类来进行测试,代码如下:

package com.example.zxslzw_mybaties.mapper;

import com.example.zxslzw_mybaties.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoMapperTest {

    @Autowired
    private UserInfoMapper userInfoMapper;
    @Test
    void getUserInfoAll() {
        List<UserInfo> userInfos = userInfoMapper.getUserInfoAll();
        System.out.println(userInfos);
    }
}

          测试类添加了注解@SpringBootTest,该测试类在运行时,就会自动加载Spring的运行环境。我们通过@Autowired这个注解,注入我们要测试的类,就可以开始进行测试了

        运行结果如下:

        返回对应的结果,可以看到,只有SQL语句中查询的列中,只有和对应的列名一样,才会有显示(如果和数据库列名一样,就会有显示对应的信息;如果不一样,就不会显示对应信息的正确消息)。如图: 

2.4.1 使用IDEA自动成成测试类

        在你要测试的类中,鼠标右键 -> Generate -> Test -> 勾上对应要测试的方法,这里使用UserInfoMapper类做演示,如图:

          点击OK,会在test目录下生成对应的测试类,如图:

         测试类代码如下:

package com.example.zxslzw_mybaties.mapper;

import com.example.zxslzw_mybaties.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

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

 2.4.2 使用程序运行代码

        编写controller类,service类, controller类代码如下:

package com.example.zxslzw_mybaties.controller;

import com.example.zxslzw_mybaties.model.UserInfo;
import com.example.zxslzw_mybaties.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/getUserAll")
    public List<UserInfo> getUserAll() {
        return userService.getUserAll();
    }
}

  service类代码如下:

package com.example.zxslzw_mybaties.service;

import com.example.zxslzw_mybaties.mapper.UserInfoMapper;
import com.example.zxslzw_mybaties.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    public List<UserInfo> getUserAll() {
        return userInfoMapper.getUserInfoAll();
    }
}

浏览器访问127.0.0.1:8080/user/getUserAll:

ps:本文的内容到这里就结束了,如果对你有所帮助的话,就请一键三连哦!!!

--------------------------------

上嘉路 

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

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

相关文章

[C++]set和map的介绍及使用

关于set和map的接口函数部分&#xff0c;只重点介绍一些相较于别的容器有特殊地方的接口&#xff0c;set和map的接口可以触类旁通。 一、概念 &#xff08;一&#xff09;、关联式容器 关联式容器存储的元素是一个个的键值对<key,value>。通过键&#xff08;key&#x…

多线程中常见问题

1、为什么不建议使用Executors来创建线程池&#xff1f; 除开有可能造成的OOM外&#xff0c;使用Executors来创建线程池也不能自定义线程的名字&#xff0c;不利于排查问题&#xff0c;所以建议是直接使用ThreadPoolExecutor来定义线程池&#xff0c;这样可以灵活控制 2、线程…

队列操作(深入理解FreeRTOS队列之队列实战)

文章目录 一、队列的操作二、学习总结 在FreeRTOS中&#xff0c;队列的本质是环形缓冲区。 一、队列的操作 1、创建队列 2、写队列 3、读队列 详细可看此篇博客&#xff1a;FreeRTOS——队列&#xff08;基于百问网DshanMCU-F103实现挡球板游戏改造&#xff09;-CSDN博客 基…

css之grid布局(网格布局)

简述&#xff1a; 网格布局顾名思义就是将元素呈现为网状的整齐布局 简单使用&#xff1a; <div><div class"test"><div class"item">1</div><div class"item">2</div><div class"item">…

开发一个免费的图表网站 Free Charts

Free Charts 项目背景 最近在使用图表网站时&#xff0c;发现许多都需要收费&#xff0c;因此萌生了自己做一个免费图表网站的想法。 不仅给自己做一个&#xff0c;也准备给大家做一个&#xff01; 项目历程 经过两三周的努力&#xff0c;完成了一个图表网站。以下是技术栈的…

Tomcat热加载和热部署

2. Tomcat热加载和热部署 在项目开发过程中&#xff0c;经常要改动Java/JSP 文件&#xff0c;但是又不想重新启动Tomcat&#xff0c;有两种方式:热加载和热部署。热部署表示重新部署应⽤&#xff0c;它的执行主体是Host。 热加载表示重新加载class&#xff0c;它的执行主体是C…

视频文件太大怎么变小?教你学会快速压缩

视频文件太大怎么变小&#xff1f;在数字时代&#xff0c;视频已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作汇报、学习资料、还是休闲娱乐&#xff0c;视频都扮演着重要角色。但高清视频往往占用了大量的存储空间&#xff0c;还可能在分享或上传时遇到诸多不便…

语雀:高效记录与整理编程学习笔记的最佳实践

目录 语雀&#xff1a;高效记录与整理编程学习笔记的最佳实践 一、编程学习笔记的要求与目的 二、记录编程学习笔记的目的 三、如何高效地记录与整理编程学习笔记 四、推荐平台&#xff1a;语雀 1、语雀的优势&#xff1a; 2、如何使用语雀整理编程学习笔记&#xff1a;…

【大模型系列篇】人工智能与智能计算的发展

&#x1f525;&#x1f525;&#x1f525; 来自 中国工程院院士、中国科学院计算技术研究所研究员 孙凝晖 第十四届全国人大常委会专题讲座上的讲稿《人工智能与智能计算的发展》 “把新一代人工智能作为推动科技跨越发展、 产业优化升级、生产力整体跃升的驱动力量&#xff0c…

项目启动端口报冲突如何处理?

你是否在Angular项目启动的时候试过端口报冲突呢&#xff1f;那么要如何解决呢&#xff1f;vue2又如何处理呢&#xff1f; 一、Angular冲突原因 Angular CLI 默认使用 4200 端口&#xff0c;如果这个端口已被占用&#xff08;比如启动了两次&#xff0c;或者本地可能有别的项目…

用IDEA创建一个SpringBoot项目和用官网创建一共SpringBoot项目导入IDEA(SpringBoot 学1)

一、用IDEA创建一个SpringBoot项目&#xff08;其实就说idea把网址集成到了软件上&#xff09; 1、选择java initializr创建项目框架 2、到下面这一步就和Maven项目的格式差不多&#xff0c;把项目名这些写上就行&#xff0c;选择对应的java版本 3、选择SpringBoot版本和勾选S…

描述一下SIFT特征提取算法的工作原理

SIFT&#xff08;Scale-Invariant Feature Transform&#xff0c;尺度不变特征变换&#xff09;是由 David Lowe 于 1999 年提出的一种特征提取算法&#xff0c;用于检测和描述图像中的局部特征点。SIFT 特征具有旋转、尺度和光照不变性&#xff0c;因此在各种计算机视觉任务中…

深入浅出链表

目录 1.链表的基本概念及结构 1.1基本概念 1.2结构 2.链表的分类 3.链表的实现&#xff08;循环链表增删查改实现&#xff09; 1.动态申请节点&#xff08;结点&#xff09;​编辑 2.单链表打印 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 …

瑞吉外卖-登录时报错:接口404异常

一、错误描述 出现“系统接口404异常”的弹窗&#xff0c;同时一直显示登录中&#xff0c;而无法跳转到后台页面。 二、解决方法 1. 检查浏览器的网址 确保为localhost:8080/backend/page/login/login.html&#xff0c;而不是idea自动生成的&#xff0c;修改过来即可。 2.确…

CSS文字描边

// 方法3 const p document.querySelector("p")p.dataset.content p.textContentmixin text-stroke($color: #fff, $width: 1px) {text-shadow: 0 -#{$width} #{$color}, #{$width} 0 #{$color},0 #{$width} #{$color}, -#{$width} 0 #{$color},-#{$width} -#{$wid…

Linux软件编程---数据库

目录 一、数据库 1.1.概念 1.2.类型 1.关系型数据库 2.非关系型数据库 1.3.SQL语言 1.4.如何在Linux安装sqlite数据库 1.确保虚拟机可以上网 2.配置apt-get工具集合 3.安装sqlite数据库 1.5.sqlite3 1.创建数据库 2.查看数据表 3.退出数据库 4.SQL语句 二、数…

XShell给Ubuntu虚拟机安装MySQL

准备工作&#xff1a;已经装好了虚拟机&#xff0c;并且已经下载了Linux系统&#xff0c;如 Linux Mint &#xff0c; Ubuntu 等&#xff0c;今天以目前较为流行的Ubuntu为示例 1.为什么选择Linux&#xff1f; 在现代软件开发中&#xff0c;Linux系统已成为开发和部署的首选平…

面试中被问到各个测试阶段的具体工作,如何详细描述

软件测试工程师面试的时候有一个问题也是一定会被问到的&#xff0c;那就是&#xff1a;你们的软件项目都会经过哪些测试阶段呢&#xff1f;每个阶段测试人员都做什么&#xff1f;接下来&#xff0c;凯哥就为各位小伙伴详细的说一说&#xff1a; 首先&#xff0c;一般的软件测…

Java 入门指南:Set 接口

Collection 接口 Collection 接口提供了一系列用于操作和管理集合的方法&#xff0c;包括添加、删除、查询、遍历等。它是所有集合类的根接口&#xff0c;包括 List、Set、Queue 等。 Collection 接口常见方法 add(E element)&#xff1a;向集合中添加元素。 addAll(Collecti…

【C++ Primer Plus习题】2.4

问题: 解答: #include <iostream> using namespace std;const int yearToMonth 12;int main() {short age 0;cout << "请输入您的芳龄:" << endl;cin >> age;int months age * yearToMonth;cout << age << "岁已经在世…