目录
- 前言
- 1. 介绍MyBatis
- 2. 配置MyBatis
-
-
- 1
- 2
-
- 3.注解操作
-
- select
-
-
- 关于Mapper注解
- 关于SpringBootTest
- 关于@Test
- 关于Select
-
- delete
-
-
- 关于传递参数
-
- update
-
-
- 再谈传递参数
-
- insert
-
-
- 再再谈传递参数
-
- 总结
前言
本文简要介绍了 MyBatis 的基础知识与配置方法,并通过简单直观的代码示例,讲解了如何使用 MyBatis 注解完成数据库的增、删、改、查(CRUD)操作。
1. 介绍MyBatis
传统 JDBC 操作存在大量重复代码且过于繁琐。MyBatis 是一个持久层框架,主要目的就是简化 JDBC 的操作,大大降低数据库开发的门槛,增加我们的开发效率。
MyBatis 有两种操作方式:注解与 XML。前者更简便,后者能适应复杂环境。
2. 配置MyBatis
这里使用的是jetbrains的IDEA。
1

2
创建好工程之后,还得通过配置文件连接上mysql。
此时在application.yml文件中写下这段代码
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.注解操作
我们从简单的增删查改语句开始学习。 我们先创建一个数据库与表格。
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的表格。
创建好数据库后,我们还得写一个实体类来接受数据库返回的信息。
@Data //自动创建getter方法
public class StudentInfo {
Integer ID;
String name;
String password;
String gender;
String birthPlace;
}
select
我们先来学习查询操作。 在spring中,写对数据库操作相关的代码属于三层架构中的DAO层。 我们会创建一个名为DAO的package。 但在这里将名字改为Mapper,对齐注解的名字。 创建好一个名字为mapper的文件夹后,在这个文件夹里面创建一个接口(interface)类。 以后对数据库操作的方法都写在这个类里面。
@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的包,并在里面创建一个类。 然后将下面的代码写进去。
@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注解实现。
@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
依旧照葫芦画瓢 这里给出接口与测试代码
@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","李四");
}
运行后 
再谈传递参数
insert
到这里我们得停下来思考一下,我们已经学会了如何通过注解写sql语句,如何传递参数。 一个查询语句里所需要的参数可能只有那么一两个。insert语句就必须要把非null的字段列写出来。如果需要插入的字段很多,将每个参数都写在方法签名中会非常麻烦并且难以维护。
这时候我们需要直接传递一个对象。 我们上面创建过一个实体信息类,用于接收来自sql里返回对象。 这里也可以创建一个对象,我们将这个对象传递进去。 MyBatis会自动的通过这个实体信息类的Getter方法获取里面的属性,并填充到对应的字段中。 这里注意啊,上面我们说过,如果你不写@Param,那么这个实体信息类的属性名字和sql语句字段名称一定要保持一致。
@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 目录下
spring:
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志这句可以不加
map-underscore-to-camel-case: true # 这句是自动转换



