Commons DBUtils是Apache组织提供的一个对JDBC(java数据库连接,java的数据库操作的基础API)。进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
DBUtils的三个核心对象 (1)org.apache.commons.dbutils.QueryRunner (2)org.apache.commons.dbutils.ResultSetHandler (3)org.apache.commons.dbutils.DbUtils // 工具类
2.1、QueryRunner类(提供了增删改查的方法)
2.1.1 QueryRunner中提供对sql语句操作的API,它主要有三个方法:
(1)query() 用于执行select
(2)update() 用于执行insert update delete
(3)batch() 批处理
2.1.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.2 ResultSetHandler接口(处理结果)
该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。用于定义select操作后,怎样封装结果集。
ResultSetHandler接口的实现类:
(1)ArrayHandler:适合取1条记录,把该条记录的每列值封装到一个数组中Object[]。 (2)ArrayListHandler:适合取多条记录。把每条记录的每列值封装到一个数组中Object[],把数组封装到一个List中。 (3)BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。 (4)BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。 (5)ColumnListHandler:将结果集中取某一列的数据。封装到List中。 (6)KeyedHandler(name):取多条记录,每一条记录封装到一个Map中,再把这个Map封装到另外一个Map中,key为指定的字段值。 (7)ScalarHandler:适合取单行单列数据。 (8)MapHandler:适合取1条记录。把当前记录的列名和列值放到一个Map中。 (9)MapListHandler:适合取多条记录。把每条记录封装到一个Map中,再把Map封装到List中。
2.3 DBUtils类(关闭资源与事务的操作)
它就是一个工具类,定义了关闭资源与事务处理的方法。DbUtils类:提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下: (1) public static void close(…) throws java.sql.SQLException:DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
(2)public static void closeQuietly(…):CloseQuietly这一方法不仅能在连接、声明或者结果集(ResultSet)为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。如果你不想捕捉这些异常的话,这对你是非常有用的。在重载CloseQuietly方法时,特别有用的一个方法closeQuietly(Connection conn,Statement stmt,ResultSet rs),这是因为在大多数情况下,连接、声明和结果集(ResultSet)是你要用的三样东西,而且在最后的块你必须关闭它们。使用这一方法,你最后的块就可以只需要调用这一方法即可。
(3) public static void commitAndCloseQuietly(Connection conn): 这一方法用来提交连接,然后关闭连接,并且在关闭连接时不向上抛出在关闭时发生的一些SQL异常。
(4)public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。使用loadDrive方法,编码就变得更容易理解,你也就得到了一个很好的Boolean返回值,这个返回值会告诉你驱动类是不是已经加载成功了。
3.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。
3.2 在这里我们创建dbcp连接池,用于共享连接Connection
3.2.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 // 数据库密码3.2.2 程序读取系统配置文件,获取内容
public Server() throws SQLException{ /** *读取系统设置 */ try{ String path=System.getProperty("user.dir")+"/conf/config.config.properties"; SysConfig.getInstance().load(path); }catch(Exception e){ e.printStackTrace(); } 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 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.2.3 创建QueryRunner对象
3.2.4 使用query方法执行select语句
3.2.5 使用ResultSetHandler封装结果集,并获取结果集内容
/** * 查询数据库中发送报警配置信息 * * @author snake * @return */ public static List<String> 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<Map<String, Object>> maplist = new ArrayList<Map<String,Object>>(); try { maplist = qr.query(sql_select, new MapListHandler()); // 封装结果集 } catch (SQLException e) { LOG.error("queryWarnMessage邮件配置异常:", e); } List<String> jsonList = new ArrayList<String>(); for (Map<String, Object> map : maplist) { Map<String, String> resultMap = new HashMap<String, String>(); String mail = ""; String sms = ""; if (map.get("mail_open").toString().equals("1")) { mail = "true"; } else { mail = "false"; } if (map.get("sms_open").toString().equals("1")) { sms = "true"; } else { sms = "false"; } resultMap.put("mail_open", mail); resultMap.put("sms_open", sms); resultMap.put("mail_to_address", (String) map.get("mail_to_address")); // 获取结果集内容 resultMap.put("mail_from_address", (String) map.get("mail_from_address")); resultMap.put("mail_serverhost", (String) map.get("mail_serverhost")); resultMap.put("mail_serverport", (String) map.get("mail_serverport")); resultMap.put("mail_username", (String) map.get("mail_username")); resultMap.put("mail_password", (String) map.get("mail_password")); resultMap.put("mail_subject", (String) map.get("mail_subject")); resultMap.put("sms_to_sim", (String) map.get("sms_to_sim")); resultMap.put("alarm_level", (String) map.get("alarm_level")); String json = JSONObject.fromObject(resultMap).toString(); jsonList.add(json); } return jsonList; }