在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; ...
随机推荐
- Mac使用zsh导致maven命令无效的解决方案
第一步: vim ~/.zshrc 第二步:在.zshrc末尾加上 source ~/.bash_profile: 保存推出了 第三步 source ~/.bash_profile
- oracle 11g 将非分区表转换为分区表在线重定义
--操作的用户需要有以下的权限 GRANT CONNECT, RESOURCE TO CMIGDW; GRANT EXECUTE ON DBMS_REDEFINITION TO CMIGDW; GRA ...
- thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。
最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...
- POJ 1182——食物链——————【种类并查集】
食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status P ...
- Linux 下 zip 文件解压乱码解决方案,ubuntu16.10亲测可用
文章来源: https://www.zhihu.com/question/20523036 今天邮件中收到了一个压缩文件,解压后却是乱码,从网上也找了几个方法,目前这个方法还是比较可靠的,如下所示: ...
- JDK一键安装,配置环境
人懒,就得“多干活”! 正常安装JDK 的话,它会修改系统的path 变量,加入自己的调用路径(jre) 这样,我们刚安装好后,就可直接调用java –verbose 查看jre 安装的目录了. ( ...
- Java入门之Tomcat安装及环境变量配置
一.Tomcat下载 地址:http://tomcat.apache.org/download-80.cgi#8.0.39 本人用的是Tomcat/8.0.37免安装版,解压到一个目录,本人用的是:D ...
- StringMVC入门案例
1.首先要引入jar包 <!--引入beans节点--> <dependency> <groupId>org.springframework</groupId ...
- java 使用Queue在队列中异步执行任务
先创建一个总的Handler(队列统一处理接口),名字就叫做 QueueTaskHandler public interface QueueTaskHandler { void processData ...
- Spring课程 Spring入门篇 3-5 Spring bean装配(上)之Resource
课程链接: 1 resource简析 2 resource代码演练 1 resource简析 urlsource:url对应的资源 classpath:获取类路径下的资源文件 filesystemre ...