目录
Mybatis入门
什么是MyBatis?
- MyBatis是一款优秀的 持久层框架,用于简化JDBC的开发。
- MyBatis本是 Apache的一个开源项目iBatis, 2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
- 官网:mybatis – MyBatis 3 | 简介
而上面呢,提到了两个词:一个是持久层,另一个是框架。
A. 持久层:指的是就是数据访问层(dao),是用来操作数据库的。
B. 框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。在框架的基础上进行软件开发更加高效、规范、通用、可拓展。
接下来,我们就通过一个入门程序,让大家快速感受一下通过Mybatis如何来操作数据库。
1. 快速入门
需求:查询所有用户数据
1.1 创建springboot工程
创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包。
JDK全部选择 8 版本即可。
1.2 数据准备
创建用户表user,创建对应的实体类 User。
- 用户表:
create table user(
id int unsigned primary key auto_increment comment 'ID',
name varchar(100) comment '姓名',
age tinyint unsigned comment '年龄',
gender tinyint unsigned comment '性别, 1:男, 2:女',
phone varchar(11) comment '手机号'
) comment '用户表';
insert into user(id, name, age, gender, phone) VALUES (null,'白眉鹰王',55,'1','18800000000');
insert into user(id, name, age, gender, phone) VALUES (null,'金毛狮王',45,'1','18800000001');
insert into user(id, name, age, gender, phone) VALUES (null,'青翼蝠王',38,'1','18800000002');
insert into user(id, name, age, gender, phone) VALUES (null,'紫衫龙王',42,'2','18800000003');
insert into user(id, name, age, gender, phone) VALUES (null,'光明左使',37,'1','18800000004');
insert into user(id, name, age, gender, phone) VALUES (null,'光明右使',48,'1','18800000005');
- 实体类
在创建出来的springboot工程中,在引导类所在包下,在创建一个包 pojo。然后创建一个类 User。实体类的属性名,需要与表中的字段名一一对应。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
1.3 配置
编写application.properties,配置数据库连接信息。我们要连接数据库,就需要配置数据库连接的基本信息,包括:username,password,url 还要一个数据库驱动类的类名。
在入门程序中,大家可以直接这么配置,后面会介绍什么是驱动。
application.properties:
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/db03
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
上述的配置,可以直接复制过去,不要敲错了。 全部都是 spring.datasource.xxxx 开头。
1.4 持久层接口
在创建出来的springboot工程中,在引导类所在包下,在创建一个包 mapper。在mapper包下创建一个接口 UserMapper 。
@Mapper
public interface UserMapper {
@Select("select * from user")
public List<User> list();
}
1.5 单元测试
在创建出来的SpringBoot工程中,在src下的test目录下,已经自动帮我们创建好了测试类 ,并且在测试类上已经添加了注解 @SpringBootTest,代表该测试类已经与SpringBoot整合。
该测试类在运行时,会自动通过引导类加载Spring的环境(IOC容器)。我们要测试那个bean对象,就可以直接通过@Autowired注解直接将其注入进行,然后就可以测试了。
测试代码如下:
@SpringBootTest
class SpringbootMybatisDemo01ApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
List<User> list = userMapper.list();
for (User user : list) {
System.out.println("user = " + user);
}
}
}
1.6 解决SQL警告与提示
默认我们在UserMapper接口上加的@Select注解中编写SQL语句是没有提示的。 如果想让idea给我们提示对应的SQL语句,我们需要在IDEA中配置与MySQL数据库的链接。
并且,在配置的时候必须指定连接那个数据库,如上图所示。
2. JDBC介绍(了解)
2.1 介绍
通过Mybatis的快速入门,我们明白了,通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白,其实java语言操作数据库呢,只能通过一种方式,那就是sun公司提供的 JDBC 规范。其实Mybatis框架呢,是对原始的JDBC程序的封装。
那到底什么是JDBC呢,接下来,我们就来介绍一下。
- JDBC: ( Java DataBase Connectivity ),就是使用Java语言操作关系型数据库的一套API。
- 本质:
A. sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
B. 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
C. 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.2 代码
那springboot整合mybatis来完成数据库查询操作,这个入门程序我们已经开发完毕了,那接下来,我们再回过头来看看原始的JDBC程序是如何操作数据库的。
具体的操作步骤如下:
- 注册驱动
- 获取连接对象
- 执行SQL语句,返回结果
- 封装结果数据
- 释放资源
具体的代码实现为:
/**
* 通过JDBC程序实现查询全部用户操作
*/
@Test
public void testJdbc() throws Exception {
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取数据库连接
String url="jdbc:mysql://localhost:3306/db03";
String username = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, username, password);
//3. 执行SQL ----> select * from user;
Statement statement = connection.createStatement(); // 执行SQL语句
ResultSet resultSet = statement.executeQuery("select * from user");
List<User> userList = new ArrayList<>();
//4. 解析结果
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
short gender = resultSet.getShort("gender");
String phone = resultSet.getString("phone");
User user = new User(id,name,age,gender,phone);
userList.add(user);
}
for (User user : userList) {
System.out.println(user);
}
//5. 释放资源
statement.close();
connection.close();
}
通过上述代码,我们看到直接基于JDBC程序来操作数据库,代码实现非常繁琐,所以在项目开发中,我们很少使用。 在项目开发中,通常会使用Mybatis这类的高级技术来操作数据库,从而简化数据库操作、提高开发效率。
2.3 问题分析
我们发现上述原始的JDBC程序,存在以下几点问题:
A. 数据库链接的四要素(驱动、链接、用户名、密码)全部硬编码在java代码中。
B. 查询结果的解析及封装非常繁琐。
C. 每一次查询数据库都需要获取连接,操作完毕后释放连接, 资源浪费, 性能降低。
2.4 技术对比
分析了JDBC的缺点之后,我们再回过头看看springboot整合mybatis之后,是如何解决这些问题的:
A. 数据库连接四要素(驱动、链接、用户名、密码),配置在了springboot默认的配置文件 application.properties中。
B. 查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注。
C. 在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。
经过这一对比之后,我们发现通过SpringBoot整合Mybatis的形式来操作数据库,在对比中完胜!!!
而对于Mybatis来说呢,我们在开发持久层程序,操作数据库时,需要重点关注的就是 application.properties 的配置 、 Mapper接口定义 以及 SQL语句的定义。
3. 数据库连接池
3.1 介绍
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
- 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
- 好处
-
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
之前我们代码中使用连接是没有使用都创建一个Connection对象,使用完毕就会将其销毁。这样重复创建销毁的过程是特别耗费计算机的性能的及消耗时间的。
而数据库使用了数据库连接池后,就能达到Connection对象的复用,如下图
连接池是在一开始就创建好了一些连接(Connection)对象存储起来。用户需要连接数据库时,不需要自己创建连接,而只需要从连接池中获取一个连接进行使用,使用完毕后再将连接对象归还给连接池;这样就可以起到资源重用,也节省了频繁创建连接销毁连接所花费的时间,从而提升了系统响应的速度。
3.2 产品
- 常见的数据库连接池
-
- C3P0
- DBCP
- Druid
- Hikari (springboot默认)
我们现在使用更多的是默认的Hikari、Druid,它的性能比其他两个会好一些。
- Druid(德鲁伊)
-
- Druid连接池是阿里巴巴开源的数据库连接池项目
- 功能强大,性能优秀,是Java语言最好的数据库连接池之一
如果我们想把默认的数据库连接池切换为 Druid 数据库链接,只需要进行如下两部操作即可:
1). 在pom.xml文件中引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
2). 在application.properties中引入数据库连接配置 (可选,也可以使用 spring.datasource.xxxxx)
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/db03
spring.datasource.druid.username=root
spring.datasource.druid.password=root
4. lombok
4.1 介绍
Lombok是一个实用的java工具包,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。
注解 | 作用 |
@Getter/@Setter | 为所有的属性提供get/set方法 |
@ToString | 会给类自动生成易阅读的 toString 方法 |
@EqualsAndHashCode | 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法 |
@Data | 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode) |
@NoArgsConstructor | 为实体类生成无参的构造器方法 |
@AllArgsConstructor | 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。 |
@Slf4j | private static final Logger log = LoggerFactory.getLogger(LogExample.class); |
注意: Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件。
4.2 使用
1). pom.xml 文件中引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2). 在定义的实体类上添加注解
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
一旦我们在实体类上添加了 @Data 注解,那么这个类在编译时期,就会生成GET、SET方法、toString方法、hashCode 、equals 方法等等。这样我们就免去了臃肿的代码。