当前位置:首页 > 技术 > 正文内容

JDBC配置与使用

访客 技术 2026年6月1日 1

数据库初始化及SQL语句

以下是创建数据库和表的SQL脚本:

点击展开SQL脚本
CREATE DATABASE study;

CREATE TABLE admin(
id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(20),
	PASSWORD VARCHAR(20)
)CHARSET=utf8;

SELECT * FROM admin;
SELECT COUNT(*) FROM admin;
DROP TABLE admin;

1. 使用Druid连接池

1.1 配置文件

在src目录下创建一个名为druid.properties的文件,内容如下:

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/study?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username=root
password=你的密码

initialSize=10
minIdle=5
maxActive=50
maxWait=5000

1.2 封装工具类

创建一个工具类来管理Druid连接池:


package com.example.jdbc;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DruidUtil {
    private static javax.sql.DataSource dataSource;

    static {
        try {
            Properties props = new Properties();
            InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            props.load(is);
            dataSource = DruidDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try { rs.close(); } catch (SQLException ignored) {}
        }
        if (stmt != null) {
            try { stmt.close(); } catch (SQLException ignored) {}
        }
        if (conn != null) {
            try { conn.close(); } catch (SQLException ignored) {}
        }
    }
}

1.3 数据操作示例

以下是一个查询数据的示例:


package com.example.jdbc;

import java.sql.*;

public class AdminQuery {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            conn = DruidUtil.getConnection();
            String sql = "SELECT id, username, password FROM admin";
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();

            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("username");
                String pwd = rs.getString("password");
                System.out.println("ID: " + id + ", 用户名: " + name + ", 密码: " + pwd);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DruidUtil.close(conn, pstmt, rs);
        }
    }
}

2. C3P0连接池配置

2.1 配置文件

在src目录下创建c3p0-config.xml:


    
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/study</property>
        <property name="user">root</property>
        <property name="password">你的密码</property>

        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">50</property>
        <property name="checkoutTimeout">5000</property>
    

2.2 使用C3P0

通过C3P0获取连接并执行SQL:


package com.example.jdbc;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class C3P0Example {
    public static void main(String[] args) {
        ComboPooledDataSource cpds = new ComboPooledDataSource("example");
        try (Connection conn = cpds.getConnection()) {
            System.out.println("成功获取连接!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3. 普通JDBC连接

3.1 工具类封装

通过配置文件封装普通JDBC连接:


package com.example.jdbc;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcHelper {
    private static String driver, url, user, password;

    static {
        try {
            Properties props = new Properties();
            InputStream is = JdbcHelper.class.getClassLoader().getResourceAsStream("db.properties");
            props.load(is);

            driver = props.getProperty("driver");
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");

            Class.forName(driver);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) { try { rs.close(); } catch (SQLException ignored) {} }
        if (stmt != null) { try { stmt.close(); } catch (SQLException ignored) {} }
        if (conn != null) { try { conn.close(); } catch (SQLException ignored) {} }
    }
}

3.2 数据增删改查

以下是一个简单的增删改查示例:


package com.example.jdbc;

import java.sql.*;

public class CrudExample {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = JdbcHelper.getConnection();

            // 插入数据
            String insertSql = "INSERT INTO admin (username, password) VALUES (?, ?)";
            pstmt = conn.prepareStatement(insertSql);
            pstmt.setString(1, "testUser");
            pstmt.setString(2, "testPass");
            pstmt.executeUpdate();

            // 查询数据
            String querySql = "SELECT * FROM admin WHERE username = ?";
            pstmt = conn.prepareStatement(querySql);
            pstmt.setString(1, "testUser");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getString("username"));
            }

            // 删除数据
            String deleteSql = "DELETE FROM admin WHERE username = ?";
            pstmt = conn.prepareStatement(deleteSql);
            pstmt.setString(1, "testUser");
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcHelper.close(conn, pstmt, null);
        }
    }
}
标签: Druid

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。