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超详细 的相关文章

  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • 如何在Java中使用我的密码加密和解密字符串(PC而非移动平台)? [复制]

    这个问题在这里已经有答案了 我想加密一个字符串然后将其放入文件中 当我想要的时候也想解密它 我不需要很强的安全性 我只是想让其他人更难获取我的数据 我尝试了几种方法 这是这些 Md5加密 如何在 Android 中对字符串进行哈希处理 ht
  • JTree 避免重新加载后崩溃

    我正在尝试找到解决崩溃问题的方法JTree重新加载后 情况 JTree Office A Office A 1 Office A 1 1 Office A 1 2 Office B Office B 1 Office B 1 1 Offic
  • Java JNDI 名称 java:/

    我正在遵循教程 https docs oracle com javase tutorial jndi index html https docs oracle com javase tutorial jndi index html 我的冒险
  • 从 java 类生成 xsd 的实用程序

    我想为以下类生成 xsd public class Node private String value private List
  • 枚举内的枚举

    这不是我被卡住的问题 而是我正在寻找一种简洁的方式来编写我的代码 本质上 我正在编写一个事件驱动的应用程序 用户触发事件 事件被发送到适当的对象 然后对象处理事件 现在我正在编写偶数处理程序方法 我希望使用 switch 语句来确定如何处理
  • docker 中带有参数的 jar 文件

    Helo 我有一个 java jar 文件 当我从终端运行它时 它会接受一堆参数作为输入 我想制作一个 docker 映像并运行它 其中包含 jar 文件 我仍然可以在其中传递 jar 文件的参数 将 jar 文件设置为您的入口点 http
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce
  • 使用 JavaFX 将可执行 Jar 限制为一个窗口

    我正在通过构建 JavaFX 应用程序E fx 剪辑 and Java场景生成器 基本功能是登录窗口 登录后 将打开新窗口 然后登录窗口消失 目前还处于原型阶段 用完eclipse后 我想要的功能都有了 启动时显示登录窗口 代码如下 Ove
  • 检查对象是否为空

    我有一个链表 其中第一个节点包含空对象 表示firstNode data等于null firstNode nextPointer null firstNode previousPointer null 我想检查firstNode 是否为空
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 如何在 Spring GCP 中订阅多个 Google PubSub 项目?

    我想在 Spring Boot 应用程序中订阅多个 Google Cloud PubSub 项目 阅读完相关问题后如何使用 Spring Cloud 在一个 Spring Boot 应用程序中连接 配置两个 pubsub gcp 项目 ht
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 使用 System.out.println 显示特殊字符

    我在将带有特殊字符的文本从网络服务发送或显示到数据库时遇到问题 在我的 Eclipse 上 我已将字符编码设置为 UTF 8 但它仍然不允许我显示字符 例如 像下面的代码一样简单的打印 String test System out prin
  • 如何在 VSCode 中热重载 Tomcat 服务器

    我正在从 Eclipse IDE VSCode 分别用于编码 Java servlet 和 HTML CSS JS 网页 迁移到仅使用 Visual Studio Code 因为它的轻量级 我为 VSCode 安装了几个 Java 扩展 R
  • 将Json字符串映射到java中的map或hashmap字段

    假设我从服务器返回了以下 JSON 字符串 response imageInstances one id 1 url ONE two id 2 url TWO 杰克逊代码大厦 JsonProperty 我怎样才能得到HashMap对象出来了
  • Encog:BasicNetwork:无需预先构建数据集的在线学习

    我正在尝试使用 encog 库作为强化学习问题的函数逼近器 更准确地说 我正在尝试启动并运行多层感知器 BasicNetwork 由于我的代理将根据我选择的任何 RL 算法以某种方式探索世界 因此我无法预先构建任何 BasicNeuralD

随机推荐

  • 【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