本节目标
- 使用MyBatis完成简单的增删改查操作,参数传递
- 掌握MyBatis的两种写法:注解和XML方式
- 掌握MyBatis相关的日志配置
前言
在应用分层学习中,我们了解web应用程序一般分为三层,即Controller、Service、Dao。在之前的案例中,请求流程如下:浏览器发起请求,先请求Controller,Controller接收到请求之后,调用Service进行业务逻辑处理,Service再调用Dao,但是Dao层的数据是Mock的,真实的数据应该从数据库中读取。
我们学习MySQL数据库时,已经学习了JDBC来操作数据库,但是JDBC操作太复杂了。
JDBC操作示例回顾
- 创建数据库连接池DataSource
- 通过DataSource获取数据库连接Connection
- 编写要执行带?占位符的SQL语句
- 通过Connection及SQL创建操作命令对象Statement
- 替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
- 使用Stament执行SQL语句
- 查询操作:返回结果集ResultSet,更新操作:返回更新的数量
- 处理结果集
- 释放资源
从上述流程可以看出,对于JDBC来说,整个操作非常的繁琐,那么有没有一种方法,可以更简单、更方便的操作数据库呢?
目录
一、什么是MyBatis?
- MyBatis是一款优秀的持久层框架,用于简化JDBC的开发
- MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到google code,并改名为MyBatis。
持久层:指的就是持久化操作的层,通常指数据访问层(dao),用来操作数据库的。
简单来说MyBatis是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据工具
二、MyBatis入门
MyBatis操作数据库的步骤:
- 准备工作(创建springboot工程、数据库表准备,实体类)
- 引入MyBatis的相关依赖,配置MyBtis(数据库连接信息)
- 编写SQL语句(注解/XML)
- 测试
2.1 准备工作
2.1.1 创建工程
创建springbboot工程,并导入MyBatis的依赖,MySQL的驱动包
2.1.2 数据准备
创建用户表,并创建对应的实体类UserInfo
-- 创建数据库
DROP DATABASE IF EXISTS mybatis_test;
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;
-- 使用数据数据
USE mybatis_test;
-- 创建表[用户表]
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 mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_test.userinfo ( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
创建对应的实体类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;
}
2.2 配置数据库连接字符串
MyBatis中要连接数据库,需要数据库相关参数配置
- MySQL驱动类
- 登录名
- 密码
- 数据库连接字符串
如果是application.yml文件,配置内容如下:
#数据库连接配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
username: root
password: 111111
driver-class-name: com.mysql.cj.jdbc.Driver
2.3 写持久层代码
在项目中,创建持久层接口UserInfoMapper
import com.example.MyBatis.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();
}
MyBatis的持久层接口规范一般都叫xxxMapper
@Mapper注解:表示是MyBatis中的Mapper接口
- 程序运行时,框架会自动生成接口的实现类对象(代理对象),并交给Spring的IOC容器管理
- @Select注解:代表的就是select查询,也就是注解对应方法的具体实现内容
使用IDEA自动生成测试类
1、在需要测试的Mapper接口中,右键->Generate->Test
2、书写测试代码
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class UserInfoMapperTest {
@Autowired
private UserInfoMapper userInfoMapper;
@Test
void getUserInfoAll() {
System.out.println(userInfoMapper.getUserInfoAll());
}
}
测试类上添加了注解@SpringBootTest,在测试类在运行时,就会自动加载Spring的运行环境。我们通过@Autowired这个注解,注入我们要测试的类,就可以开始进行测试了。
运行结果如下:
三、MyBatis的基本操作
上面我们学习了MyBatis的查询操作,接下来我们学习MyBatis的增,删,改操作,在学习这些操作之前,我们先来学习MyBatis日志打印。
3.1 打印日志
在MyBatis当中我们可以借助日志,查看sql语句的执行、执行传递的参数以及执行结果。
在配置文件中进行配置即可
mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
重新运行程序,可以看到SQL执行内容,以及传递参数和执行结果。
3.2 参数传递
需求:查询id=2的用户,对应的SQL语句就是:select * from userinfo where id = 2
但是这样的话,只能查找id=2的数据,所以SQL语句中的id值不能写成固定的值,需要变为动态的数值。解决办法:在方法中添加一个参数,将方法中的参数,传给SQL语句,