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.rhkb.cn/news/258217.html

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

相关文章

讲解用Python处理Excel表格

我们今天来一起探索一下用Python怎么操作Excel文件。与word文件的操作库python-docx类似&#xff0c;Python也有专门的库为Excel文件的操作提供支持&#xff0c;这些库包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种&#xff0c;其中我最喜欢用的是openpyxl&#xff0c;这…

GitLab配置SSHKey

段落一&#xff1a;什么是SSH密钥 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于安全地远程登录和执行命令。SSH密钥是一种用于身份验证的加密文件&#xff0c;它允许您在与远程服务器通信时&#xff0c;无需输入密码即可进行认证。在GitLab中配置S…

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…

【算法随想录03】相交链表

题目&#xff1a;160. 相交链表 难度&#xff1a;EASY 思路 主要难点在于如何进行节点之间的对应。两条链表长度不定长&#xff0c;如何找到需要对比的节点至关重要。 我们从后往前看&#xff0c;我们需要对比的节点有什么特点。一个最大的特点就是后面的节点数相同。这就…

一文分清OMS、CMS、PMS、TMS、IM、BI、BPMS、SCRM、DSS等B端系统

继5月22日发布一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等后&#xff0c;很多老铁又给我推荐了其他系统&#xff0c;贝格前端工场这次再撰一文&#xff0c;介绍这些系统。 之前文章&#xff1a; 一文分清OA、CRM、ERP、MES、HRM、SCM、WMS、KMS等 1、OMS系统 OMS系统是…

wordpress日主题模版Ripro-v5 6.4开心版

RiPro主题全新V5版本&#xff0c;&#xff08;原RiPro v2旧版已停更&#xff09;是一个优秀且功能强大、速度极快&#xff0c;易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同…

Spring Boot 笔记 020 redis集成

1.1 安装redis Windows 下 Redis 安装与配置 教程_redis windows-CSDN博客 2.1 引入redis坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.2 配置…

OpenSource - 一站式自动化运维及自动化部署平台

文章目录 orion-ops 是什么重构特性快速开始技术栈功能预览添砖加瓦License orion-ops 是什么 orion-ops 一站式自动化运维及自动化部署平台, 使用多环境的概念, 提供了机器管理、机器监控报警、Web终端、WebSftp、机器批量执行、机器批量上传、在线查看日志、定时调度任务、应…

谷歌浏览器安装扩展程序axure-chrome-extension

注&#xff1a; 文末附扩展附件&#xff1a;axure-chrome-extension_v0.7.0.crx 1、安装扩展程序axure-chrome-extension 找到axure-chrome-extension.crx&#xff0c;把axure-chrome-extension.crx后缀改为zip&#xff0c;然后解压&#xff0c;得到一个文件夹 2、打开谷歌浏览…

php数组与字符串函数

php数组与字符串函数 1. php数组2. 字符串函数 1. php数组 在php中&#xff0c;有三种类型的数组&#xff1a; 数值数组 - 带有数字ID键的数组关联数组 - 带有指定的键的数组&#xff0c;每个键关联一个值多维数组 - 包含一个或多个数组的数组 2. 字符串函数 在PHP中&#xf…

精炼爆炸性新闻!OpenAI发布革命性AI视频生成模型Sora:实现长达60秒的高清视频创作「附AIGC行业系统搭建」

在人工智能领域&#xff0c;每一次技术革新都引领着未来的发展方向。OpenAI&#xff0c;作为全球领先的人工智能研究机构&#xff0c;再次证明了其在推动AI技术革新方面的领导地位。近日&#xff0c;OpenAI宣布推出了一款革命性的AI视频生成模型——Sora&#xff0c;这一大胆的…

[office] excel2016怎么求最大值和最小值 #职场发展#知识分享

excel2016怎么求最大值和最小值 excel求最大值最小值步骤&#xff1a; 1、鼠标左键双击计算机桌面Excel2016程序图标&#xff0c;将其打开运行。在打开的Excel2016程序窗口&#xff0c;点击“打开其他工作簿”选项&#xff0c;打开需要进行编辑的Excel工作表。如图所示; 2、在打…

GPIO八种工作模式

目录 一、推挽输出 二、开漏输出 三、复用推挽输出 四、复用开漏输出 五、浮空输入 六、上拉输入 七、下拉输入 八、模拟输入 GPIO八种配置模式&#xff0c;原理和使用场景&#xff0c;硬件原理如下图&#xff1a; 一、推挽输出 1、 原理 当控制栅极为低电平时&#x…

分布式搜索引擎 elasticsearch

分布式搜索引擎 elasticsearch 第一部分 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索…

free pascal:fpwebview 组件通过 JSBridge 调用本机TTS

从 https://github.com/PierceNg/fpwebview 下载 fpwebview-master.zip 简单易用。 先请看 \fpwebview-master\README.md cd \lazarus\projects\fpwebview-master\demo\js_bidir 学习 js_bidir.lpr &#xff0c;编写 js_bind_speak.lpr 如下&#xff0c;通过 JSBridge 调用本…

【Spring】定义过滤器Filter和拦截器Interceptor

# 定义过滤器 package com.holen.filter;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException;pub…

p图考试,搜题软件哪个好?如何利用大学搜题工具查找特定学科的题目? #微信#知识分享

大学生必备&#xff0c;这条笔记大数据一定定要推给刚上大学的学弟学妹&#xff01;&#xff01; 1.三羊搜题 这是个微信公众号 是个公众号&#xff0c;支持文字、语音、截图搜题&#xff0c;截图搜题&#xff0c;同时也支持相似题查看及解析&#xff0c;因为可以在电脑上使…

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本&#xff0c;避免代码冲突&#…

怎么用postman调用webservice(反推SoapUI)

<soapenv:Envelope xmlns:soapenv“http://schemas.xmlsoap.org/soap/envelope/” xmlns:lis“LisDataTrasen”> soapenv:Header/ soapenv:Body lis:Test lis:test111111111</lis:test> </lis:Test> </soapenv:Body> </soapenv:Envelope> Conten…

html从零开始8:css3新特性、动画、媒体查询、雪碧图、字体图标【搬代码】

css3新特性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …