在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用
首先看C3p0这个连接池,最大优势可以自动读取默认的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/swift_db
</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">20</property>
<property name="acquireIncrement">5</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
</default-config>
</c3p0-config>
配置文件中有常规的4个主选项和一些其他配置
只需要使用C3p0中的实现javax.sql.DateSource接口的实现类ComboPooledDataSource 创建对象即可
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
这个是放成员变量那,只要new 空参就会自动调用xml配置文件,配置文件需要标签<default-config>
也可以调用命名的配置文件,需要配置文件<named-config>
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/swift_db
</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">20</property>
<property name="acquireIncrement">5</property>
<property name="maxPoolSize">50</property>
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>
一般把C3p0做成工具类使用,方便调用
package com.swift.base; import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3p0Utils { // 数据源连接池c3p0作用不用每次建立连接,浪费资源与等待时间,把连接做好放在连接池中,需要时获取
// c3p0连接池可以通过配置文件c3p0-config.xml文件自动读取相关属性
// c3p0连接池是java中 javax.sql.DataSource的实现类,其中必须实现getConnection方法
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("swift"); // 获得数据源(连接池)的方法
public static DataSource getDataSource() {
return dataSource;
} // 从连接池中获得一个conn资源的
public static Connection getConnection() throws Exception {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/swift_db");
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setAcquireIncrement(5);
dataSource.setInitialPoolSize(20);
dataSource.setMinPoolSize(5);
dataSource.setMaxPoolSize(50); Connection conn = dataSource.getConnection();
return conn;
} public static void close(Connection conn, Statement stmt, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} }
这个已经调用了xml配置文件,每次又调用Connection都会来一遍属性配置,浪费资源,可以用静态代码块,只调用一次即可
package com.swift.jinji; import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /*使用C3P0获得10个连接对象
要求:不使用配置文件*/ public class C3p0_10con { private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); static {
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/swift_db");
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setInitialPoolSize(20);
dataSource.setAcquireIncrement(5);
dataSource.setMaxPoolSize(50);
dataSource.setMinPoolSize(5);
} public static void main(String[] args) throws PropertyVetoException { for(int i=0;i<10;i++) {
System.out.println(C3p0_10con.getConnection());
}
} public static DataSource getDataSource() {
return dataSource; } public static Connection getConnection() { Connection con = null;
try {
con = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con; } public static void close(Connection con) {
if(con!=null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} }
配合DBUtils的QureyRunner类和ResultSetHandler类使用,更加方便数据库增删改与查询
package com.swift.jinji; import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler; import com.swift.base.C3p0Utils;
import com.swift.domain.Puppy; /*查询用户表中的第一条数据。并将数据封装成对象数组。*/ public class Qurey_Puppy { public static void main(String[] args) { QueryRunner qr=new QueryRunner(C3p0Utils.getDataSource());
String sql="select * from puppy;";
ResultSetHandler<Puppy> rsh=new BeanHandler<Puppy>(Puppy.class);
ResultSetHandler<Object[]> rsh1=new ArrayHandler();
ResultSetHandler<List<Object[]>> rsh2=new ArrayListHandler();
ResultSetHandler<Object> rsh3=new ScalarHandler("name");
ResultSetHandler<Map<String, Object>> rsh4=new MapHandler();
ResultSetHandler<List<Map<String, Object>>> rsh5=new MapListHandler();
ResultSetHandler<List<Object>> rsh6=new ColumnListHandler("name");
ResultSetHandler<Map<Object,Map<String,Object>>> rsh7=new KeyedHandler("id"); try {
Map<Object, Map<String, Object>> result = qr.query(sql, rsh7);
/* for(Object[] puppy:dog) { System.out.println(Arrays.toString(puppy));
}*/
// System.out.println(result); } catch (SQLException e) {
e.printStackTrace();
}
} }
ResultSetHandler有很多子类,可以放到各种容器中,从数据库取出数据后,将数据放到对象数组,数组集合,对象元素,Map集合,Map集合列表,对象列表,Map的Map中
在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用的更多相关文章
- java基础之JDBC七:C3P0连接池的使用
使用C3P0的前提是需要引入jar包 具体使用如下: /** * c3p0的应用 * 前提:引入c3p0的jar包 */ public class Test { public static void ...
- 网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别
1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2 ...
- jdbc数据连接池dbcp要导入的jar包
jdbc数据连接池dbcp要导入的jar包 只用导入commons-dbcp-x.y.z.jarcommons-pool-a.b.jar
- Spring -- spring 中使用jdbc, c3p0连接池, dao概念
1. 示例代码 CustomerDao.java ,dao接口 public interface CustomerDao { public void insertCustomer(Customer ...
- 【JDBC】C3P0连接池的使用
C3P0连接池的c3p0-config.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p ...
- day39-Spring 15-Spring的JDBC模板:C3P0连接池配置
<!-- 配置C3P0连接池 --> <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPo ...
- JDBC二部曲之_事物、连接池
事务 事务概述 事务的四大特性(ACID) 事务的四大特性是: l 原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败. l 一致 ...
- JDBC秒变C3P0连接池——再加连接解耦
从JDBC连接到C3P0数据库连接池 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");) ② ...
- java JDBC (八) 连接池 DBCP
package cn.sasa.demo1; import javax.sql.DataSource; import org.apache.commons.dbcp2.BasicDataSource; ...
随机推荐
- 用LaTeX画树形结构
用LaTeX画树形结构,比如:文件目录树形图,程序中函数调用关系图等. 找到的一个不错的资源: http://www.texample.net/tikz/examples/feature/trees/ ...
- Unity Input.GetMouseButtonDown 拿到鼠标按键
//点击按键,生成子弹,并射向前方 void ShootBullet() { if (Input.GetMouseButtonDown(0)) { GameObject temp_Buller = G ...
- RedHat7配置静态IP
1.验证网络管理器状态,Active: active (running)表示正在运行,一般RHEL7都默认安装了. [root@localhost ~]# systemctl status Netwo ...
- Docker学习笔记(2)-docker镜像操作
本节将会涉及Docker的镜像操作. 1. 获取镜像 如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Regi ...
- IA-32e模式下的异常处理
系统异常处理 CPU如果调用系统异常处理程序 需要的数据结构 IDT_Table: 中断向量表, 在中断向量表中的每一项都是一个中断描述符(中断门或者陷阱门), 一个中断描述符中的几位是段选择符 GD ...
- css内容整理2
10.6.css伪类.伪元素 伪类用于向某些选择器添加特殊效果:伪元素用于将特殊的效果添加达到某选择器. 区别:伪类的效果可通过添加一个实际的类达到,用::伪元素效果则需要添加一个实际的元素,用:: ...
- DataGridView进度条列 C# WinForm
先看看效果,如果感兴趣,继续往下看…… 效果如下图所示: DataGridView里没有Pragress列,但有Image列,有了它我们可以自己绘图来实现进度条.其实实现起来并不困难. 首先在实体类增 ...
- ansible软件相关模块丶计划任务,剧本
软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...
- 使用跨平台图表控件TeeChart如何从DAT或TEXT文件中导入数据
大多数开发人员在使用TeeChart进行开发的时候,都需要访问包含在文本文档中的一些数据,本次教程将详细讲解如何去实现这一步骤. 文本文件通常包含使用空格键或者是TAB键分隔开的数字和文字: TeeC ...
- ArcMap如何修改地图坐标系统
有时候,地图投影坐标需要作出修改,使得符合要求,不然空间参考不一样无法进行进一步的操作,分析等!下面介绍arcgis地图投影坐标的修改! 1.首先,将地图数据导入,这里我导入的是广西的边界图bound ...