JDBC教程+数据库连接池

news2024/11/28 16:42:21

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对象,用于执行SQL
        PreparedStatement 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;
    
        @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;
        }
    }
    
    
    • 测试用例
    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 {
        // 查询
        @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();
        }
    }
    

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

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

相关文章

阿里云幻兽帕鲁服务器中据点帕鲁数量上限是修改哪个参数?

在阿里云的计算巢管理中&#xff0c;找到你的这台部署幻兽帕鲁的服务器实例&#xff0c;选择右上角的“修改游戏配置” 然后选择“基地内工作帕鲁的最大数量”改成20 不过也有同学说更改上面的数字&#xff0c;根本不起作用。 参考资料&#xff1a;大多数人现在都知道&#xf…

【C语言】socketpair 的系统调用

一、 Linux 内核 4.19socketpair 的系统调用 SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,int __user *, usockvec) {return __sys_socketpair(family, type, protocol, usockvec); } 这段代码定义了一个名为 socketpair 的系统调用。系统调用是操作…

『运维备忘录』之 Zip 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

BDD - Python Behave 用户自定义配置文件

BDD - Python Behave 用户自定义配置文件 引言默认 behave.ini 配置文件自定义配置文件json 格式的配置文件ini 格式的配置文件 实例应用项目结构代码BDD/Features/user_data.feature 文件BDD/steps/user_data_steps.py 文件BDD/environment.py 文件默认配置文件 behave.ini自定…

京东护网面试题汇总

1 、JNI 函数在 java 中函数名为 com.didi.security.main,C 中的函数名是什么样的&#xff1f; com_didi_security_mian java.com.didi.security.main 2 、Frida 和 Xposed 框架&#xff1f; 3 、SSRF 利用方式&#xff1f; 4 、宏病毒&#xff1f; 5 、APP 加壳&a…

吐血整理!操作系统【处理机调度】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 基本概念1.1 总览1.2 什么是调度1.2.1 调度1.2.2 处理机调度 1.3 调度的三个层次1.3.1 高级调度1.3.2 中级调度&#xff08;内存调度&#xff09;1.3.3 低级调度&#xf…

如何给最小化安装的CentOS主机装个远程桌面?

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们领微软云Azure的免费主机时&#xff08;白嫖党618福利&#xff01;来Azure领200美刀&#xff01;外加云主机免费用一年&#xff01;&#xff09;&#xff0c;发现“有资格免费试用服务”的主…

无人机地面站技术,无人机地面站理论基础详解

地面站作为整个无人机系统的作战指挥中心&#xff0c;其控制内容包括:飞行器的飞行过程&#xff0c;飞行航迹&#xff0c; 有效载荷的任务功能&#xff0c;通讯链路的正常工作&#xff0c;以及 飞行器的发射和回收。 无人机地面站总述 地面站作为整个无人机系统的作战指挥中心…

Cannot resolve symbol ‘@+id/modifyAvatar‘

问题 Cannot resolve symbol id/modifyAvatar详细问题 笔者进行Android开发&#xff0c;创建组件id&#xff0c;报红。 鼠标放置报红处&#xff0c;提示 Cannot resolve symbol id/modifyAvatar解决方案 顶部菜单栏 → \rightarrow →Build → \rightarrow →Rebuild proje…

每日一题 力扣107 二叉树的层序遍历Ⅱ

107. 二叉树的层序遍历 II 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20…

《UE5_C++多人TPS完整教程》学习笔记6 ——《P7 在线会话控制(Online Sessions)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P7 在线会话控制&#xff08;Online Sessions&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

【Java多线程案例】定时器

1. 定时器简介 定时器&#xff1a;想必大家一定对定时器这个概念不陌生&#xff01;因为它经常出现在我们的日常生活和编程学习中&#xff0c;定时器就好比是一个"闹钟"&#xff0c;会在指定时间处理某件事&#xff08;例如响铃&#xff09;&#xff0c;而在编程世界…

Obsidian Publish的开源替代品Perlite

前几天就有网友跟我说&#xff0c;freenom 的免费域名不可用了&#xff0c;10 号的时候老苏进后台看了一下&#xff0c;还有一半的域名显示为 ACTIVE&#xff0c;似乎是以 2024年6月 为限。但到 11 号&#xff0c;老苏发现博客 (https://laosu.cf) 已经访问不了了&#xff0c;这…

Django学习笔记教程全解析:初步学习Django模型,初识API,以及Django的后台管理系统(Django全解析,保姆级教程)

把时间用在思考上是最能节省时间的事情。——[美]卡曾斯 导言 写在前面 本文部分内容引用的是Django官方文档&#xff0c;对官方文档进行了解读和理解&#xff0c;对官方文档的部分注释内容进行了翻译&#xff0c;以方便大家的阅读和理解。 概述 在上一篇文章里&#xff0…

C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码

如题。 校验码系统是产生校验码并校验包括校验码在内的字符串的一套规则。 它可以防止在抄录和键入字符串时产生的错误。 一般生成 MD5 校验&#xff0c;也可以生成、进行简单、快速的 整数 校验。 谷歌开源&#xff0c;很实用的整数校验码生成代码。 1 文本格式 using Sy…

Python免费下载安装全流程(Python 最新版本),新手小白必看!

前言 今天换了新的电脑&#xff0c;需要重新安装python和PyCharm&#xff0c;就简单的写个教程吧~ 一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择&qu…

物联网技术的崛起:驱动智慧景区的新篇章

随着科技的飞速发展&#xff0c;物联网技术逐渐成为推动各行各业创新的重要力量。在旅游业中&#xff0c;物联网的应用为智慧景区的建设提供了有力支持&#xff0c;为游客带来了更加便捷、智能的旅游体验。本文将探讨物联网技术在智慧景区中的应用及其对旅游业的影响&#xff0…

[职场] 求职如何设置预期 #笔记#经验分享

求职如何设置预期 在求职的道路上&#xff0c;无论处于哪个年龄阶段&#xff0c;合理的就业期望值才能使我们的愿望与社会的需求相吻合&#xff0c;才能让自己在今后的工作中发挥出最大的实力与能力。 一、结合测评软件&#xff0c;明确求职目标 根据霍兰德职业兴趣测试结果&a…

解密ERP业务架构:打造高效运营与持续增长的关键

在当今竞争激烈的商业环境中&#xff0c;企业需要有效管理和整合各个部门的业务流程和信息&#xff0c;以实现高效运营和持续增长。而ERP&#xff08;企业资源规划&#xff09;系统作为一种集成的业务管理平台&#xff0c;扮演着至关重要的角色。本文将探讨ERP业务架构的重要性…

[经验] 欧阳修唐宋八大家之首是谁 #微信#知识分享#学习方法

欧阳修唐宋八大家之首是谁 1、唐宋八大家之首是谁 唐宋八大家是中国文学史上最具代表性的八位大文豪&#xff0c;他们的文学成就在中国文学史上占有重要地位&#xff0c;被誉为文学史上的“巨人”。 唐宋八大家之首&#xff0c;无疑是唐代著名诗人杜甫。他出生在一个贫苦的家…