目录
前言
本文简要介绍了 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","李四");
}
运行后

再谈传递参数
- 传递一个参数
我们在delete部分中传递了一个参数,这个参数的名字其实可以随便写,因为只有一个也只能选择这一个参数。 - 两个参数
此时参数的名字就不可以乱写了,
比如这一句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 # 这句是自动转换
总结
- MyBatis 是一个用于简化 JDBC 操作的持久层框架,主要配置包括数据源连接和开启相关驼峰命名映射等。
- 通过
@Select、@Delete、@Update和@Insert注解,我们可以方便地将 SQL 语句绑定到 Mapper 接口方法上完成增删改查。 - 传递参数时,单个参数名称可随意,多个参数需使用
@Param明确映射;当字段较多时,推荐直接传递对象,让 MyBatis 自动根据属性名填充。 - 使用
@SpringBootTest和@Test可以十分便捷地加载 Spring 容器并进行接口功能的测试验证。