欢迎光临
我们一直在努力

MyBatis入门·注解操作

目录

  • 前言
  • 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: 这里填写你自己设置的密码
driverclassname: 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","李四");
}

运行后 在这里插入图片描述

再谈传递参数
  • 传递一个参数 我们在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语句字段名称一定要保持一致。

    @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 # 这句是自动转换


    总结

  • MyBatis 是一个用于简化 JDBC 操作的持久层框架,主要配置包括数据源连接和开启相关驼峰命名映射等。
  • 通过 @Select、@Delete、@Update 和 @Insert 注解,我们可以方便地将 SQL 语句绑定到 Mapper 接口方法上完成增删改查。
  • 传递参数时,单个参数名称可随意,多个参数需使用 @Param 明确映射;当字段较多时,推荐直接传递对象,让 MyBatis 自动根据属性名填充。
  • 使用 @SpringBootTest 和 @Test 可以十分便捷地加载 Spring 容器并进行接口功能的测试验证。
  • 赞(0)
    未经允许不得转载:171主机测评 » MyBatis入门·注解操作
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址