在JDBC中使用DataSource获取连接

news/2024/5/18 22:43:12 标签: mysql, JDBC

javax.sql.DataSource是java.sql.DriverManager的一个代替,而且建议优先使用DataSource,因为DataSource提供了DriverManager所没有的一些特性,例如连接池、分布式事务。
DataSource是一个接口,它的实现由驱动器的厂商提供,例如mysql Connector/J中的com.mysql.cj.jdbc.MysqlDataSource实现了DataSource:

public class MysqlDataSource extends JdbcPropertySetImpl implements DataSource, Referenceable, Serializable, JdbcPropertySet 

下面代码示例中用了DataSource来获取连接,而没有使用DriverManager:

package com.thb;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Enumeration;

import javax.sql.DataSource;

import com.mysql.cj.jdbc.MysqlDataSource;

public class JDBCDemo {

    public static void main(String[] args) throws ClassNotFoundException {       
        String url = "jdbc:mysql://localhost:3306/development";
        String user = "development_user";
        String pass = "test009";
        Connection con = null;
        PreparedStatement stmt = null;
        String sql = "SELECT * FROM test_table";
        Enumeration<Driver> drivers = DriverManager.getDrivers();
        if (drivers.hasMoreElements()) {
            System.out.println("加载的驱动器的类型: "+ drivers.nextElement().getClass().getName());
        }
        
        try {
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setUrl(url);           
            con = dataSource.getConnection(user, pass);
            stmt = con.prepareStatement(sql);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                System.out.println(rs.getInt("id"));
                System.out.println(rs.getString("type"));
                System.out.println(rs.getDate("pdate"));
                System.out.println(rs.getBigDecimal("price"));
                System.out.println(rs.getString("description"));                
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

运行输出,得到了正确的结果:

加载的驱动器的类型: com.mysql.cj.jdbc.Driver
1
1
2023-12-04
100.000000
测试数据

http://www.niftyadmin.cn/n/5239066.html

相关文章

菜鸟学习日记(python)——运算符

我们进行运算时&#xff0c;需要两类数据&#xff0c;操作数和运算符&#xff0c;例如&#xff1a;ab就是一个运算&#xff0c;它的操作数是a和b&#xff0c;运算符是‘’ 在python中运算符包括以下几大类&#xff1a; 算数运算符比较&#xff08;关系&#xff09;运算符赋值…

房地产销售技巧和话术,助你实现业绩突围

房地产销售技巧和话术&#xff0c;助你实现业绩突围 在如今低迷的房地产市场中&#xff0c;如何实现销售突围&#xff0c;销售员在整个销售环节中就显得非常重要。他们不仅是信息的传递者&#xff0c;更是买卖双方之间的桥梁。然而&#xff0c;要想在这个竞争激烈的市场中脱颖…

配置Docker OpenWrt与宿主机网络互通且作为宿主机网关

目录 背景环境 操作步骤Docker安装OpenWrt确认宿主机网络接口名创建macvlan网络开启桥接网卡的混淆模式为docker创建macvlan网络 创建OpenWrt容器登录容器更改ip网段重启network生效配置 与宿主机网络互通宿主机创建新的macvlan接口为新接口分配ip并启用添加静态路由使宿主机与…

JS APl关于电梯导航做法(ES6)

文章目录 文章目录 需求&#xff1a; 整体架构流程 技术名词解释 代码展示: 小结 需求&#xff1a; 1.点击哪个模块可以跳转的对应的模块 2.点击哪个模块对应的模块显示高亮&#xff08;就是哪个盒子背景色变红色&#xff09; 整体架构流程 // 1. 获元取素 document.query…

2023.12.3 关于 Spring 拦截器 和 过滤器

目录 引言 Spring 拦截器实现 实例理解 Spring 过滤器实现 实例理解 拦截器和过滤器的区别 出身不同 触发时机不同 底层实现不同 支持的项目类型不同 使用场景不同 引言 原生 Spring AOP 实现统一拦截有两个难点难点一&#xff1a;定义拦截规则表达式 难点二&#…

qt使用wimlib-imagex,做windows系统备份还原

wimlib-imagex是个第三方工具&#xff0c;可对系统映像进行操作&#xff0c;下载地址&#xff1a; https://wimlib.net/downloads/index.html 程序主要用到以下这两个文件&#xff1a;libwim-15.dll和wimlib-imagex.exe wimlib-imagex.exe的调用命令参数&#xff0c;可以通过…

Oracle的数据一致性机制原理

一、前言 在单用户环境下&#xff0c;在操作数据库是不需要考虑其他用户会修改同一个数据。但是在多用户的情况下&#xff0c;多个事务可能会修改同一个数据&#xff0c;最终会得到错误的数据结果。 Oracle数据库是通过 multiversion consistency model&#xff08;多版本数据…

[RK-Linux] 移植Linux-5.10到RK3399(三)| 检查eMMC与SD卡配置

这个专题主要记录把 RK Linux-5.10 移植到 ROC-RK3399-PC Pro 的过程。 文章目录 一、eMMC二、SD 卡三、两个接口的区别一、eMMC RK3399 的 eMMC 接口如图: datasheet 介绍: 实际上,连接 eMMC 存储器用的是 SDHCI 接口。SDHCI(Secure Digital Host Controller Interface)…