MyBatis 详解 (1) -- 环境搭建、查询操作

news2024/11/26 12:51:08

MyBatis 详解 1 -- 环境搭建、查询操作

  • 一、MyBatis 是什么
  • 二、为什么学习 MyBatis
  • 三、MyBatis 查询
    • 3.1 前言
    • 3.2 创建数据库和表
    • 3.3 添加 MyBatis 框架支持
      • 添加 MyBatis 和 MySQL 驱动
    • 3.4 配置连接字符串 和 MyBatis
      • 3.4.1 配置连接字符串
      • 3.4.2 配置 MyBatis 中的 XML 路径
    • 3.5 添加业务代码
      • 3.5.1 MyBatis 实现思路
      • 3.5.2 添加实体类
      • 3.5.3 添加 mapper 接口 (数据持久层)
      • 3.5.4 创建与接口对应的 xml 文件
    • 3.6 进行单元测试
    • 3.7 更多查询操作
      • 根据 id 查 ...
    • 3.8 实现完整交互
      • 3.8.1 添加 Service
      • 3.8.2 添加 Controller
      • 3.8.3 验证

一、MyBatis 是什么

MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通⽼式 Java 对象)为数据库中的记录。
简单来说 MyBatis 是更简单完成程序和数据库交互的⼯具,也就是更简单的操作和读取数据库⼯具。

Mybatis 官网:https://mybatis.org/mybatis-3/zh/index.html

二、为什么学习 MyBatis

对于后端开发来说,程序是由以下两个重要的部分组成的:

  1. 后端程序
  2. 数据库

在这里插入图片描述

而这两个重要的组成部分要通讯,就要依靠数据库连接工具,那数据库连接⼯具有哪些?
之前我们学习的 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. 释放资源

JDBC 详解 博客链接:https://blog.csdn.net/yyhgo_/article/details/128061324

JDBC 整个操作流程非常繁琐,我们不仅要拼接每⼀个参数,而且还要按照模板代码的方式⼀步步操作数据库,并且在每次操作完,还要⼿动关闭连接等… 而所有的这些操作步骤都需要在每个方法中重复书写。
于是我们就想,有没有⼀种⽅法可以更简单、更方便的操作数据库呢?
答案是肯定的,这就是我们学习 MyBatis 的原因,它可以帮助我们更方便、更快速地操作数据库 ~

MyBatis 实际就是对 JDBC 的封装!~

三、MyBatis 查询

3.1 前言

开始搭建 MyBatis 之前,我们先来看⼀下 MyBatis 在整个框架中的定位,框架交互流程图:

在这里插入图片描述

MyBatis 也是⼀个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在面向对象编程语⾔中,将关系型数据库中的数据与对象建⽴起映射关系,进⽽⾃动的完成数据与对象的互相转换:

  1. 将输⼊数据(即传⼊对象)+ SQL 映射成原⽣ SQL
  2. 将结果集映射为返回对象,即输出对象

ORM 把数据库映射为对象:

  • 数据库表(table)–> 类(class)
  • 记录(record,行数据)–> 对象(object)
  • 字段(field) --> 对象的属性(attribute)

⼀般的 ORM 框架,会将数据库模型的每张表都映射为⼀个 Java 类。
也就是说使⽤ MyBatis 可以像操作对象⼀样来操作数据库中的表,可以实现对象和数据库表之间的转换,接下来我们来看 MyBatis 的使⽤吧。

3.2 创建数据库和表

博客系统库 ~~

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;

-- 使用数据数据
use mycnblog;

-- 创建表[用户表]
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';

3.3 添加 MyBatis 框架支持

添加 MyBatis 和 MySQL 驱动

在这里插入图片描述
在这里插入图片描述

此时启动:
在这里插入图片描述

此时没有配置数据库的链接地址,所以并不能正常启动,接下来:

3.4 配置连接字符串 和 MyBatis

此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。

3.4.1 配置连接字符串

如果是 application.yml 添加如下内容:

# 数据库连接配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
    username: root
    password: 632yyh..
    driver-class-name: com.mysql.cj.jdbc.Driver  # 驱动!是固定的~~

注意根据自己的数据库信息稍作修改 ~
(使用的 mysql-connector-java 是 5.x 之前的:com.mysql.jdbc.Driver;大于 5.x:com.mysql.cj.jdbc.Driver)

