目录
一、JDBC规范【了解】
1. JDBC介绍
2. JDBC示例
3. JDBC的问题
二、MyBatis入门【重点】
1. Mybatis是什么
2. Mybatis使用步骤
3. Mybatis入门案例
1.创建SpringBoot工程
2.创建Mapper
3.功能测试
三、连接池【了解】
1. 什么是连接池
2. 有哪些数据库连接池
3. 如何在项目里使用Druid连接池
四、Lombok【重点】
1. Lombok介绍
2. Lombok用法
3. 使用示例
一、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;
}