锁定老帖子 主题:commons dbutils 常用方法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-18
最后修改:2010-08-20
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; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-19
# DBBase db = new DBBase();
# db.setDataSource(ds); # db.init(); 直接在DbBase里做掉好 |
|
返回顶楼 | |
发表时间:2010-06-19
DbUtils比较不错,如果数据库的结构不是很复杂,可以用DbUtils代替iBatis。
|
|
返回顶楼 | |
发表时间:2010-06-21
最后修改:2010-06-21
想知道你事务是怎么处理的
|
|
返回顶楼 | |
发表时间:2010-06-21
直接用Spring的JdbcTemplate得了。
|
|
返回顶楼 | |
发表时间:2010-06-21
summerfeel 写道 想知道你事务是怎么处理的
这个工具强大的是查询功能 返回自定义对象、map 等 事务那些还是要自己来完成的 chenkan2000 写道 直接用Spring的JdbcTemplate得了。
spring 的查询要返回对象自己需要做很多编码 感觉麻烦 也许是我不了解它吧 只是看了一下spring文档的demo |
|
返回顶楼 | |
发表时间:2010-06-22
处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。 DBBase类有个问题,所有方法都把SQLException捕获后又不抛出异常,调用它的service类实现事务处理就很困难了。 |
|
返回顶楼 | |
发表时间:2010-06-22
chenkan2000 写道 处理返回结果不麻烦。可以看一下spring javadoc中这几个类:
RowMapper,BeanPropertyRowMapper,ParameterizedBeanPropertyRowMapper, RowCallbackHandler等。 DBBase类有个问题,所有方法都把SQLException捕获后又不抛出异常,调用它的service类实现事务处理就很困难了。 这里只是用来记录一下 没有做其他处理 我印象中 springjdbc要返回对象要使用回调一类操作 不知能否麻烦你用springJDBC 做一个 简单的查询返回 一个对象和 返回一个list |
|
返回顶楼 | |
发表时间:2010-06-23
BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。
|
|
返回顶楼 | |
发表时间:2010-06-24
chenkan2000 写道 BeanPropertyRowMapper和ParameterizedBeanPropertyRowMapper可以实现BeanListHandler一样的功能,也是一行代码。我并不是要说明spring JDBC比DBUtils功能强大,但事务、数据库连接池真的需要好好考虑的。
我没有别的意思 只是我网上查了一下感觉都比较麻烦 所以希望找一个简短点的 呵呵 |
|
返回顶楼 | |