3.4.2 配置 MyBatis 中的 XML 路径

MyBatis 的 XML 中保存的是查询数据库的具体操作 SQL,配置如下:

# 配置 mybatis xml 的⽂件路径,在 resources/mybatis 创建所有表的 xml ⽂件
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml

classpath:mybatis 表示存放 .xml 配置文件的路径;
(classpath 是自定义的,习惯性使用 “mapper” / “mybatis”)
**Mapper.xml 表示所有以 Mapper.xml 结尾的都是 mybatis 的配置文件。
在这里插入图片描述

除了 .xml 文件,还可以使用注解来完成 sql 语句,但是并不推荐 ~

此时就可以成功启动了。

3.5 添加业务代码

3.5.1 MyBatis 实现思路

下⾯按照后端开发的⼯程思路,也就是下⾯的流程来实现 MyBatis 查询所有⽤户的功能:

在这里插入图片描述

在这里插入图片描述

3.5.2 添加实体类

添加用户的实体类:

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

/**
 * 普通的实体类,用于 Mybatis 做数据库表(userinfo表)的映射
 * 注意事项:保证类属性名称和userinfo表的字段完全一致!
 */
@Data
public class UserInfo {
    private int id;
    private String name;
    private String password;
    private String photo;
    private Date createtime;
    private Date updatetime;
    private int state;
}

普通的实体类,用于 Mybatis 做数据库表(userinfo表)的映射。
注意事项:保证类属性名称和 userinfo 表的字段 完全一致!

3.5.3 添加 mapper 接口 (数据持久层)

数据持久层的接口定义:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper // mybaits 接口,此注解一定不能忽略
public interface UserMapper {
    // 查询所有的信息
    public List<UserInfo> getAll();
}

mybaits 接口,@Mapper 注解一定不能忽略!

  • 对应其 .xml 文件
  • 其他类可以注入它 (类似五大类注解)

3.5.4 创建与接口对应的 xml 文件

