MyBatis入门·注解操作

目录


前言

本文简要介绍了 MyBatis 的基础知识与配置方法,并通过简单直观的代码示例,讲解了如何使用 MyBatis 注解完成数据库的增、删、改、查(CRUD)操作。


1. 介绍MyBatis

传统 JDBC 操作存在大量重复代码且过于繁琐。MyBatis 是一个持久层框架,主要目的就是简化 JDBC 的操作,大大降低数据库开发的门槛,增加我们的开发效率。

MyBatis 有两种操作方式:注解与 XML。前者更简便,后者能适应复杂环境。


2. 配置MyBatis

这里使用的是jetbrains的IDEA。

1

2

创建好工程之后,还得通过配置文件连接上mysql。

此时在application.yml文件中写下这段代码

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=true
    username: 这里填写你自己设置的用户名字
    password: 这里填写你自己设置的密码
    driver-class-name: com.mysql.cj.jdbc.Driver

其中:jdbc:mysql://127.0.0.1:3306/mybatis_test这一段的作用是,告诉mybatis你的数据库在哪里?(127.0.0.1:3306),操作哪一个数据库?(mybatis_test)

3.注解操作

我们从简单的增删查改语句开始学习。

我们先创建一个数据库与表格。

sql 复制代码
create database if not exists mybatisLearn;
use mybatisLearn;
create table student_info(
    id bigint primary key,
    name varchar(50) not null,
    password varchar(50) not null,
    gender varchar(10),
    birth_place varchar(20)
);

创建一个名为mybatisLearn的数据库,一个名字为student_info的表格。

创建好数据库后,我们还得写一个实体类来接受数据库返回的信息。

java 复制代码
@Data //自动创建getter方法
public class StudentInfo {
    Integer ID;
    String name;
    String password;
    String gender;
    String birthPlace;
}

select

我们先来学习查询操作。

在spring中,写对数据库操作相关的代码属于三层架构中的DAO层。

我们会创建一个名为DAO的package。

但在这里将名字改为Mapper,对齐注解的名字。

创建好一个名字为mapper的文件夹后,在这个文件夹里面创建一个接口(interface)类。

以后对数据库操作的方法都写在这个类里面。

java 复制代码
@Mapper
public interface MapperStu {
    @Select("select * from student_info")
    List<StudentInfo> select();
}

这里我创建好了一个名为 MapperStu 的接口类。

在里面定义了一个名为select的方法。

我们知道接口只是一个规范而已,我们还得去实现它。

在myBatis中,我们不必再去创建一个实现类,我们只需要在这个接口的头上加上一个名为@Select的注解,再将sql语句搬到这个括号里面即可。这样这个接口就实现了。

当我们调用这个select接口的时候,mybatis就会去执行select * from student_info这句话。

现在接口写好了,如何验证一下?

!\[Pasted image 20260611144600.png]

找到一个名字为test的包,并在里面创建一个类。

然后将下面的代码写进去。

java 复制代码
@SpringBootTest
class MapperTest {

    @Autowired
    private MapperStu mapperstu;

    @Test
    void select() {
        //准备一个容器
        List<StudentInfo> infos;

        infos = mapperstu.select();

        System.out.println(infos);
    }
}

点击run,就会在控制台输出如下的结果。

到这里,你已经会MyBatis的注解操作了。或许你还有疑问。我在这里集中回答。

关于Mapper注解

@Mapper 注解告诉 Spring:这是一个 MyBatis 接口。Spring 启动时会寻找这些接口,结合方法上的 @Select 等注解,自动在内存中生成一个实现类,并将其放入 Spring 容器中,因此我们可以直接 @Autowired 注入使用。

关于SpringBootTest

写这个注解的原因是,当我们在一个类上加上这个注解,并运行里面的测试方法。就可带着spring框架了。如果不写这个注解,运行测试方法,就只有基础的java环境。

运行过程:运行启动类 -> 加载上下文容器 -> 扫描配置文件,实例化 @Component@Service@Mapper 等类并注入 -> 运行你启动的测试方法 -> 关闭spring容器。

关于@Test

这个注解来自于JUnit。加上 @Test 就可以直接运行测试该方法。注意返回值只能是 void,不能写 private,且无参。

关于Select

@Select 放在 Mapper 接口的方法上,它的返回值类型非常灵活,MyBatis 会根据你的返回值类型自动把数据库查到的"表格数据"转换成"Java 对象"。

这些注解操作基本上大同小异,原理都差不多,后续不再重复叙述。


delete

照葫芦画瓢。

在MapperStu接口类里定义一个抽象方法,

通过@Delete注解实现。

java 复制代码
@Delete("delete from student_info where id = #{id}")
    Integer delete(Integer id);

把sql里写的语句,搬到注解里面。

在测试类中写一个测试方法。

运行结果

