论坛首页 入门技术论坛

Apache的DBUtils

浏览 10092 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-05-24  
package com.test.dbutil;

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

import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class UserDaoImpl implements UserDao  {
	
	public DataSource getDataSource(){
		String url = "jdbc:mysql://127.0.0.1:3306/testdbutils";
		MysqlDataSource ds = new MysqlDataSource();
		ds.setServerName("127.0.0.1");
//		ds.setDatabaseName("testdbutils");
		ds.setURL(url);
		ds.setUser("root");
		ds.setPassword("123456");
		ds.setCharacterEncoding("utf8");
		return ds;
	}
	
	public BeanListHandler<User> getBeanListHandler(){
		return new BeanListHandler<User>(User.class);
	}
	
	public BeanHandler<User> getBeanHandler(){
		return new BeanHandler<User>(User.class);
	}

	public void delete(int id) {
		QueryRunner runner = new QueryRunner(getDataSource());
		try {
			int affectedRows = runner.update("delete from user where id = ?",id);
			System.out.println("删除成功,影响的行数:"+affectedRows);
		} catch (SQLException e) {
			System.out.println("删除id为"+id+"的记录失败。错误为:"+e.getMessage());
		}
	}

	public void delete(User user) {
		delete(user.getId());
	}

	public List<User> getAllUsers() {
		QueryRunner runner = new QueryRunner(getDataSource());
		try {
			return runner.query("select * from user", getBeanListHandler());
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

	public User getById(int id) {
		QueryRunner runner = new QueryRunner(getDataSource());
		User user = null;
		try {
			user = runner.query("select * from user where id = ?", getBeanHandler(),id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return user;
	}

	public void save(User user) {
		QueryRunner runner = new QueryRunner(getDataSource());
		try {
			runner.update("insert into user values(?,?,?,?,?)",new Object[]{
					user.getId(),
					user.getName(),
					user.getAge(),
					user.getSex(),
					user.getBirth()
			});
		} catch (SQLException e) {
			System.out.println("插入失败,失败原因:"+e.getMessage());
		}
	}

	public long getCount() {
		QueryRunner runner = new QueryRunner(getDataSource());
		try {
			
			
			Long count = runner.query("select count(*) as count from user", new ResultSetHandler<Long>(){

				public Long handle(ResultSet rs) throws SQLException {
					if(rs.next()){
						return rs.getLong(1); //或者rs.getLong("count");
					}
					return 0L;
				}
				
			});
			
			//或者用ScalarHandler, 这里的new ScalarHandler() 可以加上“count”参数
//			Long count = (Long)runner.query("select count(*) as count from user",new  ScalarHandler(){
//
//				@Override
//				public Object handle(ResultSet rs) throws SQLException {
//					return super.handle(rs);
//				}
//				
//			});

			return (Long)count;
		} catch (SQLException e) {
			e.printStackTrace();
			return 0L;
		}
	}
	
	
	
}

 如果什么框架都不想用,那就最基础的jdbc吧,简单封装下。

   发表时间:2011-05-24  
直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊?

可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。
0 请登录后投票
   发表时间:2011-05-24  
是啊,现在的持久层框架很多,你用ibatis或者hibernate都行,只是介绍下apache的这个组件
0 请登录后投票
   发表时间:2011-05-24  
dbutils好像用的不是很多
一般都是用BeanUtils来做bussiness层与services层bean转换,BeanUtils还是用的比较多一些的
0 请登录后投票
   发表时间:2011-05-24  
scala可以选这 东西作数据层代码有动态 特点
0 请登录后投票
   发表时间:2011-05-25  
以前没有注意这个,我现在IBatis和Hibernate都要用,但有时不得不用JDBC, 有时间简单研究一下这个。

george_space 写道
直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊?

可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。


这个事,我个人感觉可能这种情况出现得比较少,只是想讨论一下,不是想争论。放在XML里就像Ibatis那种,Java代码比较纯洁,这是好处。但如果是N年前的程序,想改动的时候,只改一下SQL而不动任何Java代码,我还真想不到这种情况。有的时候,我还是图省事,把SQL直接写在代码里,因为很多时间要拼SQL, 而且是特别复杂的SQL。

0 请登录后投票
   发表时间:2011-05-25  
可以看看Spring的JDBCTemplate 其实都差不多
0 请登录后投票
   发表时间:2011-05-25  
george_space 写道
直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊?

可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。

你就直接说是IBatis得了,把SQL写在XML中,并且掺杂着逻辑标签,你觉得很爽吗?你觉得DBA喜欢看这些XML标签偶尔出现些SQL关键字的内容吗?
0 请登录后投票
   发表时间:2011-05-25  
项目中Ibatis,Hibernate用得多些,单独JDBC没怎么用。
0 请登录后投票
   发表时间:2011-05-25  
george_space 写道
直接把SQL写在程序中,这样不太好吧,如果有n年前的系统,当初的开发者都消失了。
现在需要改一条SQL语句,还需要重新修改、编译这个老项目啊?

可以考虑把SQL语句提取出来,放到xml中,这样可以集中管理SQL,即使换数据库,也不同动程序,只要修改一下xml中的SQL即可。


实际上,把sql放在xml里面才费事,如果是一个不熟悉的人员来维护,需要先找到sql的别名,然后再到xml里面去改,我宁肯写成常量,或者直接写在代码里面
2 请登录后投票
论坛首页 入门技术版

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