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

JDBC数据库连接池及相关练习(学习自用)

目录

一、数据库连接池

1、是什么?

2、目的?

3、作用?

4、如何创建?

二、JDBC练习


一、数据库连接池

1、是什么?

Java 数据库连接池是一种用于管理数据库连接的资源池,它允许应用程序在需要时从池中获取连接,并在使用完毕后将连接归还到池中。

2、目的?

提高数据库连接的效率和性能,减少频繁创建和关闭连接的开销。

3、作用?

  1. 提高性能:减少了创建和关闭连接的开销,提高了数据库操作的效率。

  2. 资源管理:限制了同时打开的连接数量,避免了过多的连接消耗过多的系统资源。

  3. 连接验证:确保从连接池中获取的连接是可用的,避免了因连接失效导致的错误。

  4. 简化代码:使用连接池可以简化数据库连接的管理代码,提高代码的可维护性。

4、如何创建?

这里以阿里的Druid为例:

 //数据库相关信息
private static final String driverClassName="com.mysql.jdbc.Driver";

private static final String URL="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
private static final String USER="root";
private static final String PASSWORD="123456";


//创建数据库连接池对象
ds=new DruidDataSource();
//设置驱动
ds.setDriverClassName(driverClassName);
//设置最大活跃连接数量
ds.setMaxActive(5);
//设置初始连接数量(上面的最大数量要大于初始数量)
ds.setInitialSize(3);
//设置最长等待时间
ds.setMaxWait(3000);

//设置数据库相关信息
ds.setUrl(URL);
ds.setUsername(USER);
ds.setPassword(PASSWORD);

//获取链接
Connection con=ds.getConnection();

注意:关闭Connection链接时并没有真的关闭 ,而是将其返回到连接池,以供其他线程操作。

二、JDBC练习

JDBCUtil类

 //数据库相关信息
    private static final String driverClassName="com.mysql.jdbc.Driver";
    private static final String URL="jdbc:mysql://localhost:3306/school?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
    private static final String USER="root";
    private static final String PASSWORD="123456";

    //创建数据库连接池
    private static final DruidDataSource ds;
    private static Connection con=null;
    static {
        ds=new DruidDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setMaxActive(5);
        ds.setInitialSize(3);
        ds.setMaxWait(3000);
        ds.setUrl(URL);
        ds.setUsername(USER);
        ds.setPassword(PASSWORD);
    }

    //创建链接
    public static Connection getConnection(){
        if(con==null){
            try {
                con=ds.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
       return con;
    }

    //创建预编译对象
    public static PreparedStatement getPreparedStatement(Connection connection,String sql,Object...params) throws SQLException {
        PreparedStatement psta=connection.prepareStatement(sql);
            for(int i=0;i<params.length;i++){
                psta.setObject(i+1,params[i]);
            }

        return psta;
    }

    //关闭所有链接
    public static void closeAll(Connection connection, PreparedStatement psta, ResultSet rs){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(psta!=null){
            try {
                psta.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    //关闭connection链接
    public static void closeCon(){
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


    //查询指定数据,不返回了
    public static void selectGoods(String sql,Object...params){
        //1、创建链接
        Connection connection=getConnection();
        //2、创建预编译对象
        PreparedStatement psta=null;
        //3、创建查询结果集
        ResultSet rs=null;
        //4、创建列名类
        ResultSetMetaData metaData=null;
        try {
            psta=getPreparedStatement(connection,sql,params);
            rs=psta.executeQuery();
            metaData = rs.getMetaData();
            //列名数量
            int count=metaData.getColumnCount();
            //循环遍历结果集
            while(rs.next()){
                Map map= new TreeMap();
                for(int i=1;i<=count;i++){
                    //列名
                    String column_name=metaData.getColumnName(i);
                    //列值
                    Object val=rs.getObject(i);
                    map.put(column_name,val);
                }
                System.out.println(map.toString());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(null,psta,rs);
        }
    }

    //增删改通用方法
    public static int write(String sql,Object...params){
        //1、链接
        Connection connection=getConnection();
        //2、预编译对象
        PreparedStatement psta=null;
        //3、返回结果值
        int result=-1;
        try {
            psta=getPreparedStatement(connection,sql,params);
            result=psta.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(null,psta,null);
        }
        return result;
    }
    //添加数据
    public static int insertGoods(String sql,Object...params){
        int result=write(sql,params);
        return result;
    }
    //修改数据
    public static int updateGoods(String sql,Object...params){
        int result=write(sql,params);
        return result;
    }
    //删除数据
    public static int deleteGoods(String sql,Object...params){
        int result=write(sql,params);
        return result;
    }

Test测试类:

public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int result=-1;
        int type=0;
        while(true){
            System.out.println("欢迎使用JAVA操作数据库系统,您可以进行以下操作(数字操作)");
            System.out.println("1:查询   2:插入   3:修改    4:删除   0:退出本系统");
            System.out.println("请输入您的操作:");
            type=scanner.nextInt();
            //丢弃当前换行
            scanner.nextLine();
            if(type==0){
                System.out.println("Bye Bye~~");
                break;
            }
            if(type==1){
                //查询数据
                System.out.println("请输入您要查询的语句:");
                String sql1=scanner.nextLine();
                System.out.println("您要查询的结果为:");
                JDBCUtil.selectGoods(sql1);
            }
            if(type==2){
                //添加数据
                System.out.println("请输入您要插入的语句:");
                String sql2=scanner.nextLine();
                result=JDBCUtil.insertGoods(sql2);
                if(result!=-1){
                    System.out.println("插入成功,影响了"+result+"条数据");
                }else{
                    System.out.println("插入失败");
                }
            }
            if(type==3){
                //修改数据
                System.out.println("请输入您要修改的语句:");
                String sql3=scanner.nextLine();
                result=JDBCUtil.insertGoods(sql3);
                if(result!=-1){
                    System.out.println("修改成功,影响了"+result+"条数据");
                }else{
                    System.out.println("修改失败");
                }
            }
            if(type==4){
                //删除数据
                System.out.println("请输入您要删除的语句:");
                String sql4=scanner.nextLine();
                result=JDBCUtil.insertGoods(sql4);
                if(result!=-1){
                    System.out.println("删除成功,影响了"+result+"条数据");
                }else{
                    System.out.println("删除失败");
                }
            }
        }
    }


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

相关文章:

  • 计算机毕业设计——Springboot的校园新闻网站
  • pytest测试专题 - 1.2 如何获得美观的测试报告
  • ffmpeg -codecs
  • 【学习笔记】计算机网络(三)
  • GitHub分支与标签完全指南:从入门到高效管理
  • 图像锐化(QT)
  • 云原生周刊:DeepSeek 颠覆人工智能
  • 基于springboot+vue的校园招聘网站的设计与实现
  • 《手札·数转篇》中小制造企业的信息化升级:MES系统的价值与应用
  • mysql 不是内部或外部命令,也不是可运行的程序或批处理文件
  • LeetCode-169多数元素
  • html+canvas地图画布实现快速拖动出现瓦片空白问题优化
  • 网络安全溯源 思路 网络安全原理
  • cppcheck静态扫描代码是否符合MISRA-C 2012规范
  • 1 推荐系统概述
  • 重启电脑之后vscode不见了
  • HTTP协议学习大纲
  • vLLM 安装记录 (含踩坑xformers)
  • #渗透测试#批量漏洞挖掘#ServiceNow UI Jelly模板注入(CVE-2024-4879)
  • 更换网络IP地址几种简单的方法
  • 计算机毕业设计SpringBoot+Vue.js+H5在线花店 花店app 鲜花销售系统 网上花店(app+web)(源码+文档+运行视频+讲解视频)
  • java后端开发day11--综合练习(二)
  • 【模型部署】大模型部署工具对比:SGLang, Ollama, VLLM, LLaMA.cpp如何选择?
  • linux tcpdump文件分割
  • 【Vue】3.0利用远程仓库自定义项目脚手架
  • SPI机制:Java SPI原理及源码剖析、应用场景分析与自实现案例实战详解