JDBC教程+数据库连接池

JDBC

1.JDBC概述

​ JDBC,全称Java数据库连接(Java DataBase Connectivity),它是使用Java语言操作关系型数据库的一套API。

image-20240205211800441

​ JDBC本质是官方(原SUN公司,现ORACLE)定义的一套操作所有关系型数据库的规则,即接口。各个数据库公司去实现这套接口,提供数据库驱动的jar包。我们可以使用这套接口JDBC编程,真正执行的代码是驱动jar包中的实现类。

​ JDBC的优点:

  • 各数据库公司使用相同的接口,Java代码不需要针对不同数据库进行分别开发;
  • 可随时替换底层数据库,访问数据库的Java代码基本不变。

2.JDBC快速入门

**第一步:**下载mysql驱动包,下载地址:https://downloads.mysql.com/archives/c-j/,如下图:

**第二步:**创建Java项目,并在该项目下创建lib目录,并将解压后的驱动包放到该目录下,然后将该驱动包添加为库:

**第三步:**创建测试类:

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对象,用于执行SQLPreparedStatement ps = conn.prepareStatement(sql);// 第五步:执行SQL,得到结果集int i = ps.executeUpdate();System.out.println("影响的行数为:" + i);// 第六步:释放资源-顺序:后创建的先释放ps.close();conn.close();}
}

3.练习

​ 使用JDBC代码对数据库进行增删改查操作。

4.数据库连接池

​ 数据库连接池就是一个容器,它负责分配、管理数据库的连接(Connection),它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

  • 优点:
    • 资源复用
    • 提升系统相应速度
    • 避免数据库连接遗漏

image-20240215170718888

​ 数据库连接池连接池的实现通过一个标准接口:DataSource,该接口由官方(SUN)提供,但实现由第三方组织实现该接口。因此,也出现了很多基于该接口的数据库连接池,如DBCP、C3P0、Druid等。在项目中常用的Druid(德鲁伊)连接池是阿里巴巴开源的数据库连接池项目,它功能强大、性能优秀,是Java语言最好的数据库连接池之一。

5.Druid连接池入门

**第一步:**下载连接池jar包,下载地址:https://repo1.maven.org/maven2/com/alibaba/druid/

image-20240215171621310

**第二步:**导入jar包到lib目录,并添加到库中:

image-20240215171810035

**第三步:**创建配置文件druid.properties,内容如下:

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

**第四步:**测试连接:

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
    -- 删除数据表
    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
    package com.ztr.pojo;/*** 品牌信息* 实体类字段用小驼峰* 基本数据类型的数据建议使用包装类型,避免出现空指针异常(基本类型有默认值)**/
    public class Brand {// 品牌名称private String brandName;// 企业名称private String companyName;// 排序字段private Integer ordered;// 描述信息private String description;// 状态:0:禁用,1:启用private Integer status;@Overridepublic 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;}
    }
    • 测试用例
    package 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 {// 查询@Testpublic 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.定义sqlString sql = "select * from tb_brand";// 3.获取执行sql的对象preperstatmentPreparedStatement ps = conn.prepareStatement(sql);// 4.执行sqlResultSet 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();}// 添加@Testpublic 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.定义sqlString sql = "insert into tb_brand (brand_name,company_name,ordered,description,status) values ('三星','韩国三星集团',100,'三星好手机',0)";// 3.获取执行sql的对象preperstatmentPreparedStatement ps = conn.prepareStatement(sql);// 4.执行sqlint rs = ps.executeUpdate();// 打印影响函数System.out.println(rs > 0);// 6.释放资源ps.close();conn.close();}// 修改@Testpublic 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.定义sqlString sql = "update tb_brand set brand_name = '四川城职' where id=1";// 3.获取执行sql的对象preperstatmentPreparedStatement ps = conn.prepareStatement(sql);// 4.执行sqlint rs = ps.executeUpdate();// 打印影响函数System.out.println(rs > 0);// 6.释放资源ps.close();conn.close();}// 删除@Testpublic 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.定义sqlString sql = "delete from tb_brand where id=1";// 3.获取执行sql的对象preperstatmentPreparedStatement ps = conn.prepareStatement(sql);// 4.执行sqlint rs = ps.executeUpdate();// 打印影响函数System.out.println(rs > 0);// 6.释放资源ps.close();conn.close();}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470725.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果推出新型开源AI图像编辑模型“MGIE”;可汗学院辅助学习的GPT,Prompt 质量非常高

&#x1f989; AI新闻 &#x1f680; 苹果推出新型开源AI图像编辑模型“MGIE” 摘要&#xff1a;苹果公司最近发布了一个名为“MGIE”的开源人工智能模型&#xff0c;旨在通过自然语言指令对图片进行编辑。MGIE&#xff0c;全称MLLM-Guided Image Editing&#xff0c;依赖于多…

【DDD】学习笔记-对象图与聚合

类之间的关系 在理解领域驱动设计的聚合&#xff08;Aggregate&#xff09;之前&#xff0c;我们需要先理清面向对象设计中对象之间的关系。正如生活中我们不可能做到“鸡犬之声相闻&#xff0c;老死不相往来”一般&#xff0c;对象之间必然存在关系&#xff0c;如此才可以通力…

医院三基怎么搜题答案? #学习方法#学习方法#微信

在大学生的学习过程中&#xff0c;遇到难题和疑惑是常有的事情。然而&#xff0c;随着互联网的普及和技术的发展&#xff0c;搜题和学习软件成为了大学生们解决问题的利器。今天&#xff0c;我将向大家推荐几款备受大学生喜爱的搜题和学习软件&#xff0c;帮助我们更好地应对学…

CSS之BFC

BFC概念 BFC&#xff08;Block Formatting Context&#xff09;即块级格式化上下文&#xff0c;是Web页面的可视CSS渲染的一部分。它是一个独立的渲染区域&#xff0c;让其中的元素在布局上与外部的元素互不影响。简单来说&#xff0c;BFC提供了一个环境&#xff0c;允许内部的…

云原生之容器编排-Docker Swarm

1. 前言 上一篇我们讲到Docker Compose可以定义和运行多容器应用程序&#xff0c;用一个YAML配置文件来声明式管理服务&#xff0c;在一台安装了Docker engine的Linux系统上可以很好的工作&#xff0c;但是现实中不可能只有一台Linux系统&#xff0c;一台Linux系统不可能有足够…

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

文章目录 一、前言二、实验环境三、PyTorch数据结构0、分类1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09;查看可用gpu张量移动经典语句d…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

Apache 神禹(shenyu)源码阅读(三)——被网关路由的后端服务 Client 向 Admin 注册的数据传输(Client端)

前言 在真正测试 Divide 插件时&#xff0c;想要知道后端服务&#xff08;以下称为 Client&#xff09;是如何将自己的信息注册到管理台&#xff08;以下称为 Client&#xff09;。这里后端服务用的是 shenyu 自带的 http 的例子&#xff0c;项目名字为 shenyu-examples-http。…

问题:单层工业厂房柱子吊装时,其校正的内容包括( )。 #微信#经验分享#知识分享

问题&#xff1a;单层工业厂房柱子吊装时&#xff0c;其校正的内容包括(  )。 A、截面尺寸偏差 B、平面位置 C、标高 D、垂直度 E、柱的长度 参考答案如图所示

前端可能需要的一些安装

Node.js Node.js 官网 Node.js 中文网 Node.js is an open-source, cross-platform JavaScript runtime environment. Node.js是一个开源、跨平台的JavaScript运行时环境。Recommended for most users 推荐大多数用户使用哔哩哔哩安装视频 安装 node.js 的时候&#xff0c;会…

《区块链公链数据分析简易速速上手小册》第8章:实战案例研究(2024 最新版)

文章目录 8.1 案例分析&#xff1a;投资决策支持8.1.1 基础知识8.1.2 重点案例&#xff1a;股票市场趋势预测准备工作实现步骤步骤1: 加载和准备数据步骤2: 特征工程步骤3: 训练模型步骤4: 评估模型 结论 8.1.3 拓展案例 1&#xff1a;基于情感分析的投资策略准备工作实现步骤步…

相机图像质量研究(19)常见问题总结:CMOS期间对成像的影响--Sensor Noise

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…