MyBatis 万字长文:从入门到动态SQL超详细

2023-10-31

1. 前言

MyBatis是一个基于JDBC的半 ORM 持久化框架, 能通过 注解 或者 XML(主流方式) 和 映射原生类型, 接口和 java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

通俗来说,MyBatis 能够通过简单(指不繁琐)的操作实现对数据库的操作

ORM : Object Relational Mapping, 也就是对象关系映射框架, 它指的是够将数据库中的关系模型和 Java 对象建立起一种对应关系。例如数据库中有 Article 这张表,那么一个 Java 对象对应的就是 Article 这张表中的一行数据


而完成一个 MyBatis 的操作只需要以下几个步骤:

  1. 创建项目
  2. 导入 MyBatis 的框架支持,而如果我们要连接的是 MySQL,那么还需要一个 MySQL Driver 的支持(本文重在 MySQL)
  3. 配置想要连接的数据库以及一些其他的配置
  4. 完成 XML 文件和 Java 接口的编写(一个 Java 接口对应一个 XML 文件)
  5. 在 XML 文件中编写 SQL 语句并测试

2. 创建项目

首先是项目的创建,打开 IDEA 新建项目,然后按照如下步骤操作
(如果无法创建 Spring Boot 项目则可以在 IDEA 安装 Spring Boot Helper 插件)
在这里插入图片描述
然后再按如下操作, (如果这里没有添加依赖, 后面仍然可以添加)

在这里插入图片描述到此为止, 一个项目就算创建完了, 然后在刚开始目录结构可能有点复杂, 我们可以删除 4 个没用的文件, 如下

在这里插入图片描述

3. 添加框架支持

如果创建项目之前已经添加了依赖,这一步就可以直接忽略。但是建议大家装一个 EditStarters 插件,后续导入依赖很方便。
在项目自带的 pom.xml 文件中右键 → generate → EditStarters

在这里插入图片描述

然后勾选以下这几项,然后等待下载即可

在这里插入图片描述

4. 建库

在练习 MyBatis 之前,需要本地建个数据库和建表

想练习的也可以复制下面这段一样的建库代码,这里创建了文章表和作者表(复制粘贴到 MySQL 即可)

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

-- 使用数据数据
use practice;

-- 创建用户表
drop table if exists  user;
create table user(
    id int primary key auto_increment,
    username varchar(100) not null,
    password varchar(32) not null,
    createtime datetime default now(),
    updatetime datetime default now()
) default charset 'utf8mb4';

-- 创建文章表
drop table if exists  article;
create table article(
    id int primary key auto_increment,
    title varchar(100) not null,
    content text not null,
    createtime datetime default now(),
    updatetime datetime default now(),
    userid int not null, 			      -- 用户 id
    visitcount int not null default 1     -- 该文章访问次数
)default charset 'utf8mb4';


-- 随便添加一个作者数据
insert into user(`id`, `username`, `password`, `createtime`, `updatetime`) values
(1, 'pig', 'pig', '2022-12-14 00:00:00', '2022-12-14 00:00:00');

-- 随便添加一个文章数据
insert into article(title,content,userid)
    values('MyBatis博客','MyBatis增删查改',1);

表结构如下

在这里插入图片描述

5. 配置数据库连接信息和 XML 文件路径

首先在 resources 目录底下创建一个 applictaion.yml 文件,然后在全局配置文件 application.yml 中(也是可以是 properties 文件,但是代码略有差异,效果一样,本文演示的是 yml 文件), 加入下面这一段代码。

⭐在 MyBatis 中,需要去定义 SQL 映射语句,一个MyBatis 的 xml 文件保存的是操作数据库的 sql 语句,而一个 xml 文件会实现一个Java接口中相应的操作数据库的方法,但是我们还需要让 MyBatis 知道这些 xml 文件在哪里,所以这里还需要配置 xml 的文件路径。

spring:
  datasource:
    # 配置本地连接的数据库(此处我的数据库名字是 practice)
    url: jdbc:mysql://127.0.0.1/practice?characterEncoding=utf8
    username: root
    password: 123456  # 自己数据库的密码
    driver-class-name: com.mysql.cj.jdbc.Driver # 固定写法