根据前面的设置:

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
  mapper-locations: classpath:mybatis/**Mapper.xml

xml 文件一定要创建在对应的目录中,且命名要符合规范!
在这里插入图片描述

.xml 文件模板:

<?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="">

</mapper>

在这里插入图片描述

编辑 UserMapper.xml:

<?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="com.example.demo.mapper.UserMapper">
    <select id="getAll" resultType="com.example.demo.model.UserInfo">
        select * from userinfo
    </select>
</mapper>
  • <mapper></mapper> 标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名。
  • 查询操作:<select>,</select> 标签
  • 接口中的方法名:id="getAll"
  • 查询返回对象的类型 (包名+类名):resultType="com.example.demo.model.UserInfo"

3.6 进行单元测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建完成后:

在这里插入图片描述

生成后,需要添加一些代码:
(设置当前测试的环境为 Spring Boot,并且注入要测试的类[接口])

在这里插入图片描述

package com.example.demo.mapper;

import com.example.demo.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 // 当前测试的上下文环境为 springboot
class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    void getAll() {
        List<UserInfo> list = userMapper.getAll();
        for (UserInfo user : list) {
            System.out.println(user.toString());
        }
    }
}

先添加一个用户信息:

-- 添加一个用户信息
insert into `mycnblog`.`userinfo` (`id`, `username`, `password`, `photo`, `createtime`, `updatetime`, `state`) VALUES 
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1);

启动单元测试:
在这里插入图片描述

成功查询到了数据:
在这里插入图片描述

3.7 更多查询操作

根据 id 查 …

UserMapper 接口:

@Mapper // mybaits 接口,此注解一定不能忽略
public interface UserMapper {
    // 查询所有的信息
    public List<UserInfo> getAll();
    
    // 根据用户id查询用户
    public UserInfo getUserById(@Param("uid") Integer id);
}

@Param("uid") Integer id:拿到参数“uid”,赋值到变量“id”上。
(加上 @Param 注解通用性更好!)

.xml 文件:

    <select id="getUserById" resultType="com.example.demo.model.UserInfo">
        select * from userinfo where id=#{uid}
    </select>

注意:select * from userinfo where id=#{uid} sql 语句这里写的是 uid!是把 uid (sql) 复制给了变量 (id)。
(保持一致就不会出问题了 ~)

进行单元测试:

    @Test
    void getUserById() {
        UserInfo userInfo = userMapper.getUserById(1);
        System.out.println(userInfo);
    }

方法所在接口没有变,单元测试也是在同样的类中进行的。步骤参考目录 3.6 ~

成功打印了。
根据其他字段来查也是一样的 ~

3.8 实现完整交互

在这里插入图片描述

3.8.1 添加 Service

服务层实现代码如下:

package com.example.demo.service;

import com.example.demo.mapper.UserMapper;
import com.example.demo.model.UserInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

@Service
public class UserService {
    @Resource
    private UserMapper userMapper;

    public List<UserInfo> getAll() {
        return userMapper.getAll();
    }
}

3.8.2 添加 Controller

控制器层实现代码如下:

package com.example.demo.controller;

import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/u")
public class UserController {
    @Resource
    private UserService userService;

    @RequestMapping("/getall")
    public List<UserInfo> getAll(){
        return userService.getAll();
    }
}

3.8.3 验证

启动后,访问 http://localhost:8080/u/getall:
在这里插入图片描述
交互成功了 ~

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

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

相关文章

CSS造成阻塞的原理

目录 1.原理解析 A.webkit渲染过程 B.Gecko渲染过程 C.解析原理 接上篇文章CSS会造成阻塞吗&#xff1f; 我们来说一下CSS造成阻塞的原理 1.原理解析 那么为什么会出现上面的现象呢&#xff1f;我们从浏览器的渲染过程来解析下。 不用浏览器使用的内核不同&#xff0c…

leetcode 648. 单词替换【python3哈希集与两种字典树的方法的思考过程整理】

题目 在英语中&#xff0c;我们有一个叫做 词根(root) 的概念&#xff0c;可以词根后面添加其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如&#xff0c;词根an&#xff0c;跟随着单词 other(其他)&#xff0c;可以形成新的单词 another(另一个)。…

UI自动化测试模块与环境管理全面打通,MeterSphere开源持续测试平台v2.6.0发布

2023年1月16日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.6.0版本。 在这一版本中&#xff0c;MeterSphere的UI自动化测试模块与环境管理全面打通&#xff0c;更好地满足了用户一个脚本同时跑多个环境的测试需求。在测试跟踪模块中&#xff0c;测试计划关联测试…

怎么系统的阅读文献

文章目录一、文献阅读1、综述类文献 review article2、研究类文章 research article3、方法学的文章第一部分 综述类文章的阅读第二部分 研究型文章的阅读a. 研究型论文结构b. 如何有选择阅读文献c. 如果整理笔记Citation和Reference的区别二、文献阅读工具1、Connected Papers…

python-while循环

文章目录一、程序的三种结构二、while循环1.1&#xff1a;死循环1.2&#xff1a;循环计数习惯案例1.3&#xff1a;循环计数2.0&#xff1a;break终止循环3.0&#xff1a;人造死循环4.0&#xff1a;continue5.0循环嵌套一、程序的三种结构 1&#xff1a;顺序 代码自上而下执行 …

四旋翼无人机学习第20节--PCB自动保存文件labview设计

0 前言 在设计PCB的过程中&#xff0c;通常一个项目的的PCB文件只有一个&#xff0c;如果保存完文件后想要回滚到自己的版本是比较难的&#xff0c;虽然allergo软件可以设置autosave功能来自动对PCB文件进行备份&#xff0c;但是备份文件只会保存最后一次的版本。 1 labview编…

JavaWeb基础(二) HTTP、Tomcat、Servlet介绍

JavaWeb基础(二) HTTP、Tomcat、Servlet介绍 1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东、传智官网等这些网站&a…

Dubbo调用

Dubbo调用 0. 概述 Dubbo 服务调用过程比较复杂&#xff0c;包含众多步骤&#xff0c;比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。 1. 客户端发送请求时序图 InvokerInvocationHandler.invoke 1. 对于Object中的方法toString, has…

IDEA常用配置整理说明

文章目录IDEA常用配置整理说明1、 IDE配置1.1 设置相关1.1.1 忽略大小写开关1.1.2 取消单行显示tabs的操作1.1.3 项目文件编码1.1.4 滚轴修改字体大小1.1.5 设置显示行号和方法间的分隔符1.1.6 新建类头注释信息1.1.7 JavaDoc注释&#xff08;就是方法上加的注释&#xff09;1.…

蓝桥杯:整数分解

题目链接 问题描述 答案提交 本题答案&#xff1a;691677274345。 思路分析 问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是312 和 321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113 122 131 212 221 311。…

WebSocket长连接接入支付宝消息服务,实现消息通知

大家好&#xff0c;我是小悟 在对接支付宝开放平台的一些常用功能时&#xff0c;常常需要收到支付宝的回调通知结果&#xff0c;才能处理业务逻辑。此文介绍通过WebSocket长连接接入支付宝消息服务&#xff0c;实现消息通知。 包括五部分内容&#xff1a;问题、优势、配置、代…

Spring3.*中ASM和JDK8版本冲突问题及解决方案

1. 问题描述 Spring3.* 中ASM版本较低&#xff0c;不支持对 JDK8 class文件进行操作&#xff0c;启动时报错。 Tomcat报错 org.springframework.asm.MethodVisitor.visitParameter2. 问题原因 Spring使用ASM类库操作Java class文件&#xff0c;Spring.* 依赖的ASM类库版本比…

右键万能格式转换工具

格式转换是很多小伙伴都会用到的东西&#xff0c;无论是视频、音频还是文档等格式&#xff0c;其实做这方面的软件有很多&#xff0c;比如之前一直在用的格式工厂&#xff0c;蛮好用的。后面用到了ABC工具箱&#xff0c;&#xff08;这款软件批量处理图片会很方面&#xff09;界…

故障分析 | 库表名-大小写不规范,运维两行泪

作者&#xff1a;刘聪 爱可生华东交付服务部 DBA 成员&#xff0c;专职 MySQL 故障处理及相关技术支持。座右铭&#xff1a;好好学习&#xff0c;天天向上。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系…

【博客589】K8s Topology Spread Constraints

K8s Topology Spread Constraints 场景 你可以使用 拓扑分布约束&#xff08;Topology Spread Constraints&#xff09; 来控制 Pod 在集群内故障域之间的分布&#xff0c; 例如区域&#xff08;Region&#xff09;、可用区&#xff08;Zone&#xff09;、节点和其他用户自定义…

带你从概念到服务对象,解读商业智能BI

数据在当前时代已然成为了重要的战略资源&#xff0c;但数据资产却并不是每个企业都能利用。数据本身并没有太多意义&#xff0c;规模小还好&#xff0c;一旦规模量变大&#xff0c;人们就难以理解其中的含义。所以讲数据资产价值化&#xff0c;使其转化为信息和知识成为了企业…

五个了解自己天赋优势的分析工具(四)MBTI测试

MBTI测试 MBTI全称“迈尔斯-布⾥格斯类型指标”&#xff0c;是美国作家伊莎⻉尔布⾥格斯迈尔斯和她的⺟亲凯瑟琳库克布⾥格斯在20世纪40年代编制的⼀种⼈格测试。 这⼀测试的基础来⾃著名⼼理学家荣格提出的⼼理类型理论。 荣格将⼈的性格类型分为“内向&#xff08;I&#xf…

广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”

文章目录广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】”PDB - 广告投放[保量保价]PDB 浅述PDB 数据流图保量逻辑设计订单曝光拆分凌晨停量补量广告业务系统 之 业务串联 —— “ PDB - 广告投放【保量保价】” PDB - 广告投放[保量保价] 常规的 ADX 系统&am…

【C语言练习】 二进制中1的个数

目录题目详情&#xff1a;思路一&#xff1a;思路二&#xff1a;思路三&#xff1a;题目详情&#xff1a; 思路一&#xff1a; 拿到二进制的每一位&#xff0c;看它是否等于 111&#xff0c;再定义一个计数器变量&#xff0c;如果等于 111&#xff0c;计数器变量就加 111。最终…

rancher的k3s证书过期

文章目录现象rancher报错日志分析解决思路解决现象 web上rancher不能访问&#xff0c;服务上看443端口没了&#xff0c;6443端口仍然在。 rancher报错日志 rancher | time"2023-01-05T01:56:07.241615176Z" levelinfo msg"Waiting for master node start…