天天看點

java資料庫連接配接線程池_Java學習之資料庫連接配接池

Java學習之資料庫連接配接池

0x00 前言

前面用到的jdbc,在每次連接配接資料庫的時候都需要去重建立立對象。我們在這裡會用到建立一個連接配接池,每次使用完後歸還給連接配接池。

0x01 連接配接池概述

連接配接池其實就是一個容器(集合),存放資料庫連接配接的容器。

當系統初始化好後,容器被建立,容器中會申請一些連接配接對象,當使用者來通路資料庫時,從容器中擷取連接配接對象,使用者通路完之後,會将連接配接對象歸還給容器。

使用連接配接池能節約資源使使用者通路高效。

0x02 連接配接池實作

C3P0建立線程池

添加jar檔案到libs目錄下,所需檔案:

c3p0-0.9.5.2.jar c3p0包 mchange-commons-java-0.2.12.jar//c3p0 依賴包

mysql-connector //資料庫連接配接驅動包

将c3p0-config.xml放到src目錄下,并進行配置。

建立連接配接池代碼:

public class test1 {

public static void main(String[] args) throws SQLException {

DataSource dataSource = new ComboPooledDataSource();

Connection connection = dataSource.getConnection();

System.out.println(connection);

}

}

Druid 資料庫連接配接池

導入jar包

druid-1.0.9.jar

導入druid.properties檔案

代碼:

public class test2 {

public static void main(String[] args) throws Exception {

Properties pro = new Properties(); //建立properties對象

InputStream is = test2.class.getClassLoader().getResourceAsStream("druid.properties"); //擷取配置檔案資源

pro.load(is); //加載配置檔案

DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); //建立連接配接池對象,并傳入配置檔案資訊

Connection connection = dataSource.getConnection(); //擷取連接配接對象

System.out.println(connection);

}

}

使用完這些方式後可以發現,連接配接資料庫也比較友善了,都是一些封裝好的代碼。

我們在這裡可以再定義一個工具類,把連接配接的東西都封裝在工具類裡面,簡化我們的代碼。

工具類:

public class JDBCutiss {

private static DataSource ds;

static {

Properties pro = new Properties();

InputStream rs = JDBCutiss.class.getClassLoader().getResourceAsStream("druid.properties");

try {

pro.load(rs);

try {

ds = DruidDataSourceFactory.createDataSource(pro);

} catch (Exception e) {

e.printStackTrace();

}

} catch (IOException e) {

e.printStackTrace();

}

}

//傳回連接配接對象

public static Connection getConnection() throws SQLException {

return ds.getConnection();

}

public static void close(Statement stmt,Connection conn){

if (stmt!=null){

try {

stmt.close();

} catch (SQLException throwables) {

throwables.printStackTrace();

}

}

if (conn!=null){

try {

conn.close();

} catch (SQLException throwables) {

throwables.printStackTrace();

}

}

}

//該方法傳回定義好的DataSource對象

public static DataSource getDataSource(){

return ds;

}

}

main方法:

public class test2 {

public static void main(String[] args) throws Exception {

Connection connection = JDBCutiss.getConnection();//擷取連接配接對象

String sql = "select * from users where id =?"; //設定sql語句

PreparedStatement preparedStatement = connection.prepareStatement(sql);//傳入sql語句并建立預編譯執行對象

preparedStatement.setString(1,"1"); //sql語句設定值

// System.out.println(sql);

ResultSet resultSet = preparedStatement.executeQuery(); //執行sql語句

while (resultSet.next()){

System.out.println(resultSet.getString("id")); //擷取id

System.out.println(resultSet.getString("username"));//擷取使用者賬戶

System.out.println(resultSet.getString("password"));//擷取密碼

}

JDBCutiss.close(preparedStatement,connection);

}

}

Spring JDBC

Spring架構對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發。

建立對象:

JdbcTemplate template = new JdbcTemplate(ds);

常用方法:

* update():執行DML語句。增、删、改語句

* queryForMap():查詢結果将結果集封裝為map集合,将列名作為key,将值作為value 将這條記錄封裝為一個map集合

* 注意:這個方法查詢的結果集長度隻能是1

* queryForList():查詢結果将結果集封裝為list集合

* 注意:将每一條記錄封裝為一個Map集合,再将Map集合裝載到List集合中

* query():查詢結果,将結果封裝為JavaBean對象

* query的參數:RowMapper

* 一般我們使用BeanPropertyRowMapper實作類。可以完成資料到JavaBean的自動封裝

* new BeanPropertyRowMapper(類型.class)

* queryForObject:查詢結果,将結果封裝為對象

* 一般用于聚合函數的查詢

Template連接配接代碼:

public class test3 {

public static void main(String[] args) {

JdbcTemplate template = new JdbcTemplate(JDBCutiss.getDataSource());//從工具類擷取對象傳入

String sql = "update users set password =? where id =?";

int admin = template.update(sql,"500",2); //參數sql語句需要的參數,再進行執行sql語句

System.out.println(admin);

}

}

總體來說也就3行代碼就實作了這麼一個操作資料庫的,比前面幾個方法都簡單很多,其他的所需功能都在工具類裡面封裝好了,可以直接進行調用。

0x03 結尾

在使用了spring Jdbc後發現代碼比前面幾個都輕松很多,定義的工具類開發程式的時候可以直接複制來使用,或者做一點稍微的改進再進行使用。總體來說spring還是很友善。