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

mysql的JDBC和连接池

目录

  • JDBC和连接池
    • 1. JDBC
    • 2. 连接池
      • 1. 概念
      • 2. 分类
      • 3. 步骤
    • 3. Apache-dbUtils
      • 1. 概念
      • 2. 以下是相关类
      • 3. 示例
    • 4. BasicDao
      • 基础理解

JDBC和连接池

1. JDBC

  1. 概念:jdbc是 Java 访问数据库的标准 API,为访问不同的数据库提供了统一接口。
  2. 以下是常用的API:
    在这里插入图片描述
    在这里插入图片描述
  1. 其中因为普通的Statement有SQL注入安全隐患,一般使用PrepareStatement,该接口在sql查询语句中用作占位符,再用setXxx()传入参数。
    String sql = "select name , pwd from admin where name =? and pwd = ?";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, admin_name);
    preparedStatement.setString(2, admin_pwd);
    

在这里插入图片描述

  1. 编写步骤:基础的四步骤为注册驱动,获取连接,执行SQL语句,释放资源,因为实际项目一般要用到连接池,这部分就不过多赘述,以下为示例代码:
        Class.forName("com.mysql.cj.jdbc.Driver");
//        String url = "jdbc:mysql://local:3306/test";String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";String user = "root";String password = "12345689";Connection connection = DriverManager.getConnection(url, user, password);System.out.println(connection);Statement statement = connection.createStatement();String sql = "select * from dept";ResultSet resultSet = statement.executeQuery(sql);while(resultSet.next()){int deptno = resultSet.getInt("DEPTNO");String dname = resultSet.getString("DNAME");String loc = resultSet.getString("LOC");System.out.println(deptno+"\t"+dname+"\t"+loc);}resultSet.close();statement.close();connection.close();

2. 连接池

1. 概念

连接池本质就是为了减少频繁连接带来的损耗,维持一定数量的连接,需要连接时从池中取出,用完放回即可。

2. 分类

常见的连接池有C3P0和Druid,Druid得益于其优秀的性能在当下被广泛使用

3. 步骤

因为连接池可以使用配置文件,与直接用JDBC只有在前两步有所区别,或者说更为简便

//c3p0ComboPooledDataSource test = new ComboPooledDataSource("test");String sql = "select * from dept";Connection connection = test.getConnection();
//Druid      
//        Properties properties = new Properties();
//        properties.load(new FileInputStream("src\\druid.properties"));
//        DataSource dataSource =   DruidDataSourceFactory.createDataSource(properties);
//        Connection connection = dataSource.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(sql);while(resultSet.next()){int deptno = resultSet.getInt("DEPTNO");String dname = resultSet.getString("DNAME");String loc = resultSet.getString("LOC");System.out.println(deptno+"\t"+dname+"\t"+loc);}resultSet.close();statement.close();connection.close();

3. Apache-dbUtils

1. 概念

为了解决在connection关闭后仍然可以获取到resulteSet中的数据,于是Apache组织提供的commons-dbutils工具库可以解决这个问题,在这里还需要用到Java Bean, 是一种遵循特定编程规范的 Java 类,用于封装数据,简单来讲就是将表中的各个字段转换成类的属性。

2. 以下是相关类

请添加图片描述

3. 示例

        Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();QueryRunner queryRunner = new QueryRunner();
//        String sql = "select * from dept where DEPTNO >= ?";
//        List<Dept> list = queryRunner.query(connection, sql, new BeanListHandler<>(Dept.class), 1);
//        for (Dept dept : list) {
//            System.out.println(dept);
//        }
//        String sql = "select * from dept where DEPTNO = ?";
//        Dept dept = queryRunner.query(connection, sql, new BeanHandler<>(Dept.class), 10);
//        String sql = "select ? from dept where DEPTNO = ?";
//        Object dept = queryRunner.query(connection, sql, new ScalarHandler(), "DEPTNO", 10);
//        System.out.println(dept);String sql = "insert into dept values (?,?,?)";int update = queryRunner.update(connection, sql, 50, "DISCUSSION", "MEXICO");System.out.println(update);connection.close();

4. BasicDao

基础理解

Dao即为数数据对象,它的作用是封装对数据库的数据库的访问,将各个Dao共同操作放在一起即为BasicDao,这样数据库的每张表都可以在BasicDao的基础上实现自己的Dao,大大提高了代码的维护性,再结合apche-dbutils和Druid,可以形成以下开发中的层次结构图:
在这里插入图片描述

本文部分截图自于【零基础 快速学Java】韩顺平 零基础30天学会Java

http://www.lryc.cn/news/581433.html

相关文章:

  • 如何正确规范的开发术语自己的TYPECHO插件
  • 【CSS样式】有趣的滑块开关
  • Gin Web 服务集成 Consul:从服务注册到服务发现实践指南(下)
  • 【influxdb3】如何使用 SQL 对时间序列数据进行聚合查询
  • CppCon 2018 学习:Woes of Scope Guards and Unique_Resource
  • Redis存储Cookie实现爬虫保持登录 requests | selenium
  • RK3588 源码编译 opencv
  • Java 大视界 -- Java 大数据在智能教育在线课程学习效果影响因素分析与优化设计(334)
  • Web后端开发-SpringBootWeb入门、Http协议、Tomcat
  • Spring Boot + 本地部署大模型实现:优化与性能提升!
  • Docker相关内容
  • 闲庭信步使用图像验证平台加速FPGA的开发:开篇语——跨越软件和硬件开发的鸿沟
  • string类(详解)
  • Linux关机指令详解:shutdown命令的使用指南
  • SpringAI与智能体入门
  • 成为git砖家(12): 看懂git合并分支时冲突提示符
  • Linux操作系统之文件(四):文件系统(上)
  • PADS交互式布局
  • PageRank:互联网的马尔可夫链平衡态
  • 线程锁和线程同步
  • Servlet学习
  • Spring--循环依赖以及三级缓存详解
  • Chat Model API
  • Altium Designer使用教程 第一章(Altium Designer工程与窗口)
  • Eureka和Nacos都可以作为注册中心,它们之间的区别
  • Java类变量(静态变量)
  • 【论文】微服务架构下分布式事务一致性解决方案设计与实践
  • 《数据维度的视觉重构:打造交互式高维数据可视化的黄金法则》
  • Java教程——深入学习guava之并发编程
  • 如何使用backtrace定位Linux程序的崩溃位置