1. 程式人生 > >Java操作資料庫方式二DBCP使用詳解

Java操作資料庫方式二DBCP使用詳解

##概述

DBCP的全稱是:DataBase connection pool,翻譯是:資料庫連線池。

Java操作資料庫方式一JDBC使用詳解中說到直接使用JDBC非常消耗資源。為了避免頻繁關閉連結資料庫,所以出現了DBCP。

DBCP的工作原理是:首先通過連線池預先同資料庫建立一些連線,放在記憶體中,應用程式需要建立資料庫連線時直接到連線池中取出,用完後再放回去,從而避免繁關閉連結資料庫,減少資源的消耗。

DBCP是 apache 的一個開源工具。

##準備工作

在使用JDBC連線資料庫之前,首先要有資料庫,資料庫要建立表。我的資料庫資訊如下:

  1. 資料庫型別:MySql。
  2. 資料庫名字:xia。
  3. 使用者名稱:root。
  4. 密碼:root.
  5. 建立資料庫表student。
create table student(
       id int primary key auto_increment,
       name varchar(20),
       age int
);

##開發環境

  1. 作業系統:MACOS。
  2. 開發工具:IntelliJ IDEA。
  3. Java版本:jdk1.8。
  4. 使用maven管理jar包。

##正式開發

一,在pom.xml檔案中引入需要jar的依賴

        <!--mysql驅動,由於DBCP封裝的JDBC,所以仍然需要mysql驅動包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

        <!--<!– dbcp包 –>-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.4</version>
        </dependency>

二,得到DataSource物件

public class DBCPUtils {

    private static BasicDataSource dataSource;

    static {
        dataSource = new BasicDataSource();
        //基本設定
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/xia");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        //高階設定
        dataSource.setInitialSize(10);//初始化連線
        dataSource.setMinIdle(5);//最小空閒連線
        dataSource.setMaxIdle(20);//最大空閒連線
        dataSource.setMaxActive(50);//最大連線數量
        dataSource.setMaxWait(1000);//超時等待時間以毫秒為單位
    }

    /**
     * 獲取DataSource物件
     * @return
     */
    public static DataSource getDataSource() {
        return dataSource;
    }
}

三,插入操作

public static boolean insertStudent(Student student) {
        try {
            //1,得到dataSource物件,
            DataSource dataSource = DBCPUtils.getDataSource();
            //2,得到QueryRunner物件
            QueryRunner queryRunner = new QueryRunner(dataSource);
            //3,執行插入操作sql
            queryRunner.update("insert into student (name,age) values(?,?)", student.getName(), student.getAge());
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

四,根據id查詢單個物件

public static Student selectStudent(int id) {
        try {
            //1,得到dataSource物件,
            DataSource dataSource = DBCPUtils.getDataSource();
            //2,得到QueryRunner物件
            QueryRunner queryRunner = new QueryRunner(dataSource);
            //3,執行查詢作sql
            Student student = queryRunner.query("select id,name,age from student where id=?", new BeanHandler<>(Student.class), id);
            return student;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

五,根據其他條件得到物件集合

public static List<Student> selectUserList(int age) {
        try {
            //1,得到dataSource物件,
            DataSource dataSource = DBCPUtils.getDataSource();
            //2,得到QueryRunner物件
            QueryRunner queryRunner = new QueryRunner(dataSource);
            //3,執行查詢作sql
            List<Student> studentList = queryRunner.query("select id,name,age from student where age=?", new BeanListHandler<>(Student.class), age);
            return studentList;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

六,更新操作

public static boolean updateStudent(Student student) {
        try {
            //1,得到dataSource物件,
            DataSource dataSource = DBCPUtils.getDataSource();
            //2,得到QueryRunner物件
            QueryRunner queryRunner = new QueryRunner(dataSource);
            //3,執行更新操作sql
            queryRunner.update("update student set age = ? where id = ?", student.getAge(), student.getId());
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

七,刪除操作

public static boolean deleteStudent(int id) {
        try {
            //1,得到dataSource物件,
            DataSource dataSource = DBCPUtils.getDataSource();
            //2,得到QueryRunner物件
            QueryRunner queryRunner = new QueryRunner(dataSource);
            //3,執行刪除操作sql
            queryRunner.update("delete from student where id = ?", id);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

##使用配置檔案配置資料庫引數

在實際開發中我們通常建立一個properties配置檔案,然後把資料庫引數都放在配置檔案中,這樣便於資料庫引數的管理,當資料庫引數變化時可以快速找到配置檔案然後進行修改。

在resource目錄下建立dbcpconfig.properties檔案,檔案目錄位置如下:


檔案內容如下:

#連線設定
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/xia
username=root
password=root

#初始化連線
initialSize=10
#最大連線數量
maxActive=50
#最大空閒連線 
maxIdle=20
#最小空閒連線
minIdle=5
此時得到DataSource物件的程式碼如下:
public class DBCPUtils {
    private static DataSource dataSource;
    static {

        try {
            InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
            Properties props = new Properties();
            props.load(in);
            dataSource = BasicDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    /**
     * 獲取DataSource物件
     * @return
     */
    public static DataSource getDataSource() {
        return dataSource;
    }
}
其他增刪改成操作的程式碼依舊與上面同。

##總結

一,使用DBCP的重點是獲取DataSource物件,然後再建立QueryRunner物件,然後就可以進行增刪改查操作。二,使用DBCP不僅可以節約資源,而且可以直接將查詢結果封裝成物件,方便使用。

三,在實際開發中建議使用properties配置檔案。