此时运行select就会发现id为1的数据不见了

关于传递参数

这里我多写了一个东西叫做id = #{id},并在方法里定义了一个参数id。

这里的#{id}是我们给delete函数传递的一个参数。

#{}是一个预编译符号,jdbc是将它转化为一个?作为填充物。后续你传递参数进去这个问号就会被换成你所传递的参数。如果参数是String类型的,会自动在sql语句里加上引号。


update

依旧照葫芦画瓢

这里给出接口与测试代码

java 复制代码
   @Update("update student_info set password = #{password} where name = #{name} ")
    Integer update(@Param("password") String password, @Param("name") String name);

  @Test
    void update(){
        mapperstu.update("true_or_false","李四");
    }

运行后

再谈传递参数
  1. 传递一个参数
    我们在delete部分中传递了一个参数,这个参数的名字其实可以随便写,因为只有一个也只能选择这一个参数。
  2. 两个参数
    此时参数的名字就不可以乱写了,
    比如这一句password = #{password} where name = #{name}
    我们看接口的定义Integer update(String password,String name);
    如果你改成password = #{pass} where name = #{ae}测试就会报错了。
    因为在java编译的时候,参数的名字会被替换成arg0,arg1之类的。
    解决办法是使用 @Param 注解:
    Integer update(@Param("password") String password, @Param("name") String name);
    再或者sql里面的名字和接口里参数名字对应起来。

insert

到这里我们得停下来思考一下,我们已经学会了如何通过注解写sql语句,如何传递参数。

一个查询语句里所需要的参数可能只有那么一两个。insert语句就必须要把非null的字段列写出来。如果需要插入的字段很多,将每个参数都写在方法签名中会非常麻烦并且难以维护。

这时候我们需要直接传递一个对象。

我们上面创建过一个实体信息类,用于接收来自sql里返回对象。

这里也可以创建一个对象,我们将这个对象传递进去。

MyBatis会自动的通过这个实体信息类的Getter方法获取里面的属性,并填充到对应的字段中。

这里注意啊,上面我们说过,如果你不写@Param,那么这个实体信息类的属性名字和sql语句字段名称一定要保持一致。

java 复制代码
@Insert("insert into student_info(name,password,gender,birth_place) " +
      "values(#{name},#{password},#{gender},#{birthPlace})")
    Integer insert(StudentInfo bean);

    @Test
    void insert(){
        StudentInfo bean = new StudentInfo();
        bean.setName("ryuukee");
        bean.setPassword("1111");
        bean.setGender("woman");
        mapperstu.insert(bean);
    }

运行结果:

再再谈传递参数

说一下命名规范吧。

在java里我们倾向使用小驼峰:birthPlace

但mysql倾向使用下划线进行分割:birth_place

我们说过两者的名字最好一致,

这种情况下怎办呢?

这里推荐一种方法,

你将下面这段话粘入yml文件中

这个文件通常在常放在 src/main/resources 目录下

yml 复制代码
spring:
  mybatis:  
    configuration:  
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印SQL日志这句可以不加  
      map-underscore-to-camel-case: true  # 这句是自动转换

总结

  1. MyBatis 是一个用于简化 JDBC 操作的持久层框架,主要配置包括数据源连接和开启相关驼峰命名映射等。
  2. 通过 @Select@Delete@Update@Insert 注解,我们可以方便地将 SQL 语句绑定到 Mapper 接口方法上完成增删改查。
  3. 传递参数时,单个参数名称可随意,多个参数需使用 @Param 明确映射;当字段较多时,推荐直接传递对象,让 MyBatis 自动根据属性名填充。
  4. 使用 @SpringBootTest@Test 可以十分便捷地加载 Spring 容器并进行接口功能的测试验证。
相关推荐
聪明努力的积极向上1 小时前
【claude code】MySQL MCP 配置完整指南
数据库·mysql·ai编程
码界索隆1 小时前
Python转Java系列:面向对象基础
java·开发语言·python
DIY源码阁1 小时前
JavaSwing酒店管理系统 - MySQL版
java·mysql·eclipse
川石课堂软件测试1 小时前
UI自动化测试|元素操作&浏览器操作实践
功能测试·测试工具·mysql·ui·docker·容器·单元测试
不恋水的雨1 小时前
easyexcel快速填充大数据量不覆盖后面的行解决方式
java·excel·poi
范什么特西1 小时前
Maven中dependencies和dependencyManagement区别
java·开发语言·maven
SunnyDays10112 小时前
Java 操作 Word 超链接:添加网页、邮箱、文件和图片链接
java·word·超链接
DFT计算杂谈2 小时前
WannierTools输入文件wt.in一键批量生成脚本
java·前端·chrome·python·算法·conda
大神15732 小时前
Cordova Android 签名三种方式详解:证书生成、命令行直接签名与配置文件自动签名
android·java