JDBC
1.JDBC概述
JDBC,全称Java数据库连接(Java DataBase Connectivity),它是使用Java语言操作关系型数据库的一套API。
JDBC本质是官方(原SUN公司,现ORACLE)定义的一套操作所有关系型数据库的规则,即接口。各个数据库公司去实现这套接口,提供数据库驱动的jar包。我们可以使用这套接口JDBC编程,真正执行的代码是驱动jar包中的实现类。
JDBC的优点:
- 各数据库公司使用相同的接口,Java代码不需要针对不同数据库进行分别开发;
- 可随时替换底层数据库,访问数据库的Java代码基本不变。
2.JDBC快速入门
**第一步:**下载mysql驱动包,下载地址:https://downloads.mysql.com/archives/c-j/,如下图:
**第二步:**创建Java项目,并在该项目下创建lib
目录,并将解压后的驱动包放到该目录下,然后将该驱动包添加为库:
**第三步:**创建测试类:
java
package com.ztr;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/**
* JDBC测试类
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception {
// 第一步:注册驱动-mysql5.7后可省略该步骤
Class.forName("com.mysql.jdbc.Driver");
// 第二步:获取连接
// 连接数据库的url为固定格式,包含主机IP、端口号、数据库名、是否使用SSL加密连接等
String url = "jdbc:mysql://localhost:3306/student_system?useSSL=false&serverTimezone=UTC";
// 数据库的用户名和密码
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
// 第三步:定义SQL语句
String sql = "update tb_clazz set clazz_name = '2023软件技术1班' where id = 15";
// 第四步:创建Statment对象,用于执行SQL
PreparedStatement ps = conn.prepareStatement(sql);
// 第五步:执行SQL,得到结果集
int i = ps.executeUpdate();
System.out.println("影响的行数为:" + i);
// 第六步:释放资源-顺序:后创建的先释放
ps.close();
conn.close();
}
}
3.练习
使用JDBC代码对数据库进行增删改查操作。
4.数据库连接池
数据库连接池就是一个容器,它负责分配、管理数据库的连接(Connection),它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
- 优点:
- 资源复用
- 提升系统相应速度
- 避免数据库连接遗漏
数据库连接池连接池的实现通过一个标准接口:DataSource,该接口由官方(SUN)提供,但实现由第三方组织实现该接口。因此,也出现了很多基于该接口的数据库连接池,如DBCP、C3P0、Druid等。在项目中常用的Druid(德鲁伊)连接池是阿里巴巴开源的数据库连接池项目,它功能强大、性能优秀,是Java语言最好的数据库连接池之一。
5.Druid连接池入门
**第一步:**下载连接池jar包,下载地址:https://repo1.maven.org/maven2/com/alibaba/druid/
**第二步:**导入jar包到lib
目录,并添加到库中:
**第三步:**创建配置文件druid.properties
,内容如下:
text
driverClassName=com.mysql.jdbc.Driver
url= dbc:mysql://localhost:3306/student_system?useSSL=false&serverTimezone=UTC
username=root
password=root
# 初始化连接池数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
**第四步:**测试连接:
java
package com.ztr;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.util.Properties;
/**
* 德鲁伊连接池测试类
**/
public class DruidDemo {
public static void main(String[] args) throws Exception {
// 1.导入jar包
// 2.定义配置文件
// 3.加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/com/ztr/druid.properties"));
// 4.获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 5.获取连接
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
6.增删改查练习
-
需求:对商品品牌数据的增删改查
- 查询:查询所有的数据
- 添加:添加品牌
- 修改:根据id修改
- 删除:根据id删除
-
环境准备:
- 数据库表:
tb_brand
sql-- 删除数据表 drop table if exists tb_brand; -- 创建数据表 create table tb_brand ( -- id主键 id int primary key auto_increment, -- 品牌名称 brand_name varchar(20), -- 企业名称 company_name varchar(20), -- 排序字段 ordered int, -- 描述信息 description varchar(100), -- 状态:0:禁用,1:启用 status int ); -- 添加数据 insert into tb_brand (brand_name,company_name,ordered,description,status) values ('oppo','oppo技术有限公司',2,'高端智能手机',0), ('华为','华为技术有限公司','100','大数据通信',1), ('apple','苹果手机有限公司','99','世界最大手机经销商',1);
- 实体类:
Brand
javapackage com.ztr.pojo; /** * 品牌信息 * 实体类字段用小驼峰 * 基本数据类型的数据建议使用包装类型,避免出现空指针异常(基本类型有默认值) **/ public class Brand { // 品牌名称 private String brandName; // 企业名称 private String companyName; // 排序字段 private Integer ordered; // 描述信息 private String description; // 状态:0:禁用,1:启用 private Integer status; @Override public String toString() { return "Brand{" + "id=" + id + ", brandName='" + brandName + '\'' + ", companyName='" + companyName + '\'' + ", ordered=" + ordered + ", description='" + description + '\'' + ", status=" + status + '}'; } // id主键 private Integer id; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getBrandName() { return brandName; } public void setBrandName(String brandName) { this.brandName = brandName; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public Integer getOrdered() { return ordered; } public void setOrdered(Integer ordered) { this.ordered = ordered; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } }
- 测试用例
javapackage com.ztr.test; import com.alibaba.druid.pool.DruidDataSourceFactory; import com.ztr.pojo.Brand; import org.junit.Test; import javax.sql.DataSource; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Properties; /** * 品牌增删改查 **/ public class BrandTest { // 查询 @Test public void selectAll() throws Exception { ArrayList<Brand> list = new ArrayList<>(); // 1.获取连接对象connection // 1.1.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/com/ztr/druid.properties")); // 1.2.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 1.3.获取连接 Connection conn = dataSource.getConnection(); // 2.定义sql String sql = "select * from tb_brand"; // 3.获取执行sql的对象preperstatment PreparedStatement ps = conn.prepareStatement(sql); // 4.执行sql ResultSet rs = ps.executeQuery(); // 5.处理结果 List<Brand> 封装Brand对象,装在List集合 while(rs.next()) { // 获取数据 int id = rs.getInt("id"); String brandName = rs.getString("brand_name"); String companyName = rs.getString("company_name"); int ordered = rs.getInt("ordered"); String description = rs.getString("description"); int status = rs.getInt("status"); // 封装Brand对象 Brand brand = new Brand(); brand.setId(id); brand.setBrandName(brandName); brand.setCompanyName(companyName); brand.setOrdered(ordered); brand.setDescription(description); brand.setStatus(status); // 封装list集合 list.add(brand); } System.out.println(list); // 6.释放资源 rs.close(); ps.close(); conn.close(); } // 添加 @Test public void addBrand() throws Exception { ArrayList<Brand> list = new ArrayList<>(); // 1.获取连接对象connection // 1.1.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/com/ztr/druid.properties")); // 1.2.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 1.3.获取连接 Connection conn = dataSource.getConnection(); // 2.定义sql String sql = "insert into tb_brand (brand_name,company_name,ordered,description,status) values ('三星','韩国三星集团',100,'三星好手机',0)"; // 3.获取执行sql的对象preperstatment PreparedStatement ps = conn.prepareStatement(sql); // 4.执行sql int rs = ps.executeUpdate(); // 打印影响函数 System.out.println(rs > 0); // 6.释放资源 ps.close(); conn.close(); } // 修改 @Test public void updateBrand() throws Exception { ArrayList<Brand> list = new ArrayList<>(); // 1.获取连接对象connection // 1.1.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/com/ztr/druid.properties")); // 1.2.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 1.3.获取连接 Connection conn = dataSource.getConnection(); // 2.定义sql String sql = "update tb_brand set brand_name = '四川城职' where id=1"; // 3.获取执行sql的对象preperstatment PreparedStatement ps = conn.prepareStatement(sql); // 4.执行sql int rs = ps.executeUpdate(); // 打印影响函数 System.out.println(rs > 0); // 6.释放资源 ps.close(); conn.close(); } // 删除 @Test public void deleteBrand() throws Exception { ArrayList<Brand> list = new ArrayList<>(); // 1.获取连接对象connection // 1.1.加载配置文件 Properties prop = new Properties(); prop.load(new FileInputStream("src/com/ztr/druid.properties")); // 1.2.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(prop); // 1.3.获取连接 Connection conn = dataSource.getConnection(); // 2.定义sql String sql = "delete from tb_brand where id=1"; // 3.获取执行sql的对象preperstatment PreparedStatement ps = conn.prepareStatement(sql); // 4.执行sql int rs = ps.executeUpdate(); // 打印影响函数 System.out.println(rs > 0); // 6.释放资源 ps.close(); conn.close(); } }
- 数据库表: