在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao . 之前的案例中,请求流程如下: 浏览器发起请求, 先请求Controller, Controller接收到请求之后, 调⽤ Service进⾏业务逻辑处理, Service再调⽤Dao, 但是Dao层的数据是Mock的, 真实的数据应该从数据库中读取. 我们学习MySQL数据库时,已经学习了JDBC来操作数据库, 但是JDBC操作太复杂了,所以我们要学习MyBatis的真正原因,它可以帮助我们更方便、更快速的操作数据库。
1. 什么是MyBatis
1、MyBatis是一块优秀的持久层框架,用于简化JDBC的开发。
2、MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由Apache迁移到了google code,并且改名为MyBaits。2013年11月迁移到Github。
3、官网:MyBatis中文网
4、持久层:指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的。
MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具 ;
2. MyBatis入门
MyBatis操作数据库的步骤:
1、准备工作(创建Spring Boot工程、数据库表准备、实体类)。
2、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)。
3、编写SQL语句(注解 / XML)。
4、测试。
2.1 准备工作
2.1.1 创建工程
创建Spring Boot 工程,并且导入MyBatis的起步依赖、MySQL驱动包。
MyBatis是一个持久层框架,具体的数据存储和数据操作还是在MySQL中操作的,所以需要添加MySQL驱动。项目工程创建完成后,会自动在pom.xml文件中导入MyBatis依赖和MySQL驱动依赖,如图:
它们的版本会随着SpringBoot版本发生变化,SpringBoot 3.X 对应 MyBatis版本为 3.X,对应关系参考:mybatis-spring-boot-autoconfigure – Introduction ,如图:
2.1.2 数据准备
1、创建用户表,sql代码如下:
drop database if exists mybaties_test_0822;create database mybaties_test_0822 default character set utf8mb4;use mybaties_test_0822;
drop table if exists userinfo;
CREATE TABLE `userinfo` (`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 now(),`update_time` DATETIME DEFAULT now(),PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'shangjialu', '111111', 18, 1, '15809211621' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'shenmengyao', '222222', 18, 2, '18612340002' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'yuanyiqi', '333333', 18, 2, '18612340003' );
INSERT INTO mybaties_test_0822.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zuojinyuan', '555555', 18, 2, '18612340004' );
2、 创建对应的实体类,代码如下:
@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;
}
2.2. 配置数据库连接字符串
MyBatis中要连接数据库,需要数据库相关的参数配置:MySQL驱动类、登录名、密码、数据库连接字符串。
application.yml文件,配置内容如下
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybaties_test_0822?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: ******driver-class-name: com.mysql.cj.jdbc.Driver
application.properties文件,配置内容如下:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybaties_test_0822?
characterEncoding=utf8&useSSL=false
#连接数据库的⽤⼾名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=******
2.3 写持久层代码
在项目中,创建持久层接口UserInfoMapper,如图:
代码如下:
package com.example.zxslzw_mybaties.mapper;import com.example.zxslzw_mybaties.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select * from userinfoS")List<UserInfo> getUserInfoAll();
}
Mybatis的持久层接⼝规范⼀般都叫 XxxMapper :
@Mapper注解:表⽰是MyBatis中的Mapper接⼝ :程序运⾏时, 框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理 ;
@Select注解:代表的就是select查询,也就是注解对应⽅法的具体实现内容;
2.4 单元测试
在Spring Boot工程下中,src下的test目录中,已经自动帮我们创建好了测试类,我们可以直接使用这个测试类来进行测试,代码如下:
package com.example.zxslzw_mybaties.mapper;import com.example.zxslzw_mybaties.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid getUserInfoAll() {List<UserInfo> userInfos = userInfoMapper.getUserInfoAll();System.out.println(userInfos);}
}
测试类添加了注解@SpringBootTest,该测试类在运行时,就会自动加载Spring的运行环境。我们通过@Autowired这个注解,注入我们要测试的类,就可以开始进行测试了。
运行结果如下:
返回对应的结果,可以看到,只有SQL语句中查询的列中,只有和对应的列名一样,才会有显示(如果和数据库列名一样,就会有显示对应的信息;如果不一样,就不会显示对应信息的正确消息)。如图:
2.4.1 使用IDEA自动成成测试类
在你要测试的类中,鼠标右键 -> Generate -> Test -> 勾上对应要测试的方法,这里使用UserInfoMapper类做演示,如图:
点击OK,会在test目录下生成对应的测试类,如图:
测试类代码如下:
package com.example.zxslzw_mybaties.mapper;import com.example.zxslzw_mybaties.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface UserInfoMapper {@Select("select * from userinfo")List<UserInfo> getUserInfoAll();
}
2.4.2 使用程序运行代码
编写controller类,service类, controller类代码如下:
package com.example.zxslzw_mybaties.controller;import com.example.zxslzw_mybaties.model.UserInfo;
import com.example.zxslzw_mybaties.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/getUserAll")public List<UserInfo> getUserAll() {return userService.getUserAll();}
}
service类代码如下:
package com.example.zxslzw_mybaties.service;import com.example.zxslzw_mybaties.mapper.UserInfoMapper;
import com.example.zxslzw_mybaties.model.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserInfoMapper userInfoMapper;public List<UserInfo> getUserAll() {return userInfoMapper.getUserInfoAll();}
}
浏览器访问127.0.0.1:8080/user/getUserAll:
ps:本文的内容到这里就结束了,如果对你有所帮助的话,就请一键三连哦!!!
--------------------------------
上嘉路