数据库连接池原理

image.png
使用数据库连接池提前申请链接
image.png

数据库连接池实现

  • 标准接口:DataSource
    • 官方提供的数据库连接池标准接口,有第三方组织实现
    • 功能:获取链接
      • Connection getConnection()
      • 所有获取链接方法改用DataSource.getConnection()
    • 常见的数据库连接池:
      • DBCP
      • C3P0
      • Druid
    • Druid(德鲁伊)
      • Druid 连接池是阿里巴巴开源的数据库连接池
      • 功能强大,性能优秀,是Java语言最好的数据库连接池之一

        Druid使用步骤

  1. 导入jar包 druid-1.1.12.jar
  2. 定义配置文件
  3. 加载配置文件
  4. 获取数据库连接池对象
  5. 获取链接
  • 德鲁伊配置文件 druid.propertie
  • driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///sell?useSSL=false&&useServerPrepStmts=true
    username=root
    password=1234
    # 初始化链接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000

// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象,使用DruidDataSourceFactory工厂模式获取配置文件
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
TIps:// 查找当前文件路径(E:\IdeaProjects\jdbcdemo)
System.out.println(System.getProperty(“user.dir”));
idea快捷键 左键+alt可以单边选择右边内容。将整体选中行数可以直接方向键挪动位置
自动格式化代码:ctrl+alt+L

商品品牌数据的增删改查操作

  • 查询:查询所有数据
  • 添加:添加品牌
  • 修改:根据id修改
  • 删除:根据id删除

操作步骤

  1. 创建数据库表

drop table if exists _tb_brand;
_create table _tb_brand(
id _int primary key auto_increment
,
brandname _varchar(20),
companyname _varchar(20),
ordered int,
description varchar(100),
status int
);
insert into _tb_brand(brand_name,company_name,ordered,_description,status)
values (‘三只松鼠’,’三只松鼠股份有限公司’,5,’好吃不上火’,0),(‘华为’,’华为有限公司’,500,’牛逼的华为’,1),(‘三星’,’三星爆炸有限公司’,600,’炸你全家’,1);

  1. 创建java实体类

// 在实体类中基础数据类型,应该使用包装类型,int有默认值为0
private Integer status;
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;

  1. 测试用例

    查询所有数据的步骤

    1. 获取Connecction DataSourcce
    2. 定义SQL语句: select * from tb_brand
    3. 获取PreparedStatement 预编译SQL对象
    4. 设置预编译sql参数:(因为查询所有数据所以不需要参数)
    5. 执行sql
    6. 处理结果:List
    7. 释放资源_public void query() throws Exception{
      // 导入Druid 包
      // 定义配置文件
      // 加载配置文件
      Properties prop = new Properties();
      // 使用IO流加载配置文件写入
      prop.load(new FileInputStream(“src/druid.properties”));
      // 使用druid工厂链接加载的配置文件
      DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
      // 获取数据库链接
      final Connection connection = dataSource.getConnection();
      // 注入预编译sql语句
      String sql = “select from tb_brand”;
      final PreparedStatement ps = connection.prepareStatement(sql);
      // 执行sql
      final ResultSet resultSet = ps.executeQuery();
      Brand brand = null;
      List<Brand> list = new ArrayList<>();
      while (resultSet.next()) {
      // 获取数据
      final int id = resultSet.getInt(“id”);
      final String brandName = resultSet.getString(“brand_name”);
      final String companyName = resultSet.getString(“company_name”);
      final String description = resultSet.getString(“description”);
      final int ordered = resultSet.getInt(“ordered”);
      final int status = resultSet.getInt(“status”);
      // 封装对象,将数据库数据给dao层
      brand = new Brand();
      brand.setId(id);
      brand.setBrandName(brandName);
      brand.setDescription(description);
      brand.setOrdered(ordered);
      brand.setCompanyName(companyName);
      brand.setStatus(status);
      // 装载到集合中
      list.add(brand); }
      System.out.println(list);
      resultSet.close();
      ps.close();
      connection.close(); *}

查询结果三要素:

  1. 查询语句SQL
  2. 参数: 需要/不需要
  3. 结果:List

    添加:添加数据

  4. 添加SQL语句

    1. insert into tb_brand(x,xx,xxx.)values(?,?,?)
  5. 是否需要参数?,需要除了id以外都要填入
  6. 如何封装?boolean 返回添加成功或者失败

_@Test
_public void update() throws Exception{
// 接收页面提交的参数
String brandName = “信息中心”;
String companyName = “中国石化”;
String description = “牛逼”;
int order = 4;
int status = 1;
// 导入Druid 包
// 定义配置文件
// 加载配置文件
Properties prop = new Properties();
// 使用IO流加载配置文件写入
prop.load(new FileInputStream(“src/druid.properties”));
// 使用druid工厂链接加载的配置文件
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取数据库链接
final Connection connection = dataSource.getConnection();
// 注入预编译添加sql语句
String sql = “insert into tb_brand(brand_name,company_name,ordered,description,status)values(?,?,?,?,?)”;
// 执行预编译sql语句
PreparedStatement ps = connection.prepareStatement(sql);
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setString(1,brandName);
ps.setString(2, companyName);
ps.setString(4,description);
ps.setInt(5,status);
ps.setInt(3,order);
// 执行预编译sql语句不需要参数,PreparedStatement的增删改方法是executeUpdate()
final int update = ps.executeUpdate();
// 封装语句返回boolean类型,判断该语句影响的数据库行数
System.out.println(update>0);
// 关闭资源
ps.close();
connection.close(); }

修改:修改数据

  1. 修改SQL语句
    1. update tb_brand set(x,xx,xxx.) where id = ?
  2. 是否需要参数?,需要所有参数包括对应的id
  3. 如何封装?boolean 返回添加成功或者失败

_@Test
_public void add() throws Exception {
int id = 4;
String brandName = “通信中心”;
String companyName = “中国石油”;
String description = “垃圾”;
int order = 4;
int status = 1;
// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection conn = dataSource.getConnection();
// 执行sql语句
String sql = “update tb_brand set brand_name = ?,company_name = ?,ordered = ?,description = ?,status = ? where id = ?”;
// 执行预编译sql语句
PreparedStatement ps = conn.prepareStatement(sql);
// 设置修改的参数在预编译语句中
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setString(1,brandName);
ps.setString(2, companyName);
ps.setString(4,description);
ps.setInt(5,status);
ps.setInt(3,order);
ps.setInt(6,id);
final int update = ps.executeUpdate();
if (update > 0) {
System.out.println(“ok”);
}else {
System.out.println(“error”);
}
conn.close();
ps.close(); }

删除:删除数据

  1. 修改SQL语句
    1. delete from tb_brand where id = ?
  2. 是否需要参数?,需要参数id
  3. 如何封装?boolean 返回添加成功或者失败

_@Test
_public void delete() throws Exception {
int id = 4;
// 加载配置文件
Properties prop = new Properties();
// 使用IO流FileInputStream写入文件配置
prop.load(new FileInputStream(“src/druid.properties”));
// 获取连接池对象
final DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
// 获取对的数据库 链接Connection
Connection conn = dataSource.getConnection();
// 执行sql语句
String sql = “delete from tb_brand where id = ?”;
// 执行预编译sql语句
PreparedStatement ps = conn.prepareStatement(sql);
// 设置修改的参数在预编译语句中
// 设置参数使用,预编译sql的preparedStatement的setXxx参数类型添加
ps.setInt(1,id);
final int update = ps.executeUpdate();
if (update > 0) {
System.out.println(“ok”);
}else {
System.out.println(“error”);
}
conn.close();
ps.close(); }