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

文章目录

  • 1. 前言
  • 2. 创建项目
  • 3. 添加框架支持
  • 4. 建库
  • 5. 配置数据库连接信息和 XML 文件路径
    • 5.1 创建 Java 类
    • 5.2 Java 接口
    • 5.3 XML 文件
  • 6. 查询
    • 6.1 不带参数的查询
    • 6.2 单元测试
    • 6.3 带参数的查询
  • 7. 修改
  • 8. 增加
    • 8.1 将对象插入表中
    • 8.2 获取自增主键
  • 9. 删除
  • 10. 数据库字段和类属性名字不一致的情况
    • 10.1 查询
    • 10.2 resultMap
  • 11. 排序查询
    • 11.1 #{} 和 ${} 的区别
  • 12. 模糊匹配
  • 13. 联合查询
  • 14. 动态 SQL
    • 14.1 if 标签
    • 14.2 trim 标签
    • 14.3 where 标签
    • 14.4 set 标签
    • 14.5 foreach 标签
  • 15. 全代码

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 插件)
MyBatis 万字长文:从入门到动态SQL超详细_第1张图片
然后再按如下操作, (如果这里没有添加依赖, 后面仍然可以添加)

MyBatis 万字长文:从入门到动态SQL超详细_第2张图片到此为止, 一个项目就算创建完了, 然后在刚开始目录结构可能有点复杂, 我们可以删除 4 个没用的文件, 如下

MyBatis 万字长文:从入门到动态SQL超详细_第3张图片

3. 添加框架支持

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

在这里插入图片描述

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

MyBatis 万字长文:从入门到动态SQL超详细_第4张图片

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);

表结构如下

MyBatis 万字长文:从入门到动态SQL超详细_第5张图片

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 万字长文:从入门到动态SQL超详细_第6张图片

⭐然后在 MyBatis 中的 xml 文件中,还要加入一段固定的代码块,复制粘贴即可


DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

在 xml 文件中,首先我们需要指定当前文件要和哪个接口进行对应,然后使用标签和 sql 语句去“实现”该接口中的哪个方法。

接着在下面然后添加 标签,namespace 填的是当前 xml 对应的接口的完整路径,这里填的是 ArticleMapper 的路径,然后后续在该 标签中编写代码即可

<mapper namespace="com.example.blogtest.mapper.ArticleMapper"> 

mapper>

这个是我的目录结构

MyBatis 万字长文:从入门到动态SQL超详细_第7张图片

至此为止,我们就可以正式填写我们操作数据库的代码了。

⭐而关于后续的增删查改,都是先在接口中声明一个方法,然后在对应的 xml 文件中对这个方法编写相应的标签和 sql 语句
⭐而 sql 语句是用来用来操作数据库的,这里的 sql 语句和直接在 MySQL 中输入 sql 语句有些相似。


6. 查询

6.1 不带参数的查询

任务1:查询文章表中的所有文章

(1)首先在接口中声明这个方法,由于查询所有文章,所以我们需要返回 List

@Mapper
public interface ArticleMapper {
    List<Article> selectAll(); // 声明方法
}

(2)然后在该接口对应的 xml 文件中编写 sql 语句,查询语句需要用到