一.commons-dbutils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,简化了JDBC操作;
DBUtils是java编程中的数据库操作实用工具,不会影响程序的性能。
二.作用
1.对于数据表的读操作,他可以把结果转换成List,Array,Set等java集合,便于程序员操作;
2.对于数据表的写操作,也变得很简单(只需写sql语句);
3.可以使用数据源,使用JNDI,数据库连接池等技术来优化性能--重用已经构建好的数据库连接对象。
三.commons-dbutils API介绍
DBUtils的三个核心对象
(1)org.apache.commons.dbutils.QueryRunner
(2)org.apache.commons.dbutils.ResultSetHandler
(3)org.apache.commons.dbutils.DbUtils // 工具类
1、> QueryRunner类(提供了增删改查的方法)
1)QueryRunner中提供对sql语句操作的API,它主要有三个方法:
(1)query() 用于执行select
(2)update() 用于执行insert update delete
(3)batch() 批处理
2)构造方法:
(1)new QueryRunner();
它的事务可以手动控制。也就是说此对象调用的方法(如:query、update、batrch)参数中要有Connection对象。
(2)new QueryRunner(DataSource ds); // 需要一个 javax.sql.DataSource 来作参数
它的事务是自动控制的。一个sql一个事务。此对象调用的方法(如:query、update、batrch)参数中无需Connection对象。
(3)主要方法
- public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
- public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException:几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。
- public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。
- public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
- public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
2、> ResultSetHandler接口(处理结果)
该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。用于定义select操作后,怎样封装结果集。
ResultSetHandler接口的实现类
- ArrayHandler:适合取1条记录,把该条记录的每列值封装到一个数组中Object[]。
- ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中。
- BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
- ColumnListHandler:将结果集中取某一列的数据。封装到List中。
- KeyedHandler(name):取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。
- ScalarHandler:适合取单行单列数据。
- MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中。
- MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中。
3、> DBUtils类(关闭资源与事务的操作)
它就是一个工具类,定义了关闭资源与事务处理的方法。DbUtils类:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
- public static void close(…) throws java.sql.SQLException:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
- public static void closeQuietly(…):这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
- public static void commitAndCloseQuietly(Connection conn):用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
- public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
四.DBUtils和DBCP连接池
问题:为什么要用连接池?
回答:在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。
DBUtils结合连接池使用
五.DBUtils快速开发
1、导入jar包
commons-dbutils-1.4.jar
mysql-connector-java-5.0.7-bin.jar:是MySQL的JDBC驱动包,用JDBC连接MySQL数据库时必须使用该jar包。
ojdbc14.jar:是JDBC驱动版本。
注意:c3p0与mysql驱动jar也要导入,commons-dbcp-1.4.jar。c3p0需要的所有的jar包(完整):c3p0-0.9.1.jar、c3p0-0.9.1.2.jar、c3p0-0.9.1-pre6.jar。
2、在这里我们创建dbcp连接池,用于共享连接Connection
1)在conf文件夹下,创建配置config.properties文件
# DB Config param begin
testOnBorrow=true
validationQuery=select 1
timeBetweenEvictionRunsMillis=100
numTestsPerEvictionRun=10
minEvictableIdleTimeMillis=10000
removeAbandonedTimeout=10
logAbandoned=true
removeAbandoned=true
initialSize=10 // 初始化连接数目
maxIdle=10 // 连接池中最多可空闲maxIdle个连接
minIdle=5 // 连接池中最少空闲maxIdle个连接
maxActive=20
maxWait=1000 // 连接池中连接用完时,新的请求等待时间,毫秒
terminalStateSyncToDbCycle=100
terminalCacheUpdateCycle=100
jdbc.user=2D8F003D2CED9254FC2BB899232DCFEF // 数据库用户名
jdbc.password=A971DB00404A0C19938A90846EE5E09C // 数据库密码
2)程序读取系统配置文件,获取内容
package com.common.db;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;
import com.neusoft.avnc.gateway.common.config.SysConfig;
public class DbHelper {
private static DataSource dataSource;
public static DbHelper getInstance(){
return Holder.DB_HELPER;
}
DbHelper() {
int initialSize = Integer.parseInt(SysConfig.getInstance().getString("initialSize"));
int maxActive = Integer.parseInt(SysConfig.getInstance().getString("maxActive"));
int maxIdle = Integer.parseInt(SysConfig.getInstance().getString("maxIdle"));
int minIdle = Integer.parseInt(SysConfig.getInstance().getString("minIdle"));
int maxWait = Integer.parseInt(SysConfig.getInstance().getString("maxWait"));
boolean removeAbandoned = Boolean.parseBoolean(SysConfig.getInstance().getString("removeAbandoned"));
boolean logAbandoned = Boolean.parseBoolean(SysConfig.getInstance().getString("logAbandoned"));
int removeAbandonedTimeout = Integer.parseInt(SysConfig.getInstance().getString("removeAbandonedTimeout"));
String validationQuery = SysConfig.getInstance().getString("validationQuery");
int minEvictableIdleTimeMillis = Integer.parseInt(SysConfig.getInstance().getString("minEvictableIdleTimeMillis"));
int numTestsPerEvictionRun = Integer.parseInt(SysConfig.getInstance().getString("numTestsPerEvictionRun"));
int timeBetweenEvictionRunsMillis = Integer.parseInt(SysConfig.getInstance().getString("timeBetweenEvictionRunsMillis"));
boolean testOnBorrow = Boolean.parseBoolean(SysConfig.getInstance().getString("testOnBorrow"));
// 配置dbcp数据源
BasicDataSource dbcpDataSource = new BasicDataSource();
dbcpDataSource.setUrl(SysConfig.getInstance().getString("dburl"));
dbcpDataSource.setDriverClassName("com.mysql.jdbc.Driver");
dbcpDataSource.setUsername(SysConfig.getInstance().getString("jdbc.user"));
dbcpDataSource.setPassword(SysConfig.getInstance().getString("jdbc.password"));
dbcpDataSource.setDefaultAutoCommit(true);
// initialSize: 初始化连接
dbcpDataSource.setInitialSize(initialSize);
// maxIdle: 最大空闲连接
dbcpDataSource.setMaxActive(maxActive);
// minIdle: 最大,最小小空闲连接
dbcpDataSource.setMaxIdle(maxIdle);
dbcpDataSource.setMinIdle(minIdle);
// 连接被泄露时是否打印
dbcpDataSource.setLogAbandoned(logAbandoned);
// maxWait: 超时等待时间以毫秒为单位 1000等于60秒
dbcpDataSource.setMaxWait(maxWait);
// removeAbandoned: 是否自动回收超时连接-->
dbcpDataSource.setRemoveAbandoned(removeAbandoned);
// removeAbandonedTimeout: 超时时间(以秒数为单位)
dbcpDataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
// 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位
dbcpDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
dbcpDataSource.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
// 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程
dbcpDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
dbcpDataSource.setTestOnBorrow(testOnBorrow);
// 验证连接sql
dbcpDataSource.setValidationQuery(validationQuery);
dataSource = (DataSource) dbcpDataSource;
}
public QueryRunner getQueryRunner(){
return new QueryRunner(dataSource);
}
public static void mokeTas(String msg){
QueryRunner runner =DbHelper.getInstance().getQueryRunner();
String str="insert into Message(Msg,Mdate,type) values(?,?,?)";
try {
runner.update(str,msg,sd.format(Calendar.getInstance().getTime()),"client");
// conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
static SimpleDateFormat sd =new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss:SSS") ;
}
class Holder{
final static DbHelper DB_HELPER = new DbHelper();
}
3)创建QueryRunner对象
4)使用query方法执行select语句
5)使用ResultSetHandler封装结果集,并获取结果集内容
/**
* 查询数据库中发送报警配置信息
*
* @author snake
* @return
*/
public static List queryWarnMessage() {
QueryRunner qr = DbHelper.getInstance().getQueryRunner(); // 获取连接池数据源
String sql_select = "select alarm_level,mail_open, sms_open, mail_to_address, mail_from_address, mail_serverhost, mail_serverport, mail_username, mail_password, mail_subject, sms_to_sim from te_warn_config ORDER BY id DESC";
List
注意:获取数据库结果集内容时,get到的key必须跟数据库字段名一致,否则取不到value。