DBCP连接池和登录注册按例

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: ● 实际上就是存放连接的池子(容器)● 在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程● 为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。● 这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

一、连接池介绍

1、连接池介绍

  • 实际上就是存放连接的池子(容器)
  • 在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
  • 为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。
  • 这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

2、连接池概念规范和DataSource(数据源)接口

A、连接池概念规范

  • 不用自己来创建Connection,而是通过池来获取Connection对象
  • 使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池
  • 连接池技术可以完成Connection对象的再次利用

B、DataSource接口

  • Java为数据库连接池提供了公共的接口:javax.sql.DataSource
  • 各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池
  • 常见的连接池:DBCP、C3P0
    ###03DBCP连接池介绍

3、DBCP连接池介绍

  • DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池
  • tomcat是javaweb服务器,把我们写好的class文件放在Tomcat软件中,软件开启的时候会开启端口,根据不同功能返回不同结果

二、连接池如何使用

1、导入jar包

  • jar包介绍
  • mysql-connector-java-5.1.37-bin.jar:数据库驱动
  • commons-dbutils-1.6.jar:提供QueryRunner类方便进行增删改查操作
  • commons-dbcp-1.4.jar:
  • commons-pool-1.5.6.jar:提供高效的数据库连接池技术
  • b: 导入jar包
  • 在项目根路径下建立文件夹lib
  • 拷贝以上jar包,选定拷贝的jar包/右键/Build Path/Add to Build Path

三、BasicDataSource类的使用

连接池jar包中,定义好一个类 BasicDataSource,实现类数据源的规范接口 javax.sql.DataSource

1、BasicDataSource类的常见配置

分类 属性 描述
必须项
driverClassName 数据库驱动名称
url 数据库的地址
username 用户名
password 密码
基本项(扩展)
maxActive 最大连接数量
minIdle 最小空闲连接
maxIdle 最大空闲连接(空闲连接即没有使用到的连接)
initialSize 初始化连接

2、使用DBCP实现数据库连接池工具类示例代码

package Util;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils {
  //创建出BasicDataSource类对象
  private static BasicDataSource datasource= new BasicDataSource();
  //静态代码块,对象BasicDataSource对象中的配置,自定义
  static {
    //数据库连接信息,必须的
    datasource.setDriverClassName("com.mysql.jdbc.Driver");
    datasource.setUrl("jdbc:mysql://localhost:3306/day33_user");
    datasource.setUsername("root");
    datasource.setPassword("aaaaa123");
    //对象连接池中的连接数量配置,可选的
    datasource.setInitialSize(10);//初始化的连接数
    datasource.setMaxActive(8);//最大连接数量
    datasource.setMaxIdle(5);//最大空闲数
    datasource.setMinIdle(1);//最小空闲
  }
  //定义静态方法,返回BasicDataSource类的对象
  public static DataSource getDataSource() {
    return datasource;
  }
}

3、测试写好的工具类

package ui;
import java.sql.SQLException;
import java.util.List;
import javax.management.RuntimeErrorException;
import javax.naming.spi.Resolver;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import Util.JDBCUtils;
public class QueryRunnerDemo {
  public static void main(String[] args) {
//    select();
    insert();
  }
  //QueryRunner类对象,写在类成员位置
  private static QueryRunner qr= new QueryRunner(JDBCUtils.getDataSource());
  //定义2个方法,实现数据表的添加,数据表查询
  //数据表查询
  public static void select() {
    try {
      String sql = "SELECT * FROM users";
      List<Object[]> list =qr.query(sql, new ArrayListHandler());
      //遍历对象数组集合
      for(Object[] objs:list) {
        for(Object obj:objs) {
          System.out.print(obj);
        }
        System.out.println();
      }
    } catch (SQLException e) {
      e.printStackTrace();
      throw new RuntimeException("数据查询失败");
    }
  }
  //数据表添加数据
  public static void insert() {
    try {
      String sql="INSERT INTO users (username,PASSWORD) VALUES (?,?)";
      Object[] params = {"c","3"};
      int result=qr.update(sql, params);
      System.out.println(result);
    } catch (SQLException e) {
      e.printStackTrace();
      throw new RuntimeException("插入数据失败");
    }
  }
}

四、登录注册案例分析

1、分析

  • a: 登录
  • 调用另一个类的方法,传递用户名和密码
  • 导数据表中查询是否有用户
  • 如果有,告诉用户登录成功
  • b: 注册
  • 接收键盘输入的用户名和密码
  • 调用另一个类的方法,传递用户名和密码
  • 查询用户名是否存在,存在就告诉用户注册失败,不存在执行数据库的insert操作

2、实现步骤

  • 创建数据库和数据表
  • 分别建立dao、entity、mgr、service、ui、util包,各自作用如下:

dao

entity

mgr

service

ui

util

对应数据库层,和数据库打交道

实体包

管理包

逻辑层包

用户界面包

工具类

包括实现类和接口,其中实现类在dao下面新建一个impl包存放(UserDao、UserDaoImpl)

和数据表对应,有构造方法以及set、get方法(User)

定义用户管理操作,一系列的输入输出都在这里完成(Usermgr)

包含逻辑层接口和接口的实现类,是直接面向用户的(UserService、UserServiceImpl)

实际中是图形化界面HTML等,这里用test代替

