目录
一、JDBC规范【了解】
1. JDBC介绍
Java DataBase Connectivity,是Java连接数据库,是Sun公司提供的的API规范,用于执行SQL语句。是一切Java操作数据库的基础技术。
Java里的“规范”,通常指的是接口
JDBC的作用:实现Java程序对不同数据库的统一访问
数据库驱动:由数据库厂商提供的,实现了JDBC接口规范的一些API实现类,这些类打成jar包,我们称为驱动包
-
操作什么数据库,就要有什么驱动包
-
如果要操作MySQL,就必须有MySQL驱动包:我们有maven坐标
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
2. JDBC示例
准备数据库表
create database if not exists db3;
use db3;
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');
准备实体类
public class User {
private Integer id;
private String name;
private Integer age;
private Integer gender;
private String phone;
//get 和 set方法,略
//toString方法,略
}
JDBC示例
package com.itheima;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class DemoJdbc {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//3. 创建SQL执行平台
PreparedStatement pstmt = conn.prepareStatement("select * from user");
//4. 执行SQL
ResultSet resultSet = pstmt.executeQuery();
//5. 处理结果
List<User> userList = new ArrayList<>();
while (resultSet.next()) {
User user = new User();
int id = resultSet.getInt("id");
user.setId(id);
String name = resultSet.getString("name");
user.setName(name);
int age = resultSet.getInt("age");
user.setAge(age);
int gender = resultSet.getInt("gender");
user.setGender(gender);
String phone = resultSet.getString("phone");
user.setPhone(phone);
userList.add(user);
}
//6. 释放资源
resultSet.close();
pstmt.close();
conn.close();
userList.forEach(System.out::println);
}
}
3. JDBC的问题
-
硬编码问题:数据库连接信息等等参数,都在Java源码里写死了。如果将来部署到生产环境后,需要调整配置,就不得不修改源码
Mybatis整合SpringBoot,把所有参数写到了配置文件,可以很方便的修改,而不用修改源码
-
操作太繁琐:执行一条SQL语句,要写十几行甚至几十行代码
Mybatis对JDBC做了再封装,执行一条SQL只需要很少的代码就能实现
-
性能不够强:每次操作数据库,Java程序都会与数据库建立连接、创建Connection对象;操作完成要释放关闭掉。在数据库操作高峰期,会有频繁的对象创建与销毁,非常消耗性能
Mybatis使用了连接池技术解决这个问题
二、MyBatis入门【重点】
1. Mybatis是什么
MySQL是持久层Dao层的框架,它用于简化JDBC的操作。
拓展:目前持久层的框架,常见的有:
Mybatis:目前国内最流行的Dao层框架
Hibernate:国内使用的少了,国外使用的很多。国内的一些老项目,可能使用的是Hibernate
SpringData JPA:对持久层的技术再封装,比如对Hibernate再封装,提供了更简便的操作
2. Mybatis使用步骤
-
准备数据库和表:前边JDBC里已经准备过了,略
-
准备一个maven工程:
创建一个SpringBoot工程,添加依赖、配置文件、引导类
-
使用Mybatis操作数据库
准备实体类:一张表通常要准备一个类。类的属性和表的字段要对应
修改配置文件:准备数据库的连接信息,包括驱动类名、地址、帐号、密码
编写一个接口,接口里写一个方法,方法上配置SQL语句
调用这个接口的方法,就可以了
3. Mybatis入门案例
1.创建SpringBoot工程
如果要创建空的maven工程,改造成SpringBoot工程,只需要三件事:
-
依赖:SpringBoot父工程坐标和起步依赖
<!-- SpringBoot父工程坐标 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
</parent>
<dependencies>
<!--mybatis的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- mysql驱动包, 刚刚发布的最新版本的驱动包-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<!--springboot单元测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-
配置:创建一个名称为
application.properties
的文件,放到src\main\resources
目录里 -
引导类:创建一个引导类,固定写法
@SpringbootApplication
public class 引导类名{
public static void main(String[] args){
SpringApplication.run(引导类.class, args);
}
}
准备配置文件
修改application.properties
文件,添加如下配置:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db3
spring.datasource.username=root
spring.datasource.password=root
准备实体类
前边JDBC部分已经创建了User类,直接复制过来使用即可
2.创建Mapper
package com.itheima.mapper;
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 1. Mapper接口,名称通常是XxxMapper,比如UserMapper、DeptMapper
* 2. Mapper接口,上边加@Mapper注解,目的是让SpringBoot扫描这个注解,生成它的对象放到IoC容器里。类似于@Controller、@Service
*/
@Mapper
public interface UserMapper {
/**
* 查询所有用户,得到List<user>
*/
@Select("select * from user")
List<User> queryAll();
}
3.功能测试
注意:
-
单元测试类上需要加
@SpringBootTest
,然后才可以在测试类里使用@Autowired注入
package com.itheima;
import com.itheima.mapper.UserMapper;
import com.itheima.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
public class MybatisTest {
@Autowired
private UserMapper userMapper;
@Test
public void testQueryAll(){
List<User> userList = userMapper.queryAll();
userList.forEach(System.out::println);
}
}
三、连接池【了解】
1. 什么是连接池
池化思想,用于提供有限数量的资源对象,重复利用,可以减少频繁创建对象与销毁对象的开销。
-
创建池子:在池子里初始化一堆对象,备用
-
使用的时候:如果需要使用,就从池子里取出一个进行使用;使用完成,再把对象交还到池子里
-
例如:线程池,数据库连接池
数据库连接池:
-
只需要池子里准备少量的Connection连接对象,就可以支持海量的数据库操作。因为这些对象是可以循环使用的
-
避免频繁创建Connection与数据库建立连接所造成的资源开销,从而大大提升性能
2. 有哪些数据库连接池
-
DBCP:比较早的连接池,早期Tomcat内置的有这种连接池
-
C3P0:使用相对广泛的连接池
-
Druid:德鲁伊,Alibaba提供的连接池技术,它以丰富的功能著称,除了连接池的基本功能,还具备数据库的监控能力
-
HikariCP:以性能著称的连接池,SpringBoot官方内置了HikariCP连接池,默认使用的
所有连接都有相同的使用规范:
-
所有连接池类都必须实现
javax.sql.DataSource
接口 -
从任意连接池里获取连接的方法,都是
getConnection()
3. 如何在项目里使用Druid连接池
1.添加druid的起步依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
2.配置一下,指定使用Druid连接池:只要修改application.properties文件
#没有指定使用哪种连接池,默认使用的是HikariCP
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_homework
#spring.datasource.username=root
#spring.datasource.password=root
#如果想指定使用Druid连接池
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis_homework
spring.datasource.druid.username=root
spring.datasource.druid.password=root
四、Lombok【重点】
1. Lombok介绍
Lombok是一个插件,目前已经被idea内置进去了。
用于在代码编译过程中,帮我们生成一些代码。从而让我们的代码更简洁
2. Lombok用法
-
添加lombok的依赖坐标
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.使用Lombok简化代码:通过注解实现的
-
@Data
:加在实体类上,Lombok会帮我们给实体类生成无参构造、所有成员变量的get和set方法、toString、equals、hashCode等等方法 -
@NoArgsConstructor
:加在实体类上,Lombok会帮我们生成无参构造 -
@AllArgsConstructor
:加在实体类上,Lombok会帮我们生成全参构造 -
@Getter
:生成get方法的。可以加在类上,也可以加在某个成员变量上 -
@Setter
:生成set方法的。可以加在类上,也可以加在某个成员变量上
3. 使用示例
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer id;
private String username;
private String password;
private String name;
private Integer gender;
private String image;
private Integer job;
}