MySQL从入门到入魔之数据库连接池(01)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL从入门到入魔之数据库连接池(01)

数据库连接池


为什么使用数据库连接池?

如果不使用连接池每一次客户端发出的业务请求都需要对应一次数据库连接,如果有一万次请求就有一万次数据库连接的建立和断开,频繁的开关连接会影响程序的执行效率,通过数据库连接池可以将数据库连接进行复用,从而提高执行效率.


如何使用?


//创建连接池对象
  DruidDataSource ds = new DruidDataSource();
  //设置数据库连接信息
  ds.setDriverClassName(driver);
  ds.setUrl(url);
  ds.setUsername(username);
  ds.setPassword(password);
  //设置初始连接数量
  ds.setInitialSize(Integer.parseInt(initSize));
  //设置最大连接数量
  ds.setMaxActive(Integer.parseInt(maxSize));
  //从连接池对象中获取连接  异常抛出
  Connection conn = ds.getConnection();


jdbc.properties


db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/newdb3?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
db.username=root
db.password=123456
db.maxActive=10
db.initialSize=2



读取*.properties配置文件


//创建读取配置文件的属性对象
  Properties p = new Properties();
  //得到文件输入流 这种写法会自动去src/main/resources目录下找文件
  InputStream ips = Demo03.class.getClassLoader()
    .getResourceAsStream("my.properties");
  //把文件输入流交给属性对象
  p.load(ips);
  //读取数据
  String name = p.getProperty("name");
  //getProperty方法只能读取字符串
  String age = p.getProperty("age");
  System.out.println(name+":"+age);


读取 jdbc.properties配置文件

public class DBUtils {
  private static DruidDataSource ds;
  //因为读取配置文件只需要读取一次,连接池对象也只需要创建一次 
  static {
    //读取配置文件里面的数据
    Properties p = new Properties();
    InputStream ips = DBUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
    try {
      p.load(ips);
    } catch (IOException e) {
      e.printStackTrace();
    }
    String driver = p.getProperty("db.driver");
    String url = p.getProperty("db.url");
    String username = p.getProperty("db.username");
    String password = p.getProperty("db.password");
    String maxActive = p.getProperty("db.maxActive");
    String initialSize = p.getProperty("db.initialSize");
    ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ds.setUrl(url);
    ds.setUsername(username);
    ds.setPassword(password);
    // 设置初始连接数量
    ds.setInitialSize(Integer.parseInt(initialSize));
    // 设置最大连接数量
    ds.setMaxActive(Integer.parseInt(maxActive));
  }
  public static Connection getConn() throws SQLException {
    // 注册驱动
    // 从连接池对象中获取连接 异常抛出
    Connection conn = ds.getConnection();
    System.out.println(conn);
    return conn;
  }
}


创建用户表

use newdb3;

create table user(id int primary key auto_increment,username varchar(20),password varchar(20))charset=utf8;

注册功能

import java.sql.Connection;
import java.sql.Statement;
import java.util.Scanner;
/**
 * 注册功能
 * @author 海拥😋
 * @date 2020年5月7日 下午2:04:42
 */
public class Demo04 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    String username = sc.nextLine();
    System.out.println("请输入密码");
    String password = sc.nextLine();
    sc.close();
    // 获取连接
    try (Connection conn = DBUtils.getConn();) {
      Statement s = conn.createStatement();
      String sql = "insert into user values(null,'"+username+"','"+password+"')";
      s.executeUpdate(sql);
      System.out.println("注册成功");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

登录功能

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/** 
 * 登录功能
 * @author 海拥😋
 * @date 2020年5月7日 下午2:11:29
 */
public class Demo05 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入用户名");
    String username = sc.nextLine();
    System.out.println("请输入密码");
    String password = sc.nextLine();
    //获取连接
    try (Connection conn = DBUtils.getConn();) {
      Statement s = conn.createStatement();
//      String sql =
//          "select count(*) from user where username='"
//          +username+"'and password='"+password+"'";
//      ResultSet rs = s.executeQuery(sql);
      //通过PrepredStatement解决SQL注入问题
      String sql = "select count(*) from user where username=? and password=?";
      //在编译时已经将SQL语句的业务逻辑锁死 用户写的内容不会再影响逻辑
      PreparedStatement ps = conn.prepareStatement(sql);
      //替换sql中的?
      ps.setString(1, username);
      ps.setString(2, password);
      //执行SQL
      ResultSet rs = ps.executeQuery();
      //查询回来的是符合条件的数量 只有一条数据所以可以用if 如果查询回来的是
      //多条数据必须用while
      if(rs.next()) {
        //取出查询回来的符合条件的数量
        int count =rs.getInt(1);
        if(count>0) {
          System.out.println("登录成功");
        }else {
          System.out.println("登录失败");
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
19 0
|
1天前
|
存储 数据处理 数据库
深入了解达梦数据库的增删查改操作:从入门到精通
深入了解达梦数据库的增删查改操作:从入门到精通
|
1天前
|
前端开发 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口
15 0
|
1天前
|
Java 关系型数据库 MySQL
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口(下)
【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口
9 0
|
1天前
|
SQL 关系型数据库 Serverless
阿里云关系型数据库RDS
阿里云关系型数据库RDS
15 2
|
1天前
|
关系型数据库 MySQL 数据库
mysql 设置环境变量与未设置环境变量连接数据库的区别
设置与未设置MySQL环境变量在连接数据库时主要区别在于命令输入方式和系统便捷性。设置环境变量后,可直接使用`mysql -u 用户名 -p`命令连接,而无需指定完整路径,提升便利性和灵活性。未设置时,需输入完整路径如`C:\Program Files\MySQL\...`,操作繁琐且易错。为提高效率和减少错误,推荐安装后设置环境变量。[查看视频讲解](https://www.bilibili.com/video/BV1vH4y137HC/)。
22 3
mysql 设置环境变量与未设置环境变量连接数据库的区别
|
1天前
|
SQL Java 关系型数据库
零基础轻松入门Java数据库连接(JDBC)
零基础轻松入门Java数据库连接(JDBC)
12 0
|
1天前
|
关系型数据库 MySQL 数据库连接
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections
18 0
|
1天前
|
存储 Oracle 关系型数据库
oracle 数据库 迁移 mysql数据库
将 Oracle 数据库迁移到 MySQL 是一项复杂的任务,因为这两种数据库管理系统具有不同的架构、语法和功能。
23 0
|
1天前
|
安全 Java 数据库连接
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通
在IntelliJ IDEA中通过Spring Boot集成达梦数据库:从入门到精通