数据库连接池与DBUtils工具

前言:
使用JDBC的基本用法和操作来与数据库交互,由于每操作一次数据库,都会执行一次创建和断开Connection对象的操作,这种频繁的操作Connection对象十分影响数据库的访问效率,并且增加了代码量,所以在实际开发中,开发人员通常会使用数据库连接池来解决这些问题。Apache组织还提供了一个DBUtils工具类库,该类库实现了对JDBC的简单封装,能在不影响性能的情况下极大地简化JDBC的编码工作。

数据库连接池:
在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数据库连接的开销很大,尤其是在大量的并发访问时。假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。为了避免频繁地建数据库连接,数据库连接池技术应运而生。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用现有的数据库连接,而不是重新建立。接下来,通过一张图来简单描述应用程序如何通过连接池连接数据库,如下图所示。
在这里插入图片描述
从上图中可以看出,数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,当应用程序访问数据库时并不是直接创建Connection, 而是向连接池“申请”一个Connection。如果连接池中有空闲的Connection,则将其返回,否则创建新的Connection。使用完毕后,连接池会将该Connection回收,并交付其他的线程使用,以减少创建和断开数据库连接的次数,提高数据库的访问效率。

C3P0数据源
C3P0是目前最流行的开源数据库连接池之一,它实现了DataSource 数据源接口,支持JDBC2和JDBC3的标准规范,易于扩展并且性能优越,著名的开源框架Hibernate和Spring都支持该数据源。在使用C3P0数据源开发时,需要了解C3P0中DataSource接口的实现类ComboPooledDataSource,它是C3P0的核心类,提供了数据源对象的相关方法。

通过ComboPooledDataSource()创建数据源对象

首先,在项目中导入JAR包c3p0-0.9.2.1.jar和mchange-commons-java-0.2.3.4.jar。
代码:

package dao;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
/**
 * Created by lc on 2018/8/12.
 */
public class C3p0Utils {
   public static DataSource ds=null;
    //初始化C3P0数据源
    static {
        ComboPooledDataSource cpds=new ComboPooledDataSource();
        //设置连接数据库需要的配置信息
        try {
            cpds.setDriverClass("com.mysql.jdbc.Driver");
            cpds.setJdbcUrl("jdbc:mysql://localhost:3306/shop");
            cpds.setUser("root");
            cpds.setPassword("root");
            //设置连接池的参数
            cpds.setInitialPoolSize(5);//初始连接数目
            cpds.setMaxPoolSize(15);//最大连接数目
            ds=cpds;
        }catch (Exception e){
            throw new ExceptionInInitializerError(e);
        }
    }
    //返回数据源
    public  static DataSource getDataSource(){
        return ds;
    }
}

DBUtils工具:
为了更加简单地使用JDBC, Apache组织提供了一一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。

package dao;
import javabeen.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import java.sql.*;
public class Userdao {
    public boolean Vfpassword(User user) throws SQLException{
        //创建QueryRunner对象,并从C3P0连接池获取数据源
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        //写SQL语句
        String sql="SELECT  * FROM user WHERE username=? AND password=?";
        //调用方法
        User user1 = (User) runner.query(sql,new BeanHandler(User.class), new Object[]{user.getUsername(),user.getPassword()});
        if (user1!=null){
            return true;
        }
        else {
            return false;
        }
    }
    public boolean register(User user) throws SQLException{
        QueryRunner runner=new QueryRunner(C3p0Utils.getDataSource());
        String sql="INSERT INTO user VALUES (?,?,?)";
        int i=runner.update(sql, new Object[]{user.getUsername(), user.getPassword(), user.getTel()});
        System.out.println(i);
            if (i>0){
                System.out.println(user.getUsername()+"注册成功!");
                return true;
            }
      else{
                System.out.println("注册失败!");
                return false;
            }
 
    }
}

DBUtils工具类
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能

核心功能
QueryRunner 中提供对sql语句操作的API.
ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
DbUtils类,他就是一个工具类,定义了关闭资源与事务处理相关方法.
JavaBean组件

  1. 需要实现 序列化接口, Serializable (暂时可以省略)
  2. 提供私有字段: private 类型 变量名;
  3. 提供 getter 和 setter
  4. 提供 空参构造
/**
 * javabean
 * 用来存储数据
 */
public class Employee implements Serializable {
    
    private int eid;
    private String ename;
    private int age;
    private String sex;
    private double salary;
    private Date empdate;

    public Employee() {
    }

    public Employee(int eid, String ename, int age, String sex, double salary, Date empdate) {
        this.eid = eid;
        this.ename = ename;
        this.age = age;
        this.sex = sex;
        this.salary = salary;
        this.empdate = empdate;
    }

    public int getEid() {
        return eid;
    }

    public void setEid(int eid) {
        this.eid = eid;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Date getEmpdate() {
        return empdate;
    }

    public void setEmpdate(Date empdate) {
        this.empdate = empdate;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "eid=" + eid +
                ", ename='" + ename + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", salary=" + salary +
                ", empdate=" + empdate +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值