论坛首页 Java企业应用论坛

commons dbutils 常用方法

浏览 11146 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-06-18   最后修改:2010-08-20
DAO
要运行要使用了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;
    }

}


   发表时间:2010-06-19  
#         DBBase db = new DBBase(); 
#         db.setDataSource(ds); 
#         db.init(); 

直接在DbBase里做掉好
0 请登录后投票
   发表时间:2010-06-19  
DbUtils比较不错,如果数据库的结构不是很复杂,可以用DbUtils代替iBatis。
0 请登录后投票
   发表时间:2010-06-21   最后修改:2010-06-21
想知道你事务是怎么处理的
0 请登录后投票
   发表时间:2010-06-21  
直接用Spring的JdbcTemplate得了。
0 请登录后投票
   发表时间:2010-06-21  
summerfeel 写道
想知道你事务是怎么处理的

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

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

spring 的查询要返回对象自己需要做很多编码
感觉麻烦
也许是我不了解它吧
只是看了一下spring文档的demo
0 请登录后投票
   发表时间:2010-06-22  
处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。

DBBase类有个问题,所有方法都把SQLException捕获后又不抛出异常,调用它的service类实现事务处理就很困难了。
0 请登录后投票
   发表时间:2010-06-22  
chenkan2000 写道
处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。

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


这里只是用来记录一下
没有做其他处理
我印象中 springjdbc要返回对象要使用回调一类操作
不知能否麻烦你用springJDBC 做一个 简单的查询返回 一个对象和 返回一个list
1 请登录后投票
   发表时间:2010-06-23  
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。
0 请登录后投票
   发表时间:2010-06-24  
chenkan2000 写道
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。


我没有别的意思
只是我网上查了一下感觉都比较麻烦
所以希望找一个简短点的
呵呵
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics