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.mzph.cn/news/683526.shtml

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

相关文章

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章&#xff0c;在了解过状态管理之后&#xff0c;我们再来学习一下网络请求。 正文 网络请求对于一…

starknet之 class_hash

文章目录 问题背景什么是Class Hash问题背景 部署合约报错:ReferenceError: Buffer is not defined 什么是Class Hash 官方: https://book.starknet.io/ch04-03-01-deploy-standard-account.html?highlight=class%20hash#finding-the-class-hash 要部署智能合约,您需要在…

微软在其Windows系统中暗示了AI的未来,推出了更聪明的Copilot功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

批量梯度下降、随机梯度下降、小批量梯度下降

一、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09; 在批量梯度下降中&#xff0c;每次迭代都使用整个训练集的数据进行梯度计算和参数更新。也就是说&#xff0c;每次迭代都对所有的样本求取梯度&#xff0c;然后更新参数。由于要处理整个训练集&#xff0c…

刷题计划_冲绿名

现在 rating 是 1104 准备刷 100道 1200的题&#xff0c;把实力提升到 1200 &#xff0c;上一个绿名 每一个分数段的题都写一百道&#xff0c;争取早日上蓝 现在 虽然 cf 里面显示写了一些这个分数段的题&#xff0c;但是自己训练的时候&#xff0c;其实是没有训练一道这个分…

【Py/Java/C++三种语言详解】LeetCode每日一题240214【二叉树BFS】LeetCode102、二叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加&#xff1a;948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大…

Linux 基础/子目录分配/文件路径

在Linux系统中&#xff0c;整个系统只具有一个根目录“/”&#xff0c;用斜杠表示。根目录是整个文件系统的顶层目录&#xff0c;在他下面可以创建其他的目录和文件。 Linux中的子目录分配&#xff1a; /bin - 基本命令的二进制文件&#xff0c;这些命令可供所有用户使用&am…

MySQL主从环境,主库改端口后,从库如何操作?

主库&#xff1a;mysql-111 从库&#xff1a;mysql-112 主库由3306端口修改成3307后&#xff0c; 从库执行如下命令 mysql> stop slave; mysql> change master to master_port3307; mysql> CHANGE MASTER TO MASTER_HOST192.168.10.111,MASTER_USERbeifen,MASTER_PA…

生活中有很多压力,怎么办?

在这篇文章的最开始&#xff0c;我想跟你一起做一个思维实验&#xff1a; 假如现在有一个按钮&#xff0c;按下去之后&#xff0c;你会过上一段新的生活。这段生活的走向跟你原本生活的走向大体一样&#xff0c;不同之处在于&#xff1a;它会消除你未来生活中的一切压力。你将不…

BUGKU-WEB 矛盾

题目描述 进入场景看看&#xff1a; 代码如下&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }解题思路 需要读懂一下这段PHP代码的意思明显是一道get相关的题目&#xff0c;需要提供一个num的参数,然后需要传入一个不…

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author &#xff1a;susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…

数字的魅力之情有独钟的素数

情有独钟的素数 什么是素数 素数&#xff08;Prime number&#xff09;也称为质数&#xff0c;是指在非0自然数中&#xff0c;除了1与其本身之外不拥有其他因数的自然数。也就是说&#xff0c;素数需要满足两个条件&#xff1a; 大于1的整数&#xff1b;只拥有1和其自身两个…

精读Relational Embedding for Few-Shot Classification (ICCV 2021)

Relational Embedding for Few-Shot Classification (ICCV 2021) 一、摘要 该研究提出了一种针对少样本分类问题的新方法&#xff0c;通过元学习策略来学习“观察什么”和“在哪里关注”。这种方法依赖于两个关键模块&#xff1a;自相关表示&#xff08;SCR&#xff09;和交叉…

统一数据返回格式 及 可能遇到的问题;统一异常处理

统一数据返回格式 统一数据返回格式就像我们寄快递一样&#xff0c;不管你需要寄的东西具体是什么都需要将它打包到统一的快递箱中。 此时我们需要一个“快递箱”用来将返回的数据“装”在里面。这个类是根据业务情况来自行定义的。 Data public class Resp<T> {//200…

[嵌入式AI从0开始到入土]14_orangepi_aipro小修补含yolov7多线程案例

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

PHP毕业设计图片分享网站76t17

图片分享网站主要是为了提高工作人员的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系统优化的原则&#xff0c;…

【C语言】Linux内核bind系统调用代码

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…

谷歌搜索技巧与 ChatGPT 实用指南:提升你的在线生产力

探索谷歌搜索技巧&#xff0c;提升搜索效率 前言 在搜索三巨头百度、必应、谷歌中&#xff0c;谷歌在搜索精确度以及多语言兼容性方面有明显的优势。其次在国内想要使用谷歌搜索你需要会科学上网&#xff08;这里不说&#xff09;。 一.排除干扰内容&#xff08;广告&#xff…

vue-进阶语法(四)

目录 v-model原理 v-model应用于组件 sync修饰符 ref 和 $refs&#xff08;重点&#xff09; $nextTick v-model原理 原理&#xff1a;v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写。 作用&#xff1a;提供数据的双向…

压缩PDF的大小-Adobe Acrobat Pro

经常遇到上传的pdf太大&#xff0c;无法成功上传。 今天找到一个方法&#xff1a; 打开Adobe Acrobat Pro软件 → 文件 → 另存为其他&#xff08;H&#xff09;... →缩小大小的PDF 版本选择 4.0 最低的版本。 文件由9M变为1.5M。