一系列的工具,这里有JDBCUtils,通过连接池来进行数据库连接操作


  • 在项目下面建立lib文件夹,导入四个jar包,并build path
  • 按照架构进行编程

3、各个包中具体类源码

  • dao
package dao;
/**
 * 对用户操作的接口
 * @author Administrator
 *
 */
public interface UsersDao {
  //登录
  public Object[] login(String username,String password);
  //注册
  public boolean registr(String username,String password);
}


  • entity
package entity;
public class User {
  private String username;
  private String password;
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public User(String username, String password) {
    super();
    this.username = username;
    this.password = password;
  }
  public User() {
    super();
  }
}


  • mgr
package mgr;
import java.util.Scanner;
import service.UsersService;
import service.impl.UsersServiceImpl;
//用户管理类
public class UsersMgr {
  Scanner input = new Scanner(System.in);
  UsersService usersService = new UsersServiceImpl();
  private String username;
  private String password;
  /**
   * 主菜单
   */
  public void menu() {
    boolean flag = true;
    do {
      System.out.println("*****欢迎进入苍何的登录系统*****");
      System.out.println("1、登录");
      System.out.println("2、注册");
      System.out.println("3、退出");
      System.out.print("请选择:");
      int option = input.nextInt();
      switch (option) {
      case 1:
        login();
        break;
      case 2:
        register();
        break;
      case 3:
        System.exit(0);
      default:
        flag = false;
        break;
      }
    } while (flag);
  }
  public void login() {
    System.out.print("请输入您的用户名:");
    username = input.next();
    System.out.print("请输入您的密码:");
    password = input.next();
    boolean success = usersService.login(username, password);
    if (success) {
      System.out.println("登录成功,欢迎进入");
    } else {
      System.out.println("用户名或密码错误");
    }
  }
  public void register() {
    System.out.print("请输入您的用户名:");
    username = input.next();
    System.out.print("请输入您的密码:");
    password = input.next();
    boolean success = usersService.register(username, password);
    if(success) {
      System.out.println("注册成功");
    }else {
      System.out.println("用户名已存在,请重新注册");
    }
  }
}


  • service
package service;
//逻辑层接口
public interface UsersService {
  public boolean login(String username,String password);
  public boolean register(String username,String password);
}


  • ui
package ui;
import mgr.UsersMgr;
public class UserOperator {
  public static void main(String[] args) {
    UsersMgr usersMgr = new UsersMgr();
    usersMgr.menu();
  }
}


  • util
package util;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils {
  //创建出BasicDataSource类对象
  private static BasicDataSource datasource= new BasicDataSource();
  //静态代码块,对象BasicDataSource对象中的配置,自定义
  static {
    //数据库连接信息,必须的
    datasource.setDriverClassName("com.mysql.jdbc.Driver");
    datasource.setUrl("jdbc:mysql://localhost:3306/day33_user");
    datasource.setUsername("root");
    datasource.setPassword("aaaaa123");
    //对象连接池中的连接数量配置,可选的
    datasource.setInitialSize(10);//初始化的连接数
    datasource.setMaxActive(8);//最大连接数量
    datasource.setMaxIdle(5);//最大空闲数
    datasource.setMinIdle(1);//最小空闲
  }
  //定义静态方法,返回BasicDataSource类的对象
  public static DataSource getDataSource() {
    return datasource;
  }
}


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
数据格式
bootstrap-table 树形结构
bootstrap-table 树形结构
490 0
|
算法
雪花算法id生成器
雪花算法id生成器
896 0
|
前端开发 JavaScript
Bootstrap File Input,最好用的文件上传组件(1)
Bootstrap File Input,最好用的文件上传组件
853 0
Bootstrap File Input,最好用的文件上传组件(1)
|
4月前
|
运维 监控 Java
分布式事务新方案:Saga 与 TCC 在 Java 生态的融合实践
本文深入探讨Saga与TCC两种分布式事务模式在Java生态中的原理、实现及融合实践,结合Seata等框架,分析其在微服务架构下的应用策略、性能优化与监控运维,助力构建高效稳定的分布式事务解决方案。
702 1
|
机器学习/深度学习 人工智能 分布式计算
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
我的阿里云社区年度总结报告:Python、人工智能与大数据领域的探索之旅
387 35
|
存储 安全 数据库
SNMP(简单网络管理协议)介绍
SNMP(简单网络管理协议)介绍
602 0
|
Kubernetes Cloud Native Java
当 Quarkus 遇上 Spring Boot,谁才是现代云原生应用的终极之选?究竟哪款能助你的应用傲视群雄?
Quarkus 和 Spring Boot 均为构建现代云原生应用的热门框架,旨在简化开发流程并提升性能。Spring Boot 依托庞大的 Spring 生态系统,提供开箱即用的体验,适合快速搭建应用。Quarkus 由红帽发起,专为 GraalVM 和 HotSpot 设计,强调性能优化和资源消耗最小化,是云原生环境的理想选择。
1173 3
|
前端开发 容器
bootstrap table 设置自定义列宽
【5月更文挑战第4天】bootstrap table 设置自定义列宽
|
存储 人工智能 开发框架
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
【AI大模型应用开发】【AutoGPT系列】0. AutoGPT概念及原理介绍 - Agent开发框架及ReAct方法
1103 0
|
Java Spring
08 SpringBoot配置文件加载位置
08 SpringBoot配置文件加载位置
159 0

热门文章

最新文章