C3P0连接池、DRUID连接池和JdbcTemplate
?
目錄
一、C3P0連接池
1.C3P0連接池簡介
2.常用的配置參數(shù)
3.C3P0連接池基本使用
(1)C3P0配置文件
(2)API介紹
4.使用步驟
二、DRUID連接池
1. DRUID簡介
2.DRUID連接池基本使用
(1)API介紹
(2)使用步驟
(3)配置文件
(4)DataSourceUtils工具類
三、JdbcTemplate
1. JdbcTemplate概念
2. JdbcTemplate使用過程
3.JdbcTemplate實現(xiàn)增刪改
(1)創(chuàng)建表
(2)插入數(shù)據(jù)
(3)更改數(shù)據(jù)
(4)刪除數(shù)據(jù)
4.JdbcTemplate實現(xiàn)查詢
(1)queryForObject查詢數(shù)據(jù)返回整數(shù)
(2)queryForObject查詢數(shù)據(jù)返回String
(3)queryForMap查詢數(shù)據(jù)返回Map集合
(4)queryForList查詢數(shù)據(jù)返回List集合
(5)query使用RowMapper做映射返回對象
(6)query使用BeanPropertyRowMapper做映射返回對象
一、C3P0連接池
1.C3P0連接池簡介
C3P0地址:https://sourceforge.net/projects/c3p0/?source=navbar?C3P0是一個開源的連接池。Hibernate框架,默認推薦使用C3P0作為連接池實現(xiàn)。 C3P0的jar包: c3p0-0.9.1.2.jar
2.常用的配置參數(shù)
3.C3P0連接池基本使用
(1)C3P0配置文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config><!-- 默認配置,當使用ComboPooledDataSource無參構造器時,使用的就是這個配置 --><default-config><!-- 基本配置 --><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="user">root</property><property name="password">123</property><!-- 每次增量,當需要創(chuàng)建Connection對象時,一次創(chuàng)建幾個 --><property name="acquireIncrement">3</property><!-- 當創(chuàng)建池對象后,池中應該有幾個Connection對象 --><property name="initialPoolSize">10</property><!-- 池中最少Connection個數(shù),如果少于這個值,就會創(chuàng)建Connection --><property name="minPoolSize">2</property><!-- 池中最大連接個數(shù) --><property name="maxPoolSize">10</property></default-config><!-- 命名配置,new ComboPooledDataSource("oralce-config")時,使用的就是這個配置 --><named-config name="oracle-config"><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property><property name="driverClass">com.mysql.jdbc.Driver</property><property name="user">root</property><property name="password">123</property><property name="acquireIncrement">3</property><property name="initialPoolSize">10</property><property name="minPoolSize">2</property><property name="maxPoolSize">10</property></named-config> </c3p0-config>(2)API介紹
com.mchange.v2.c3p0.ComboPooledDataSource 類表示C3P0的連接池對象,常用2種創(chuàng)建連接池的方式: 1.無參構造,使用默認配置, 2.有參構造,使用命名配置
public ComboPooledDataSource():無參構造使用默認配置
public ComboPooledDataSource():有參構造使用命名配置
public Connection getConnection() throws SQLException:從連接池中取出一個連接
4.使用步驟
1. 導入jar包c3p0-0.9.1.2.jar
2. 編寫c3p0-config.xml?配置文件,配置對應參數(shù)
3. 將配置文件放在src目錄下
4. 創(chuàng)建連接池對象ComboPooledDataSource ,使用默認配置或命名配置
5. 從連接池中獲取連接對象
6. 使用連接對象操作數(shù)據(jù)庫
7. 關閉資源
二、DRUID連接池
1. DRUID簡介
Druid是阿里巴巴開發(fā)的號稱為監(jiān)控而生的數(shù)據(jù)庫連接池,Druid是目前最好的數(shù)據(jù)庫連接池。在功能、性能、擴展性方面,都超過其他數(shù)據(jù)庫連接池,同時加入了日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況。Druid已經在阿里巴巴部署了超過600個應用,經過一年多生產環(huán)境大規(guī)模部署的嚴苛考驗。Druid地址:
https://github.com/alibaba/druid DRUID?
連接池使用的jar包: druid-1.0.9.jar
2.DRUID連接池基本使用
(1)API介紹
com.alibaba.druid.pool.DruidDataSourceFactory?類有創(chuàng)建連接池的方法
public static DataSource createDataSource(Properties properties):創(chuàng)建一個連接池,連接池的參數(shù)使用properties中的數(shù)據(jù)
(2)使用步驟
1. 在src目錄下創(chuàng)建一個properties文件,并設置對應參數(shù)
2. 加載properties文件的內容到Properties對象中
3. 創(chuàng)建DRUID連接池,使用配置文件中的參數(shù)
4. 從DRUID連接池中取出連接
5. 執(zhí)行SQL語句
6. 關閉資源
(3)配置文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/day25 username=root password=root initialSize=5 maxActive=10 maxWait=3000 minIdle=3(4)DataSourceUtils工具類
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;public class DataSourceUtils {// 1. 聲明靜態(tài)數(shù)據(jù)源成員變量private static DataSource ds;// 2. 創(chuàng)建連接池對象static {// 加載配置文件中的數(shù)據(jù)InputStream is =DataSourceUtils.class.getClassLoader().getResourceAsStream("druid.properties");Properties pp = new Properties();try {pp.load(is);// 創(chuàng)建連接池,使用配置文件中的參數(shù)ds = DruidDataSourceFactory.createDataSource(pp);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}// 3. 定義公有的得到數(shù)據(jù)源的方法public static DataSource getDataSource() {return ds;}// 4. 定義得到連接對象的方法public static Connection getConnection() throws SQLException {return ds.getConnection();}// 5.定義關閉資源的方法public static void close(Connection conn, Statement stmt, ResultSet rs) {if (rs != null) {try {rs.close();} catch (SQLException e) {}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {}}if (conn != null) {try {conn.close();} catch (SQLException e) {}}}// 6.重載關閉方法public static void close(Connection conn, Statement stmt) {close(conn, stmt, null);} }三、JdbcTemplate
1. JdbcTemplate概念
JDBC已經能夠滿足大部分用戶最基本的需求,但是在使用JDBC時,必須自己來管理數(shù)據(jù)庫資源如:獲取PreparedStatement,設置SQL語句參數(shù),關閉連接等步驟。JdbcTemplate就是Spring對JDBC的封裝,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。 JdbcTemplate處理了資源的建立和釋放。他幫助我們避免一些常見的錯誤,比如忘了總要關閉連接。他運行核心的JDBC工作流,如Statement的建立和執(zhí)行,而我們只需要提供SQL語句和提取結果。
Spring源碼地址:https://github.com/spring-projects/spring-framework?
在JdbcTemplate中執(zhí)行SQL語句的方法大致分為3類:
1.?execute?:可以執(zhí)行所有SQL語句,一般用于執(zhí)行DDL語句。
2. update?:用于執(zhí)行INSERT 、UPDATE 、DELETE 等DML語句。
3.?queryXxx?:用于DQL數(shù)據(jù)查詢語句。
2. JdbcTemplate使用過程
(1)準備DruidDataSource連接池或C3P0連接池
(2)導入依賴的jar包
(3)創(chuàng)建JdbcTemplate對象,傳入連接池對象
(4)調用execute、update、queryXxx等方法
3.JdbcTemplate實現(xiàn)增刪改
(1)創(chuàng)建表
public static void main(String[] args) {String sql = "CREATE TABLE product("+ "pid INT PRIMARY KEY AUTO_INCREMENT,"+ "pname VARCHAR(20),"+ "price DOUBLE"+ ");";JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());jdbcTemplate.execute(sql);}(2)插入數(shù)據(jù)
public static void main(String[] args) {String sql = "INSERT INTO product VALUES (NULL, ?, ?);";JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());jdbcTemplate.update(sql, "iPhone3GS", 3333);jdbcTemplate.update(sql, "iPhone4", 5000);jdbcTemplate.update(sql, "iPhone4S", 5001);jdbcTemplate.update(sql, "iPhone5", 5555);jdbcTemplate.update(sql, "iPhone5C", 3888);jdbcTemplate.update(sql, "iPhone5S", 5666);jdbcTemplate.update(sql, "iPhone6", 6666);jdbcTemplate.update(sql, "iPhone6S", 7000);jdbcTemplate.update(sql, "iPhone6SP", 7777);jdbcTemplate.update(sql, "iPhoneX", 8888);}(3)更改數(shù)據(jù)
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "UPDATE product SET pname=?, price=? WHERE pid=?;";// String sql = "update pruduct set pname=?,price=? where pid=?;";int i = jdbcTemplate.update(sql, "小米5s", 1999, 10);System.out.println(i);}(4)刪除數(shù)據(jù)
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "DELETE FROM product WHERE pid=?;";int i = jdbcTemplate.update(sql, 7);System.out.println(i);}4.JdbcTemplate實現(xiàn)查詢
(1)queryForObject查詢數(shù)據(jù)返回整數(shù)
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "SELECT price FROM product where pid=3;";Integer integer = jdbcTemplate.queryForObject(sql, int.class);System.out.println(integer);}(2)queryForObject查詢數(shù)據(jù)返回String
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "SELECT pname FROM product where pid=1;";String s = jdbcTemplate.queryForObject(sql, String.class);System.out.println(s);}(3)queryForMap查詢數(shù)據(jù)返回Map集合
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "SELECT * FROM product where pid=?";Map<String, Object> forMap = jdbcTemplate.queryForMap(sql,6);Set<Map.Entry<String, Object>> entries = forMap.entrySet();for (Map.Entry<String, Object> entry : entries) {System.out.println(entry.getKey() + "---" + entry.getValue());}}(4)queryForList查詢數(shù)據(jù)返回List集合
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "SELECT * FROM product";List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);for (Map<String, Object> objectMap : mapList) {Set<Map.Entry<String, Object>> entries = objectMap.entrySet();for (Map.Entry<String, Object> entry : entries) {System.out.print(entry.getKey() + "---" + entry.getValue());}System.out.println();}}(5)query使用RowMapper做映射返回對象
public class Product {private int pid;private String pname;private double price;@Overridepublic String toString() {return "Pruduct{" +"pid=" + pid +", pname='" + pname + '\'' +", price=" + price +'}';}public Product() {}public Product(int pid, String pname, double price) {this.pid = pid;this.pname = pname;this.price = price;}public int getPid() {return pid;}public void setPid(int pid) {this.pid = pid;}public String getPname() {return pname;}public void setPname(String pname) {this.pname = pname;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;} } public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "select * from product";List<Product> products = jdbcTemplate.query(sql, (resultSet, i) -> {Product p = new Product();p.setPid(resultSet.getInt("pid"));p.setPname(resultSet.getString("pname"));p.setPrice(resultSet.getDouble("price"));return p;});for (Product product : products) {System.out.println(product);}}(6)query使用BeanPropertyRowMapper做映射返回對象
public static void main(String[] args) {JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());String sql = "select * from product";List<Product> products = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Product.class));for (Product product : products) {System.out.println(product);}}?
總結
以上是生活随笔為你收集整理的C3P0连接池、DRUID连接池和JdbcTemplate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL多表查询和事务安全
- 下一篇: JDK1.8新特性:Stream流