当前位置: 首页 > article >正文

JDBC连接池

1.把对所有Dao类的操作——抽取一个父类

抽取:公共的属性、获取连接对象、增删改操作

把Dao类中的所有公共内容抽取到一个父类

package com.zmq.dao;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * @program: JDBC02
 * @description:
 * @author: 赵梦倩
 * @create: 2024-04-29 08:52
 **/
public class BaseDao {
    protected Connection con=null;
    protected PreparedStatement ps=null;
    protected ResultSet rs=null;
    private String driverName="com.mysql.cj.jdbc.Driver";
    private String url="jdbc:mysql://localhost:3306/zmq";
    private String name="root";
    private String password="123456";

    //连接方法
    public void getCon() throws Exception {
        //加载驱动
        Class.forName(driverName);
        //获取连接对象
        con=DriverManager.getConnection(url,user,password);
    }
    //关闭所有资源
    public void closeAll(){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    //增删改
    public int edit(String sql,Object... obj){
        int row=0;
        try {
            getCon();
            ps=con.prepareStatement(sql);
            //为占位符赋值
            for(int i=0;i< obj.length;i++){
                ps.setObject(i+1,obj[i]);
            }
             row = ps.executeUpdate();
            return row;
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            closeAll();
        }
        return 0;
    }
}

2.把数据源信息放入属性文件中

数据源:即连接池,以key=value的形式存储固定常量,便于客户根据需求修改连接数据库的相关数据

创建一个属性文件x x x. properties

必须放在src目录下

# 里面的内容格式:key=value
driverName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/zmq
username=root
password=123456

父类中相关属性变为静态的

 private static String driverName="";
 private static String driverName="";
 private static String url="";
 private static String user="";
 private static String password="";

在抽取的父类中读取属性文件中的内容——使用静态代码块

 //静态代码块: 随着类的加载而被加载,而且只会加载一次。
    static{
        try {
            //读取属性文件封装了一个类Properties
            Properties properties=new Properties();
            //加载属性文件
//            InputStream is=BaseDao.class.getResourceAsStream("db.properties");
            InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(is);
            //读取相应key的值
            driverName=properties.getProperty("driverName");
            url=properties.getProperty("url");
            name=properties.getProperty("username");
            password=properties.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3. 引用数据源——连接池

连接池:该池子中存储的是连接对象。预先存放一些连接对象,当想获取连接对象时,只需要从连接池中获取,使用完毕后归还到池子中。

种类:druid(阿里巴巴的德鲁伊)

C3P0:这是一个开放源代码的JDBC连接池,与Hibernate一起发布,支持jdbc3和jdbc2扩展规范。
DBCP(Database Connection Pool):依赖于Jakarta Commons Pool对象池机制的数据库连接池,可以直接在应用程序中使用。
Proxool:提供了一个Java SQL Driver驱动程序,可以透明地为现存的JDBC驱动程序增加连接池功能。
BoneCP:一个快速、开源的数据库连接池,旨在帮助用户管理数据连接,使应用程序能更快速地访问数据库。
Druid:是一个高效、功能全面的数据库连接池,广泛应用于大数据和互联网车辆应用中。
DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager:这些连接池各有特色,如DDConnectionBroker简单轻量级,DBPool高效易配置,XAPool为XA数据库连接池,Primrose支持动态池管理,SmartPool解决连接泄漏问题,MiniConnectionPoolManager轻量级且无需依赖第三方包。

步骤:

  • 引入bruid的jar包到lib目录下
  • 放入工程,将jar包添加库——解压
  • 属性文件.properties——key的名称不能改变
#里面的内容格式key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/qy174
username=root
password=root
#最大的活跃数
maxActive=10
#初始的大小
initialSize=5
#最大的等待时间
maxWait=5000

# key的名称必须是如上
  • 使用

    • 定义属性,数据源静态私有,其他保护

      public:公共,该工程下任何位置都可以访问到

      protected:本包以及不同包下的子类可以访问到

      default:本包下的类可以访问到

      private:只允许本类访问

  • 静态代码块

    • 创建属性文件对象
    • 创建输入流读取属性文件
    • 读取属性文件
    • 创建连接池对象,默认读取名称key的值
  • 获取连接对象的方法

    • 从连接池中获取连接对象
  • 关闭所有的资源

  • 增删改公共方法

    • 调用获取连接对象方法
    • 预编译执行sql语句
    • 通过普通for循环为占位符赋值
    • 返回值
public class BaseDao {
    //public: 公共 该工程下任何位置都可以访问到    protected:本包以及不同包下的子类访问到    默认:本包下的类访问到     private:本类访问
    protected Connection conn = null;
    protected PreparedStatement ps = null;
    protected ResultSet rs = null;
    private static  DataSource dataSource;
    static {
        try {
            Properties properties = new Properties();
            InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
            properties.load(is);
            //创建连接池对象---默认读取名称DriverClassName url  username password的值
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取连接对象的方法
    public void getConn() throws Exception {
        //从连接池中获取连接对象
        conn = dataSource.getConnection();
    }
    //关闭所有的资源
    public void closeAll() {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    //增删改公共方法
    public int edit(String sql, Object... params) {
        int row = 0;
        try {
            getConn();
            ps = conn.prepareStatement(sql);
            //为占位符赋值。
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
            row = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeAll();
        }
        return row;
    }
}

http://www.kler.cn/a/563133.html

相关文章:

  • jar生产部署脚本
  • 使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问
  • OpenHarmony DFX子系统
  • seasms v9 注入漏洞 + order by注入+​information_schema​解决方法
  • Gtest, Junit,以及pytest对比理解
  • 轻量化网络设计|ShuffleNet:深度学习中的轻量化革命
  • 嵌入式的应用领域和发展趋势
  • 什么是Sass,如何使用?
  • Game Maker 0.11更新:构建社交竞速游戏并增强玩家互动
  • 利用 Open3D 保存并载入相机视角的简单示例
  • 公链开发与公链生态开发:构建未来区块链世界的基石
  • Linux提权之linux mysql udf提权(十五)
  • Vue进阶之AI智能助手项目(五)——ChatGPT的调用和开发
  • DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
  • HTTP-
  • 动态规划-背包问题
  • 苹果CMS泛目录站群架构:无缓存刷新技术的SEO实战
  • DeepSeek 助力 Vue3 开发:打造丝滑的标签输入(Tag Input)
  • 机试刷题_HJ14 字符串排序【python】
  • Android MMKV集成指南