优秀持久层框架——MyBatis
何为MyBatis
在Java程序中如果想要操作数据库,可以使用官方提供的API——JDBC
,但从开发效率而言,直接使用原生的JDBC
进行开发,代码冗杂、开发效率低,所以说在开发中使用的是一些基于原生JDBC搭建的高级框架
。而MyBatis
就是一个优秀的持久层(三层架构中的DAO)框架,其主要用于简化JDBC的开发;MyBatis的底层实现就是JDBC
,但是对其进行了高度的封装,从而能够更好的进行数据库操作。
使用MyBatis
准备工作
因为现在大部分的项目都是基于SpringBoot框架
开发的,所以说本文基于SpringBoot项目来讲解MyBatis
。
创建SpringBoot工程,引入MyBatis相关依赖
想要使用MyBatis框架
,那么肯定需要在创建SpringBoot工程的时候引入MyBatis的依赖
,而且不但需要引入MyBatis框架的依赖,还需要引入MySQL的驱动
(根据使用的数据库来引入对应的数据库驱动),这是因为因为MyBatis的底层是基于JDBC的实现的
,而JDBC真正执行的代码是各个厂商是各个厂商驱动jar包中的实现类。所以说使用JDBC或者基于JDBC实现的框架
操作数据库时,对应的数据库的驱动是必不可少的。
准备数据库表user、实体类User
准备数据库表user
来进行查询,并将查询出来的结果封装成对应的User实体对象
。因为MyBatis是一个持久层框架,持久层在三层架构中是数据访问层,是要从数据库中查询数据并给Service层返回数据的,为了方便返回数据,也为了Service层使用这些数据,持久层会对从数据库中查询出来的数据进行封装,封装成一个Java中的实体类
,便于后续的操作。
建表:
create table user(
id int unsigned primary key auto_increment comment 'ID,主键',
username varchar(20) comment '用户名',
password varchar(32) comment '密码',
name varchar(10) comment '姓名',
age tinyint unsigned comment '年龄'
) comment '用户表';
insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
(2, 'xiaoqiao', '123456', '小乔', 18),
(3, 'diaochan', '123456', '貂蝉', 24),
(4, 'lvbu', '123456', '吕布', 28),
(5, 'zhaoyun', '12345678', '赵云', 27);
创建对象:
package com.wzb.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
private String name;
private Integer age;
}
配置Mybatis
因为MyBatis底层还是基于JDBC操作数据库
的,所以说我们想要使用MyBatis也是需要配置数据库的连接信息
的,但是和原生的JDBC有所不同,原生的JDBC是直接在源代码中进行配置的(硬编码问题),但MyBatis中是在SpringBoot提供的application.properties
文件中配置的数据库连接信息:
完成准备工作之后,就可以开始编写MyBatis程序了。
编写MyBatis程序
编写MyBatis的持久层接口,在接口上添加注解@Mapper
,代表要使用注解的方式定义SQL语句,完成数据库操作。
MyBatis
框架中的持久层接口按照规范都是叫……Mapper(也叫做Mapper接口),这是因为: MyBatis 最初受到iBatis
的影响(MyBatis以前叫iBatis)。在iBatis中,就使用 “Mapper” 这个术语来表示数据访问对象(DAO),用于将数据库操作(如查询、插入、更新、删除)映射到 Java 方法。当MyBatis从iBatis发展而来时,延续了这个命名习惯。还有更重要的一点是: “Mapper” 这个词本身有 “映射器” 的意思。 在MyBatis的持久层接口中,它的主要作用就是将SQL语句和Java方法进行映射
。
package com.wzb.mapper;
import com.wzb.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> selectAll();
}
MyBatis可以将数据库表中的字段和实体类中的属性一一对应
(数据库表中的字段名和实体类属性名最好相同),会将从数据库中查询的数据自动封装成对应的实体对象
(此处是封装为User
对象);并且,若查询结果是多条数据
,将会封装成多个实体对象,并将多个对象封装为一个集合
(此处是封装为一个UserList集合)所以说该方法是返回的一个User集合。
测试MyBatis
package com.wzb;
import com.wzb.mapper.UserMapper;
import com.wzb.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
// 这是SpringBoot框架中的单元测试注解,当测试类的测试方法运行时,就会启动SpringBoot项目
// SpringBoot项目启动了,IOC容器就创建好了,若想测试IOC容器中的bean就可以直接注入了
class JavaWeb05MyBatisApplicationTests {
private UserMapper userMapper;
@Autowired
public JavaWeb05MyBatisApplicationTests(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Test
public void testSelectAll() {
List<User> userList = userMapper.selectAll();
for (User user : userList) {
System.out.println(user);
}
}
}
在SpringBoot的测试类
中编写代码,获取UserMapper
的返回结果并遍历输出,发现成功获得了user表中的所有数据,并且将这些数据封装成了userList的集合:
注意:在SpringBoot项目中,测试类所在的包必须和项目的引导类(启动类)的包名相同(或者放在引导类所在的包的子包下),而自带的test包中的测试类就是按照这个规则创建的,可以直接在其中写测试方法。