一、JDBC规范
1. JDBC介绍
JDBC ,是Java数据库连接技术,是Sun公司提供的API规范,用于执行SQL语句。是一切Java操作数据库的基础技术。
JDBC的作用:实现Java程序对不同数据库的统一访问。
数据库驱动:由数据库厂商提供的,实现JDBC接口规范的一些API实现类,这些类打成jar包,我们称为驱动包。
- 操作什么数据库,就要提供什么驱动包
- 如果要操作MySQL,就必须有MySQL驱动包
JDBC访问数据库步骤:
- 加载JDBC驱动程序
- 创建数据库的连接
- 创建preparedStatement
- 执行SQL语句
- 处理结果集
- 关闭JDBC对象资源
2. JDBC示例
准备数据库表
mysql
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,'2','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');
准备实体类
java
public class User {
private Integer id;
private String name;
private Integer age;
private Integer gender;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", phone='" + phone + '\'' +
'}';
}
}
JDBC
java
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的问题
- 每次要加载驱动,连接信息是硬编码
- sql和Java代码耦合在一起,改动不易
- 参数设置缺少灵活性
- 处理结果集麻烦,不能自动映射到实体类
- 连接资源不能复用,资源浪费
二、MyBatis
1. Mybatis是什么?
Mybatis是持久层Dao层的框架,它用于简化JDBC的操作。
拓展:目前持久层的框架,常见的有:
- Mybatis:目前国内最流行的Dao层框架
- Hibernate:国内使用的少了,国外使用的很多。国内的一些老项目,可能使用的是Hibernate
- SpringData JPA:对持久层的技术再封装,比如对Hibernate再封装,提供了更简便的操作
2. Mybatis使用步骤
-
准备数据库和表:前边JDBC里已经准备过了,略
-
准备一个maven工程,添加依赖、配置文件、引导类
依赖:在pom.xml里需要 锁定SpringBoot版本号、添加需要的起步依赖坐标
配置:在src\main\resources里创建
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
(配置数据库的登录密码)
引导类:SpringBoot工程的引导类
-
准备实体类:一张表对应一个实体类, 表里一行记录封装成一个实体类的对象
要求实体类的属性 和 表的字段一一对应。包括名称、类型都要匹配
-
使用Mybatis
-
创建一个XxxMapper接口。是属于dao层的,通常放到com.xxx.mapper包里
-
接口上要加注解
@Mapper
-
接口里定义方法:
java@Select("select * from user") List<User> queryAll();
-
-
功能测试:
-
单元测试类上,需要加
@SpringBootTest
。如果不加,@Autowired是不会生效的 -
单元测试类的位置,也要放到 引导类所在包 下边。比如:
引导类在src\main\java的 com.sdf
里边
测试类要放到 src\test\java的 com.sdf
里边
3. Mybatis入门案例
3.1 准备工作
创建SpringBoot工程
如果要创建空的maven工程,改造成SpringBoot工程,只需要三件事:
-
依赖:SpringBoot父工程坐标和起步依赖
xml<!-- 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
目录里 -
引导类:创建一个引导类,固定写法
java
@SpringbootApplication
public class 引导类名{
public static void main(String[] args){
SpringApplication.run(引导类.class, args);
}
}
准备配置文件
修改application.properties
文件,添加如下配置:
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类,直接复制过来使用即可
3.1 创建Mapper
java
/**
* 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.2 功能测试
注意:
- 单元测试类上需要加
@SpringBootTest
,然后才可以在测试类里使用@Autowired注入
java
@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连接池
-
添加druid的起步依赖
xml<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency>
-
配置一下,指定使用Druid连接池:只要修改application.properties文件
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连接池 方式1: spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 方式2: 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的依赖坐标
xml<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
使用Lombok简化代码:通过注解实现的
@Data
:加在实体类上,Lombok会帮我们给实体类生成无参构造、所有成员变量的get和set方法、toString、equals、hashCode等等方法@NoArgsConstructor
:加在实体类上,Lombok会帮我们生成无参构造@AllArgsConstructor
:加在实体类上,Lombok会帮我们生成全参构造@Getter
:生成get方法的。可以加在类上,也可以加在某个成员变量上@Setter
:生成set方法的。可以加在类上,也可以加在某个成员变量上
3. 使用示例
java
@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;
}