JDBC使用总结:基础篇

本文介绍了JDBC的简介、入门程序和封装工具类的使用,重点讲解了数据库连接池的概念、优点及c3p0连接池的运行机制。详细阐述了c3p0配置文件的两种形式,并提供了数据库源配置文件的示例。通过学习,读者可以掌握如何在Java项目中有效利用c3p0进行数据库管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JDBC简介

  • JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源
  • JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
  • JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
  • JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行SQL语句,并且得到返回结果。

  • 几种常用数据库的JDBC URL

       对于 Oracle 数据库连接,采用如下形式:

      –jdbc:oracle:thin:@localhost:1521:sid

      •对于 SQLServer 数据库连接,采用如下形式:

      –jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid

      •对于 MYSQL 数据库连接,采用如下形式:  

      –jdbc:mysql://localhost:3306/sid

 

2.入门程序

package com.jdbc.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.jdbc.vo.User;

public class JDBCUtil {
	private static Connection conn = null;
	private static PreparedStatement pstm = null;
	private static ResultSet rs = null;
    
    public static Connection getConnection(){
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cart","root","1234");
            System.out.println("Connection success.");          
        }
        catch (Exception e) {         
            e.printStackTrace();
        }
        return conn;     
        
    }
    
    /**
     * 释放所有资源 --记得有顺序
     * @param rs 结果集
     * @param pstm preparedStatement 对象
     * @param conn 数据库连接
     */
    public static void closeConnection(ResultSet rs, PreparedStatement pstm, Connection conn){
        if (rs != null) {
            try {
                rs.close();
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }  
        if (pstm != null) {
            try {
                pstm.close();
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        } 
        if (conn != null) {
            try {
                conn.close();
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        } 
        
    }
    
    public static void main(String[] args) {
		try {
			//先插入一条数据
			conn = JDBCUtil.getConnection();
			String sql="insert into user (name,password) values(?,?)";
			pstm = conn.prepareStatement(sql);
			pstm.setString(1, "影魔");
			pstm.setString(2, "1234");
			pstm.executeUpdate();
			System.out.println("插入一条数据成功");
			
			//再进行查询
			String sql2 = "select * from user";
			pstm = conn.prepareStatement(sql2);
			//获取查询结果集
			rs = pstm.executeQuery();
			while(rs.next()) {
				User user = new User();
				user.setId(rs.getInt("id"));
				user.setName(rs.getString("name"));
				user.setPassword(rs.getString("password"));
				System.out.println(user);
			}
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			//依次关闭数据库连接
			JDBCUtil.closeConnection(rs, pstm, conn);
		}
		
	}
    
}

3.封装工具类

3.1.使用配置文件properties

加载数据库驱动,获取连接时存在硬编码,当数据库改变,数据库类型改变。密码等信息改变时,代码不利于维护 。

在src跟目录下创建db.properties 文件 。

driver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/cart
user=root
password=1234

修改getConnection方法

public static Connection getConnection(){
        try {
			// 1). 创建 Properties 对象
			Properties properties = new Properties();

			// 2). 获取 jdbc.properties 对应的输入流
			InputStream in = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties");

			// 3). 加载 2) 对应的输入流
			properties.load(in);

			// 4). 具体决定 user, password 等4 个字符串.
			String user = properties.getProperty("user");
			String password = properties.getProperty("password");
			String jdbcUrl = properties.getProperty("jdbcUrl");
			String driver = properties.getProperty("driver");

			// 2. 加载数据库驱动程序(对应的 Driver 实现类中有注册驱动的静态代码块.)
			Class.forName(driver);
			// 3. 通过 DriverManager 的 getConnection() 方法获取数据库连接. 
			conn = DriverManager.getConnection(jdbcUrl, user, password);
			
        }
        catch (Exception e) {         
            e.printStackTrace();
        }
        return conn;     
        
}

4.数据库连接池

4.1. 什么是数据库连接池

    数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

4.2.优点

    节省创建连接与释放连接 性能消耗

    连接池中连接起到复用的作用 ,提高程序性能

4.3. 数据库连接池的运行机制

(1)  程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

4.4.使用c3p0连接池

常用开源连接池:

dbcp  半自动化操作  不能自动连接

c3p0  自动化操作(自动的加载配置文件 并且设置到对象里面)  自动尝试连接  

Druid  阿里巴巴的开源连接池

4.5.数据库源配置文件

以下两种配置方式,c3p0连接池会自动读取配置文件数据源

第一种: c3p0.properties   文件名不能改, 必须放在src下  ,配置文件中的key名称不能变

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=UTF-8
c3p0.user=root
c3p0.password=root

第二种: c3p0-config.xml   可以配置多个数据库连接并且可以指定名字去加载

ComboPooledDataSource dataSource = new ComboPooledDataSource("my");

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

    <named-config name="mysql">
        <!-- 指定连接数据源的基本属性 -->
        <property name="user">root</property>
        <property name="password">1234</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///cart</property> 
        
        <!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">2</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">15</property>

        <!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
        <property name="maxStatements">10</property>
        <!-- 每个连接同时可以使用的 Statement 对象的个数 -->
        <property name="maxStatementsPerConnection">5</property>

    </named-config>   
</c3p0-config>

修改getConnection方法

    private static DataSource ds = null;
    static {
    	ds = new ComboPooledDataSource("mysql");
    } 
    
    /**
     * 使用c3p0配置文件获取连接
     * @return
     */
    public static Connection getC3p0Conn() {
    	try {
			conn = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
    }

参考博客:

jdbc 和c3p0详细分析

你真的会正确关闭connection吗?

源代码码示例:github下载地址

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值