JDBC教程+数据库连接池

news/2024/5/19 1:38:21 标签: 数据库, jdbc

JDBC

1.JDBC概述

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

image-20240205211800441

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

​ JDBC的优点:

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删除
  • 环境准备:

    -- 删除数据表
    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.niftyadmin.cn/n/5378046.html

相关文章

开源软件的影响力:塑造数字世界的无形之手

随着科技的飞速发展&#xff0c;开源软件已经成为了推动数字世界发展的重要力量。它不仅改变了软件开发的传统模式&#xff0c;还对整个科技行业乃至社会产生了深远的影响。在这篇文章中&#xff0c;我们将探讨开源软件的影响力以及它如何塑造我们的数字世界。 一、开源软件的…

关于DVWA靶场Command Injection(命令注入)乱码的解决方案

乱码如下图&#xff1a; 出现乱码一般都是编码方式的问题&#xff0c;我们只需要对其换一种编码方式输出即可 靶场在 WWW 目录下&#xff0c;在靶场所在路径下有一个 dvwa 文件夹 进入之后找到 includes 文件夹 进入找到文件 dvwaPage.inc.php 右键&#xff0c;使用记事本打开…

(力扣记录)1448. 统计二叉树中好节点的数目

数据结构&#xff1a;树&#x1f332; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(n) 代码实现&#xff1a; class Solution:def goodNodes(self, root: TreeNode) -> int:counter [0]def dfs(root, val):if not root: returnnext_val valif root.val > …

论文阅读 - Non-Local Spatial Propagation Network for Depth Completion

文章目录 1 概述2 模型说明2.1 局部SPN2.2 非局部SPN2.3 结合置信度的亲和力学习2.3.1 传统正则化2.3.2 置信度引导的affinity正则化 3 效果3.1 NYU Depth V23.2 KITTI Depth Completion 参考资料 1 概述 本文提出了一种非局部的空间传播网络用于深度图补全&#xff0c;简称为…

孤岛上的笔记本电脑:生存、求索与创新的工具

在面对被放置于一座孤岛的极端情境下&#xff0c;身边的笔记本电脑不仅仅是一个科技产品&#xff0c;更可能成为我连接世界、维持生存、探索未知以及寻求救援的重要工具。以下将从三个方面阐述这一观点。 首先&#xff0c;生存保障方面&#xff0c;一台联网的笔记本电脑可以提供…

Python无人坦克全智能化

Python无人坦克全智能化研究的重要方向包括以下几个方面&#xff1a; 感知与环境理解&#xff1a;研究如何利用传感器技术和计算机视觉技术&#xff0c;使无人坦克能够感知和理解周围的环境信息&#xff0c;包括地形、障碍物、敌军位置等&#xff0c;以及准确地识别和分类目标。…

C# VS2022+WinForm+Oracle19.3+Excel,根据数据库表定义书生成SQL

目标&#xff1a; 用Excel写数据库的表的定义书&#xff0c;用该工具生成SQL&#xff0c;在客户端执行&#xff0c;把表结构导入数据库&#xff0c;生成真正的表 Github代码下载 目录 0.完成下面开发环境的准备1 操作系统Win11 专业版 21H22 oracle 19.33 Visual Studio Commun…

【MySQL】操作库 —— 表的操作 -- 详解

一、增加表 1、创建表 mysql> create database [if not exists] table_name ( -> field1 datatype, -> field2 datatype, -> field3 datatype -> ) character set 字符集 collate 校验规则 engine 存储引擎; 注意 &#xff1a;最后一行也可以写成&#x…