关于java底层操作数据库的方法封装类BaseDao.java

13 篇文章 0 订阅

和上篇博客MyDataSource工具包连用
1.新建一个com.java.base包,包下建BaseDao.java类

如果需要实现其他功能,可以仿照下面的方法自己写

代码如下:

package com.java.base;

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

import org.apache.commons.dbutils.DbUtils;
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.java.util.MyDataSource;



/**
 * dao层公共方法类。
 * 增删改方法 ,默认支持事务,需要在业务类中,添加事务。
 * @author yaohuicheng
 *
 * @param <T>
 */
 
 //<T>泛型,可以放要操作对象的bean对象
public class BaseDao<T>{
	//创建线程,保证事务运行安全,事务用的
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

	/**
	 * 返回单个对象
	 * @param <T>
	 * 
	 * @param sql
	 * @param clazz
	 * @param params
	 *            如果没有参数就设为 Object[] params={}
	 * @return
	 */
	public <T> T get(String sql, Class<T> clazz, Object[] params) {
		T obj = null;
		Connection conn = null;
		try {
			conn = MyDataSource.getConnection();
			QueryRunner qRunner = new QueryRunner();
			obj = qRunner.query(conn, sql, new BeanHandler<T>(clazz), params);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return obj;
	}

	/**
	 * 返回多个对象
	 * 
	 * @param sql
	 * @param clazz
	 * @param params
	 *            如果没有参数就设为 Object[] params={}
	 * @return
	 */
	public <T> List<T> query(String sql, Class<T> clazz, Object[] params) {
		List beans = null;
		Connection conn = null;
		try {
			conn = MyDataSource.getConnection();
			QueryRunner qRunner = new QueryRunner();
			beans = (List) qRunner.query(conn, sql, new BeanListHandler<T>(clazz), params);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return beans;
	}

	/**
	 * 返回增删改是否成功
	 * 【注意,此方法没有关闭connection连接;需要在事务中关闭。 】
	 * @param sql
	 * @param params
	 * @return
	 * @throws Exception 
	 */
	public boolean update(String sql, Object[] params) throws Exception {
		Connection conn = getConnection();
		boolean flag = false;
		QueryRunner qRunner = new QueryRunner();
		int i = qRunner.update(conn, sql, params);
		if (i > 0) {
			flag = true;
		}
		return flag;
	}
	

	/***
	 * 批量操作,需要用到事务
	 * 【注意,此方法没有关闭connection连接;需要在事务中关闭。 】
	 * @param conn
	 * @param sql
	 * @param params
	 * @return
	 * @throws Exception 
	 */
	public boolean batchUpdate(String sql, Object[][] params) throws Exception {
		QueryRunner qRunner = new QueryRunner();
		int result = 0;
		boolean flag = false;
		result = qRunner.batch(getConnection(), sql, params).length;
		if (result > 0) {
			flag = true;
		}
		return flag;
	}
	/**
	 * 返回统计单值,
	 * @param sql
	 * @param params
	 * @return
	 */
	public Number getCount(String sql,Object[] params){
		Number value =0;
		Connection conn = null;
		try {
			conn = getConnection();
			QueryRunner qRunner = new QueryRunner();
			value  = (Number) qRunner.query(conn, sql, new ScalarHandler(), params);
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DbUtils.closeQuietly(conn);
		}
		return value;
	}
	/**
	 * 返回主键,通常是执行insert语句时返回当前的主键值
	 * 【注意,此方法没有关闭connection连接;需要在事务中关闭。 】
	 * @param sql
	 * @param params
	 * @return
	 * @throws Exception 
	 */
    public Long getCurrentKey(String sql,Object[] params) throws Exception {
    	Connection conn = null;
		Long key = 0l;
		conn = getConnection();
		QueryRunner qRunner = new QueryRunner();
		key = (Long) qRunner.insert(conn,sql, new ScalarHandler(1), params);
		return key;
   }
    
	/**
	 * 从线程池中:获取数据连接。
	 * @return 
	 * @throws Exception
	 */
	public Connection getConnection(){
		Connection conn = tl.get();
		if(conn ==null){
			conn = MyDataSource.getConnection();
		}
		return conn;
	}
	/***********事务处理方法************/
	/**
	 * 开启事务
	 */
	public static void beginTranscation(){
		Connection conn = tl.get();

		try {
			conn = MyDataSource.getConnection();
			conn.setAutoCommit(false);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		tl.set(conn);
	}
	/**
	 * 结束事务
	 * @throws SQLException
	 */
	public static void endTranscation(){
		Connection conn = tl.get();
		try {
			conn.commit();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 回滚
	 * @throws SQLException
	 */
	public static void rollback(){
		Connection conn = tl.get();
		try {
			conn.rollback();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 事务处理,关闭资源
	 * @throws SQLException
	 */
	public static void closeConn(){
		Connection conn = tl.get();
		try {
			if(conn != null){
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		tl.remove();
	}

	
}    

继承BaseDao即可使用,T为要操作的bean对象

查的操作只需要:this.方法名(参数);

事务的使用如下:

			try {
				//1.开启事务
				BaseDao.beginTranscation();
				//2.执行注册
				falg = userDao.addUser(user);
				//3.提交事务
				BaseDao.endTranscation();
				
			} catch (Exception e) {
				//4.回滚事务
				BaseDao.rollback();
			}finally {
				//5.关闭连接
				BaseDao.closeConn();
			}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值