mybatis:
  # 配置 xml 文件路径,此处表示配置在 当前目录的 mapper 包中
  mapper-locations: classpath:mapper/**Mapper.xml 的 xml 文件都是

上面代码中的 mapper-locations 的作用就是配置 xml 的文件路径,表示:当前目录下有个 mapper 包,并且包中以 xxMapper.xml 形式命名的文件都是和接口对应的 xml 文件

5.1 创建 Java 类

前面说到 MyBatis 是一个半 ORM 框架,需要将数据库中的数据模型和 Java 对象对应起来,所以还需要创建和数据库中的表对应的 Java 类。

而我们数据库中有 user 和 article 两张表,表中的一条数据就会对应一个 Java 对象,所以,分别创建 Article 类和 User 类(路径不限)。这里我们先拿 Article 举例子,这个表不涉及「字段名和属性名不相等」的问题。后面再拿 User 举重映射的例子

@Data  // 这个注解就是给该类加上 toString, get, set 等方法
public class Article {
    private int id;
    private String title;
    private String content;
    private Date createtime;
    private Date updatetime;
    private int userid;
    private int visitcount;
}

(该 Article 类属性名和数据库字段名相等)

5.2 Java 接口

在 MyBatis 中,一个 xml 文件和一个 接口是对应的,对于一个类,就会有一个接口和实现相关操作的 xml 文件

⭐但是这个接口不只是普通的接口,还需要加上 @Mapper 注解来修饰,这个注解会对这个接口生成一个实现类,会将其类实例化成 Bean 对象存入 Spring 中进行管理。

我们开始编写这个 接口 (接口命名无要求)

@Mapper
public interface ArticleMapper {
}

5.3 XML 文件

然后就是创建 xml 文件,由于在前面我们配置了 xml 文件的路径,如下

在这里插入图片描述
因此我们的 xml 不仅需要放在同一级目录中的 mapper 包中,还需要以 __Mapper.xml 的形式命名 xml 文件,这里我们就取名 ArticleMapper.xml

在这里插入图片描述

⭐然后在 MyBatis 中的 xml 文件中,还要加入一段固定的代码块

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis 万字长文:从入门到动态SQL超详细 的相关文章

  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 匿名类上的 NotSerializedException

    我有一个用于过滤项目的界面 public interface KeyValFilter extends Serializable public static final long serialVersionUID 7069537470113
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 将 SignedHash 插入 PDF 中以进行外部签名过程 -workingSample

    遵循电子书第 4 3 3 节 PDF 文档的数字签名 https jira nuxeo com secure attachment 49931 digitalsignatures20130304 pdf 我正在尝试创建一个工作示例 其中 客
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • 编辑文件名在 JComboBox 中的显示方式,同时保持对文件的访问

    我对 Java 很陌生 对堆栈溢出也很陌生 我正在尝试利用 JMF API 创建一个用 Java 编码的简单媒体播放器 到目前为止 我已经能够设置一个简单的队列 播放列表来使用JComboBox called playListHolder
  • Jersey 客户端请求中未设置 Content-Length-Header

    我正在使用 Jersey Client 访问网络服务 如下所示 response r accept MediaType TEXT PLAIN TYPE header content length 0 post String class 其中
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • 【matlab图像处理】插值方法

    中国史之 懿王攻犬戎 周懿 yi 王攻打犬戎的战争 周懿王在位时期 西周衰弱 戎族不断入侵周朝 一度打到镐 今陕西西安 岐 今陕西岐县 等地 懿王被迫迁都槐里 今陕西兴平县 周懿王派虢 guo 公率军北伐犬戎 企图收复失地 但不幸战败 来源
  • 抽象类、模板方法

    抽象类理解为一种模板 模板模式 使用 package com example demo author dc version 1 0 date 2023 03 28 12 55 public abstract class DayPlan pu
  • PMOS开关管的选择与电路图

    中心议题 探讨 解决方案 选用N沟道还是P沟道 确定额定电流 确定热要求 首先要进行MOSFET的选择 MOSFET有两大类型 N沟道和P沟道 在功率系统中 MOSFET可被看成电气开关 当在N沟道MOSFET的栅极和源极间加上正电压时 其
  • centos7 配置网络_linux入门系列11--Centos7网络服务管理

    通过前面文章的学习已经掌握了Linux系统配置管理的知识 本文讲解Centos7网络配置知识 Linux要对外提供服务 需要保证网络通信正常 因此需要正确配置网络参数 本文将讲解如何使用Network Manager配置网络参数 管理网络会
  • MATLAB中复数矩阵的转置、共轭及共轭转置

    参考博客 https blog csdn net zhaozhichenghpu article details 79162287 MATLAB中生成一个复数矩阵 MATLAB中复数矩阵的共轭用conj A MATLAB中复数矩阵的转置 A
  • 安卓USB模块源码分析(一)- 准备

    介绍USB服务在Android服务体系中的位置 源码的位置及使用AndroidStudio 查看USB模块FWK的配置方式 Windows环境准备 WSL2安装及AOSP源码下载编译 shimo im 安卓服务概览 Android 主要有如
  • os.walk()的使用方法

    os walk 主要用来扫描某个指定目录下所包含的子目录和文件 这篇文章将通过几个简单的例子来说明python中os walk 的使用方法 一 从上到下 遍历目录 该文件夹 和子目录 子文件夹 以及文件 txt等 假设我们的test文件夹有
  • 如何在JavaScript中实现继承?

    聚沙成塔 每天进步一点点 专栏简介 原型链继承 借用构造函数继承 构造函数继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航
  • 内核模式代码签名走查(四)

    如何禁用测试计算机上的强制签名 在驱动程序开发的早期阶段 开发人员签署每个构建都可能很麻烦 因为这个原因 WindowsVista提供了几个方式来临时禁用内核模式代码签名实施 以便测试计算机可以安装和加载未签名的驱动程序 附加一个内核调试器
  • Java语言程序设计(一)选择题

    1 1 如下哪个是 Java中的标识符 A public B super C 3number D width 2 如下哪个是 Java中的标识符 A fieldname B super C 3number D number 3 已知如下定义
  • Linux IO协议栈框图

    Linux IO协议栈框图 来源 http www thomas krenn com en oss linux io stack diagram linux io stack diagram v0 1 pdf
  • sqli-labs-master sql注入靶场(10、11、12)

    sqli labs master sql注入靶场 10 12 pass 10 首先 这题用sqlmap跑不出来 sqlmap提示我们这题是时间盲注 无论我们输入什么 不管对错页面都是You are in 我们用sleep函数来判断对错 如果
  • [工业互联-3]:工业有线互联总线之工业以太网总线

    目录 第1章 工业以太网概述 1 1 概述 1 2 工业以太网与普通以太网的比较 1 3 以太网在工业控制领域中应用的优势 1 4 工业以太网与其他工业互联总线的比较 第2章 工业以太网网络部署 第3章 工业以太网网络协议栈 3 1 传统以
  • LTspice introduction - 2 LTspice的界面

    LTspice的界面主要有两个 Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的 画完电路图之后 添加一些dot 命令同时选择一些仿真的参数 点击执行 Run W
  • dell服务器维护软件,Dell服务器硬件,RAID等查询和维护软件OMSA

    Dell服务器查询和维护软件OMSA OMSA OpenManageServerAdministrator 是Dell主机的硬件检测和维护软件 OMSA OpenManage 下载地址 http linux dell com repo ha
  • Golang 单元测试

    想要测试Go代码需要依赖go test命令 需注意如下事项 在包目录内所有测试文件必须以 test go结尾 go build不会把这些测试文件编译到最终的可执行文件中 在 test go文件中 单元测试函数的名字须以TestXxxx的形式
  • git: 如何减少.git文件的大小?

    1 起因 使用git储存本地笔记时 没有注意到其中包含的视频文件 avi 大约3个 每个100MB 将其也添加到git的历史记录中 git add git commit 虽然之后删除了视频文件本身 但其提交记录永久的留在了 git中 被gi
  • 自定义封装异步任务组件,实现FutureTask功能

    FutureTask 在 JDK1 8 后的异步编排API中的CompletableFuture 提供了 异步任务的成功回调 异常回调 public class FutureTaskTest public static void main
  • springmvc进阶(5):mvc:default-servlet-handler详解

    我们在配置dispatchServlet时配置
  • MyBatis 万字长文:从入门到动态SQL超详细

    文章目录 1 前言 2 创建项目 3 添加框架支持 4 建库 5 配置数据库连接信息和 XML 文件路径 5 1 创建 Java 类 5 2 Java 接口 5 3 XML 文件 6 查询 6 1 不带参数的查询 6 2 单元测试 6 3