`
wnick
  • 浏览: 62120 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

commons dbutils 常用方法

阅读更多
要运行要使用了dbcp连接池


package com.crm.db.base;

import java.sql.SQLException;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import com.crm.domain.User;
import com.crm.util.Constants;
// wnick123@gmail.com
public class DBBase {
	
	
	private static DBBase dbBase;
	
	private static QueryRunner run ;
	
	private DataSource dataSource;
	public DataSource getDataSource() {	return dataSource;}
	public void setDataSource(DataSource dataSource) {	this.dataSource = dataSource;}
	
	
	private DBBase(){}
	
	
	private void init(){
		dbBase = this;
		run=new QueryRunner(dataSource);
	}
	
	public static DBBase getInstance(){
		return dbBase;
	}
	
	
	/**
	 * eg:
	 * select count(1) from user
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public int count(String sql, Object[] params){
		
		Object o = getAnAttr(sql,params);
		if(o instanceof Integer){
			return (Integer) o;
		}
		if(o instanceof Long){
			Long l = (Long)o;
			return l.intValue();
		}
		
		String s = (String)o;
		try{
			return Integer.parseInt(s);
		}catch (NumberFormatException e) {
			return 0;
		}
	}
	 
	 /**
	  * 获得第一个查询第一行第一列
	  * @param sql
	  * @param params
	  * @return
	  */
	public Object getAnAttr(String sql, Object[] params){

		showSql(sql);

		Object s=null;
		try {
			s = run.query(sql, new ScalarHandler(1),params);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return s;
	}
	/**
	 * 查询返回单个对象
	 * @param sql
	 * @param clazz
	 * @return
	 */	
	public <T> T queryForObject(String sql,Object param[],Class<T> clazz){		
		T obj = null;
		try {			
			showSql(sql);			
			obj = (T)run.query(sql,new BeanHandler(clazz), param);			
		} catch (SQLException e) {			
			e.printStackTrace();
		} 
		return obj;
	}
	
	/**
	 * 查询返回list对象
	 * @param sql
	 * @param clazz
	 * @return
	 */
	public <T> List<T> queryForOList(String sql,Object[] param,Class<T> clazz){
		List<T> obj = null;
		try {
			showSql(sql);
			obj = (List<T>)run.query(sql,new BeanListHandler(clazz),param);			
		} catch (SQLException e) {			
			e.printStackTrace();
		} 
		return obj;
	}
	
	
	/**
	 * 保存返回主键
	 * @param sql
	 * @param param
	 * @return
	 */
	public int storeInfoAndGetGeneratedKey(String sql,Object[] param){
		int pk=0;
		try	{
			showSql(sql);
			run.update(sql,param);
			pk = ((Long)run.query("SELECT LAST_INSERT_ID()", new ScalarHandler(1))).intValue();	
		}catch(SQLException e) {
			e.printStackTrace();
		}
		return pk;
	}
	/**
	 * 更新
	 * @param sql
	 * @return
	 */
	
	public int update(String sql,Object[] param){
		int i=0;
		try	{
			showSql(sql);
			i = run.update(sql,param);
		}catch(SQLException e) {
			e.printStackTrace();
		}
		return i;

	}
	
	private void showSql(String sql){
		if(Constants.SHOW_SQL){
			System.out.println(sql);
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String uri = "jdbc:mysql://localhost:3306/miccrm";   
		DataSource ds = setupDataSource(uri);
		DBBase db = new DBBase();
		db.setDataSource(ds);
		db.init();
		
		String sql = "select count(1) from user";	
		int i = db.count(sql,null);
		
		sql="select name from user";
		List<User> us = DBBase.getInstance().queryForOList(sql, null, User.class);		
		for(User u:us){
			System.out.println(u.getName());
		}
		
		sql = "insert into user(name) values(?)";
		int pk = DBBase.getInstance().storeInfoAndGetGeneratedKey(sql, new Object[]{"a"});
		System.out.println(pk);
		
		sql ="select name from user where id =?";
		String a =(String) DBBase.getInstance().getAnAttr(sql, new Object[]{1});
		
		System.out.println(a);
	
	}


    private static DataSource setupDataSource(String connectURI) {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUsername("root");
        ds.setPassword("123456");
        ds.setUrl(connectURI);
        return ds;
    }

}


分享到:
评论
15 楼 guji528 2012-06-19  
简单试了一下,觉得很方便:
UserRef extends RefObject
  List<RefObject> buildOracleQuery(Connection conn) {
        QueryRunner qr = new QueryRunner();
//        RefObject user = null;
        ResultSetHandler<?> arrayResult = new ArrayListHandler();
        ResultSetHandler<RefObject> rs = null;
        ResultSetHandler<List<RefObject>> rList = null;
        rs = new BeanHandler<RefObject>(RefObject.class);
        rList = new BeanListHandler(UserRef.class);
       
        ResultSetHandler<List<Map<String, Object>>> map = new MapListHandler();
        String sql =  "select id, name, alias" +
        " from (select id, name,  alias, op_seq, op_status from user" +
        " where op_status = 0" +
        " order by op_seq) where rownum <= ?";
       
//        Connection conn = null;
       
        QueryLoader q = QueryLoader.instance();
        Object params = 10;
        List<RefObject> list = null;
        List<Map<String, Object>> iMap = null;
        List<Object[]> arrResult = null;
        try
        {
            //查询返回数组列表
            arrResult = (List<Object[]>)qr.query(conn,sql, arrayResult, params);
           
            //查询返回JavaBean列表
            list = qr.query(conn,sql, rList, params);
           
            //查询返回Map列表
            iMap = qr.query(conn,sql, map, params);
//            qr.fillStatementWithBean(arg0, arg1, arg2);
//            DbUtils.
           
           
            conn.setAutoCommit(false);

/**            此段代码是通过查询得到的数组直接批量插入到数据,简洁高效
           
            Object[][] inParam = new Object[arrResult.size()][];
            for (int i = 0; i < inParam.length; i++)
            {
                inParam[i] = arrResult.get(i);
               
            }
            qr.batch(conn,TransConst.USER_INSERT_SQL, inParam);
           
  */         
            PreparedStatement stmt = conn.prepareStatement(TransConst.USER_INSERT_SQL);
   
            String[] props = new String[] {"id", "name", "alias"};
           
           
            for (RefObject user : list)
            {
                //通过JavaBean方式填充Statement参数
                qr.fillStatementWithBean(stmt, user, props);
                stmt.addBatch();
            }
            stmt.executeBatch();
14 楼 summerfeel 2010-06-29  
这只是数据源的配置,没有把事务处理放进去,具体事务策略当然是留到service再处理,我只是想知道你使用DBUtils以后,数据源是怎么配的。
13 楼 chenkan2000 2010-06-29  
我不这么配置的。事务是在service层实现的,不是在DAO中实现。对service中的方法进行事务性声明,DataSource和DAO是普通的Spring Bean。
12 楼 summerfeel 2010-06-27  
chenkan2000 写道
你说的很对。但我认为hack DBUtils没有必要,DBUtils和Spring可以一起使用。用DBUtils实现DAO,让Spring管理Datasource和transaction,把DBBase声明为Spring可管理的bean,把datasource注入到DBBase中。可能要用构造函数注入,因为需要在构造函数中创建QueryRunner。DBBase中所有包含数据库操作的函数都让它抛出Runtime Exception,或者直接借用Spring的DataAccessException。

有道理,修改DBUtils确实不是好办法。
不过DataSource应该使用Spring的一个DataSource代理TransactionAwareDataSourceProxy
<bean id="dataSourceTarget" class="org.apache.commons.dbcp.BasicDataSource" scope="singleton">       
    <property name="driverClassName">
    	<value>oracle.jdbc.driver.OracleDriver</value>
    </property>      
    <property name="url">
    	<value>jdbc:oracle:thin:@localhost:1521:dbname</value>
    </property>      
    <property name="username">
    	<value>user_bask_app</value>
    </property>      
    <property name="password">
    	<value>user_bask_app</value>
    </property>      
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy" scope="singleton">
    <constructor-arg>
	<ref bean="dataSourceTarget"/>
    </constructor-arg>
</bean>

<bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
    <constructor-arg>
	<ref bean="dataSource"/>
    </constructor-arg>
</bean>


QueryRunner从代理中取得Connection,在同一个请求线程中由Spring保证其事务性。
11 楼 chenkan2000 2010-06-26  
你说的很对。但我认为hack DBUtils没有必要,DBUtils和Spring可以一起使用。用DBUtils实现DAO,让Spring管理Datasource和transaction,把DBBase声明为Spring可管理的bean,把datasource注入到DBBase中。可能要用构造函数注入,因为需要在构造函数中创建QueryRunner。DBBase中所有包含数据库操作的函数都让它抛出Runtime Exception,或者直接借用Spring的DataAccessException。
10 楼 summerfeel 2010-06-24  
wnick 写道
chenkan2000 写道
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。


我没有别的意思
只是我网上查了一下感觉都比较麻烦
所以希望找一个简短点的
呵呵

我稍微看了一下源代码,Spring和DbUtils在基本查询和处理结果集方面的设计思想是一致的。DBUtils只提供了一个QueryRunner,确实够轻量级,数据源也可以使用开源的连接池,但事务确实不好控制。
在单个数据源的情况下要准确的控制事务的提交回滚,必须保证在一个事务中的操作都使用同一个Connection。在Spring中通过对DataSource进行代理,返回与当前执行线程绑定的Connection,以此来保证上面所说的这一点。使用DBUtils实现事务,不知是否需要hack源码...
9 楼 wnick 2010-06-24  
chenkan2000 写道
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。


我没有别的意思
只是我网上查了一下感觉都比较麻烦
所以希望找一个简短点的
呵呵
8 楼 chenkan2000 2010-06-23  
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。
7 楼 wnick 2010-06-22  
chenkan2000 写道
处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。

DBBase类有个问题,所有方法都把SQLException捕获后又不抛出异常,调用它的service类实现事务处理就很困难了。


这里只是用来记录一下
没有做其他处理
我印象中 springjdbc要返回对象要使用回调一类操作
不知能否麻烦你用springJDBC 做一个 简单的查询返回 一个对象和 返回一个list
6 楼 chenkan2000 2010-06-22  
处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。

DBBase类有个问题,所有方法都把SQLException捕获后又不抛出异常,调用它的service类实现事务处理就很困难了。
5 楼 wnick 2010-06-21  
summerfeel 写道
想知道你事务是怎么处理的

这个工具强大的是查询功能
返回自定义对象、map 等
事务那些还是要自己来完成的

chenkan2000 写道
直接用Spring的JdbcTemplate得了。

spring 的查询要返回对象自己需要做很多编码
感觉麻烦
也许是我不了解它吧
只是看了一下spring文档的demo
4 楼 chenkan2000 2010-06-21  
直接用Spring的JdbcTemplate得了。
3 楼 summerfeel 2010-06-21  
想知道你事务是怎么处理的
2 楼 cyberblue 2010-06-19  
DbUtils比较不错,如果数据库的结构不是很复杂,可以用DbUtils代替iBatis。
1 楼 ma3310 2010-06-19  
#         DBBase db = new DBBase(); 
#         db.setDataSource(ds); 
#         db.init(); 

直接在DbBase里做掉好

相关推荐

    commons-dbutils-1.3.zip

    Apache Commons DBUtils是一个Java库,它简化了与数据库交互的任务,是Java开发中常用的数据访问工具。这个压缩包“commons-dbutils-1.3.zip”包含的是DBUtils库的1.3版本。DBUtils库是Apache Commons项目的一部分,...

    commons-dbutils-1.4.jar

    2. 查询结果集处理:DBUtils中最常用的工具类是QueryRunner,它支持执行SQL查询和更新操作。对于查询操作,QueryRunner可以将结果集转换为Bean对象列表,方便进行数据绑定和展示。例如,通过`QueryRunner.runQuery()...

    commons_dbutils使用说明

    使用 Commons dbutils 可以极大地简化 JDBC 编程,避免了许多手动处理连接、声明和结果集的工作,同时也提高了代码的可读性和可维护性。例如,使用 `QueryRunner` 执行查询和更新操作时,只需要提供 SQL 语句、参数...

    commons-dbutils的jar包,1.3和1.7两个版本合集

    它作为Apache Commons项目的一部分,是Java开发者常用的一个工具,能够减少编写重复的JDBC模板代码。 标题提到的"commons-dbutils的jar包,1.3和1.7两个版本合集",意味着我们有两个不同版本的DBUtils库:1.3和1.7...

    四个jar包commons-beanutils-1.8.3+dbcp+dbutils-1.4+commons-fileupload-1.2.2

    Apache Commons DBUtils是一个简化数据库操作的库,它与DBCP一起使用时效果更佳。DBUtils提供了一套简单的API,可以避免常见的JDBC编程错误,如资源泄漏。它封装了JDBC的常用操作,如执行SQL查询、处理结果集等,...

    Dbutils 的jar包

    Dbutils 是 Apache Commons DbUtils 的简称,它是一个用于简化 Java 数据库编程的开源库。Dbutils 基于 JDBC(Java Database Connectivity),提供了一套简洁、高效且易于使用的API,帮助开发者更方便地处理数据库...

    apache-commons的所有API

    9. **Commons DbUtils**: 是一个轻量级的数据库工具包,简化了 JDBC 的使用,如自动关闭资源、执行 SQL 语句等。它的 `QueryRunner` 类提供了执行 SQL 查询和更新操作的简便方法。 这些 API 在实际开发中有着广泛的...

    dbutils jar包

    这个jar包包含了不同版本的dbutils,分别是`dbutils1.6`、`dbutils1.7`和`dbutils1.4`,以及`commons-dbutils-1.6-bin`,这些都是Java开发者在处理数据库操作时常用的工具。 **1. dbutils概述** dbutils是基于...

    无涯教程(LearnFk)-DBUtils教程离线版.pdf

    DBUtils是一组旨在简化JDBC调用的Java类库,它由Apache Commons项目提供。DBUtils的特点在于它能够简化数据库操作,避免资源泄露,并且代码简洁。资源泄露是JDBC操作中常见的问题,通常发生在数据库连接、语句和结果...

    java项目commons jar包

    6. **commons-dbutils-1.6.jar**:Apache Commons DbUtils是基于Java的数据库操作工具,它简化了JDBC操作,提供了简单的查询、结果集处理等功能,使得处理数据库操作更加安全和简便。 7. **commons-logging-1.1.3....

    java常用的jar包

    本压缩包提供了三个常用的Java库,分别是activation.jar、commons-dbutils-1.3.jar和jsmartcom_zh_CN.jar,下面将分别详细介绍这三个jar包及其在Java开发中的作用。 1. **activation.jar**:这是一个用于JavaMail的...

    javaWeb入门jar(BeanUtils C3p0 DBCP DButils dom4j JDBC jstl)

    4. **DBUtils**:Apache Commons DBUtils是基于JDBC的数据库操作工具库,简化了数据库操作。它提供了一套异常处理机制,使得开发者不必频繁地处理SQL语句执行过程中的异常,同时还支持批处理和自动关闭资源,避免了...

    JavaWeb常用基本jar包.zip

    JavaWeb常用jar包整合,这里用的数据库jar包是5.1.37可以连5.5.40的数据库的,如果数据库版本较高记得更改,其余包含c3p0-0.9.1.2、commons-beanutils-1.9.4、commons-dbcp-1.4、commons-dbutils-1.7、commons-...

    JAKARTA COMMONS

    11. **Commons DbUtils**: 是一个 JDBC 辅助库,提供简单的资源清理代码,帮助简化数据库操作。 12. **Commons Digester**: 使用 XML 配置文件映射到 Java 对象,简化 XML 解析和对象创建过程。 13. **Commons ...

    Pro.Jakarta.Commons.rar

    9. **Commons DbUtils**:简化了数据库操作,提供了一个简单的JDBC工具库,可以防止SQL注入等问题。 10. **Commons Configuration**:提供了一种灵活的方式来管理应用程序的配置,支持多种配置源,如XML、...

    Java Web jar 包 dbutils dom4j c3p0 dbcp dom4j jstl Commons Logging

    这个压缩包包含了一些经典的Java Web开发中的重要组件,如dbutils、dom4j、c3p0、dbcp以及jstl等,同时也包含了数据库驱动和Commons Logging。接下来,我们将深入探讨这些组件的功能和使用场景。 1. **dbutils**: ...

    ApachDbUtils常见方法.docx

    ### Apache DbUtils 常见方法详解 #### 一、Apache Commons DbUtils 概述 ...以上是对Apache DbUtils常用方法的详细介绍,希望这些内容能够帮助开发者更好地理解和应用DbUtils,从而提高开发效率。

    dbutils和proxool的jar

    在Java开发中,数据库操作是不可或缺的一部分,而`dbutils`和`proxool`就是两个常用的工具库,用于简化数据库连接管理和数据访问。本篇文章将详细介绍这两个库以及它们的使用。 `dbutils`是一个轻量级的Java数据库...

    commons免费下载

    以上仅列举了一部分Apache Commons中的模块,实际上它还包括更多其他模块,如DBUtils(数据库操作)、CSV(CSV文件处理)等。这些库的使用可以显著提高开发效率,减少代码量,并且经过广泛测试,稳定性较高。如果你...

    MySQL驱动包5.1.21

    `commons-dbutils-1.7`是Apache Commons DBUtils库的一个版本,它是Java开发中常用的数据库操作工具包。DBUtils简化了JDBC编程,提供了一层抽象,避免了手动处理数据库连接、关闭结果集等繁琐工作,降低了出错的可能...

Global site tag (gtag.js) - Google Analytics