【MyBatis】深入解析 MyBatis:通过简单编写持久层代码解析 @Select、@Mapper 和通过单元测试解析 @SpringBootTest 的使用方法和自动生成idea测试类测试类方法
MyBatis操作数据库操作数据准备写持久层代码@ Select的使用方法@ Mapper的使用方法单元测试使用idea自动生成测试类测试类获取启动类对象规范方法正确导入上下文对应包Stream( )对应的循环打印API应用分层单元测试补充: @BeforeEach & @AfterEach



MyBatis 操作数据库操作
数据准备
创建用户表,并创建对应的实体类User。
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使用数据库
USE mybatis_test;
-- 创建表[用户表]
DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(127) NOT NULL,
`password` VARCHAR(127) NOT NULL,
`age` TINYINT(4) NOT NULL,
`gender` TINYINT(4) DEFAULT '0' COMMENT '1-男 2-女 0-默认',
`phone` VARCHAR(15) DEFAULT NULL,
`delete_flag` TINYINT(4) DEFAULT 0 COMMENT '0-正常, 1-删除',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
-- 添加用户信息
INSERT INTO user_info(username, `password`, age, gender, phone)
VALUES ('admin', 'admin', 18, 1, '18612340001');
INSERT INTO user_info(username, `password`, age, gender, phone)
VALUES ('zhangsan', 'zhangsan', 18, 1, '18612340002');
INSERT INTO user_info(username, `password`, age, gender, phone)
VALUES ('lisi', 'lisi', 18, 1, '18612340003');
INSERT INTO user_info(username, `password`, age, gender, phone)
VALUES ('wangwu', 'wangwu', 18, 1, '18612340004');
规范:
- 数据库字段:
- 全部小写,单词之间用下划线"
_"分割- Java 字段:
- 属性使用小驼峰来表示
SQL:on update


创建对应的实体类UserInfo。
实体类的属性名与表中的字段名一一对应。
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private Integer id;
private String username;
private String password;
private Integer age;
private Integer gender;
private String phone;
private Integer deleteFlag;
private Date createTime;
private Date updateTime;
}

写持久层代码
在项目中,创建持久层接口UserInfoMapper:

接下来,我们在 idea 中实现一个简单的 SQL 语句;

@ Select 的使用方法

通过 @Select 注解,我们也不需要再创建一个接口类来实现接口,再把该类交给 Spring 管理,Mybatis 会根据该注解,自动实现接口中的方法,并且把接口实例化成对象,再存入容器中;
@ Mapper 的使用方法

- Mybatis 的
持久层接口规范一般都叫XxxMapper;
@ Mapper注解:
- 表示是
MyBatis中的Mapper接口。- 程序运行时,框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理。
@ Select 注解:
- 代表的就是 select 查询,也就是注解对应方法的具体实现内容。
以上两个注解都是来自 ibatis,而不是来自 Spring;
Mybatis 和 Spring 无关,ibatis 是 Mybatis 的前身;
单元测试
在创建出来的SpringBoot工程中,在src下的test目录下,已经自动帮我们创建好了测试类,我们可以直接使用这个测试类来进行测试。
使用 idea 自动生成测试类

测试代码(1)
@ SpringBootTest 的使用方法和依赖说明

测试类上添加了注解 @SpringBootTest,该测试类在运行时,就会自动加载 Spring 的运行环境。测试类需要使用 Spring 的运行环境,比如注入某个 bean ,才需要使用到
@SpringBootTest注解;我们通过
@Autowired这个注解,注入我们要测试的类,就可以开始进行测试了。

运行结果如下:

返回结果中,可以看到,只有SQL语句中查询的列对应的属性才有赋值。
测试代码(2)
我们再举一个测试类的例子:

测试类获取启动类对象规范方法
在 IoC 章节的学习中我们了解到,直接修改启动类中创建一个对象,再从其他类中获取的方法是不合理的;

我们可以采取直接注入的方法,来获取启动类的对象:

正确导入上下文对应包
我们重新导入正确的包:


Stream( ) 对应的循环打印 API

程序运行结果:

上图的打印方式是通过 lamda 表达式进行循环打印
bean 就是 UserInfoMapper(用来操作数据库的"工具");

selectAll() 是在 UserInfoMapper 里写的方法(对应SQL:select * from user_info)
结果:从数据库拿到了所有的用户数据,存在一个 List<UserInfo> 列表里:
下图表示的是两种等价的打印方式,stream() 只是更简洁的写法,适合简单的遍历操作

应用分层
应用分层:


重新启动程序,打开页面 :127.0.0.1:8080/user/getAllUser

单元测试补充:@BeforeEach & @AfterEach


自动生成方法:

说明:
@BeforeEach,@AfterEach 表示的是每一个测试方法执行前执行/每一个测试方法执行后执行;
这两个注解针对一个测试类的所有测试方法生效,有几个测试方法就会执行几次;
运行测试代码:



更多推荐






所有评论(0)