论坛首页 Java企业应用论坛

Jdbc BaseDao

浏览 9289 次
锁定老帖子 主题:Jdbc BaseDao
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-10  
DAO

package com.oa.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.oa.core.DynaForm;
import com.oa.dao.Dao;
import com.oa.jdbc.ConnectionFactory;
import com.oa.jdbc.DaoAccessException;
import com.oa.jdbc.DybaBean;
import com.oa.jdbc.JdbcPage;
import com.oa.jdbc.Page;
import com.oa.jdbc.RowsDynaClass;

/**
 * 基类DAO,实现一些基本共有方法
 * 
 * @author Gao_wx Mar 26, 2008
 */
public class BaseDao implements Dao {
	protected Log logger = LogFactory.getLog(BaseDao.class);

	// 获取数据库链接
	protected Connection getConnection() {
		return ConnectionFactory.getConnection();
	}

	// 在此链接上,根据sql语句获取List
	protected List<DybaBean> getList(Connection conn, String sql)
			throws DaoAccessException {
		try {
			Statement st = conn.createStatement(
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = st.executeQuery(sql);
			return getList(rs);
		} catch (SQLException e) {
			throw new DaoAccessException(sql, e);
		}
	}

	// 根据Result获取List
	protected List<DybaBean> getList(ResultSet rs) throws SQLException {
		RowsDynaClass rsdc = new RowsDynaClass(rs);
		return rsdc.getRows();

	}

	// 根据sql语句获取List
	protected List<DybaBean> getList(String sql) throws DaoAccessException {
		Connection conn = getConnection();
		return getList(conn, sql);
	}

	// 在此连接上,根据sql语句,id加载一条记录
	protected DybaBean loadById(Connection conn, String sql, int id)
			throws DaoAccessException {
		try {
			PreparedStatement pst = conn.prepareStatement(sql,
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_READ_ONLY);
			pst.setInt(1, id);
			ResultSet rs = pst.executeQuery();
			List list = getList(rs);
			if (list.size() > 1) {
				logger.warn("加载了2条以上的记录,请检查sql:" + sql);
			}
			if (list.size() == 0) {
				logger.warn("数据库没有此记录!");
				return null;
			} else {
				return (DybaBean) list.get(0);
			}
		} catch (SQLException e) {
			throw new DaoAccessException(sql, e);
		}
	}

	// 根据sql语句,id,加载一条记录
	protected DybaBean loadById(String sql, int id) throws DaoAccessException {
		Connection conn = getConnection();
		return loadById(conn, sql, id);
	}

	// 在此连接上,根据Sql和id删除一条记录,返回影响行数
	protected int deleteById(Connection conn, String sql, int id)
			throws SQLException {
		PreparedStatement pst = conn.prepareStatement(sql,
				ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		pst.setInt(1, id);
		int del = pst.executeUpdate();
		return del;
	}

	// 根据sql语句,id删除一条记录
	protected int deleteById(String sql, int id) throws DaoAccessException {
		Connection conn = getConnection();
		try {
			int del = deleteById(conn, sql, id);
			return del;
		} catch (SQLException e) {
			throw new DaoAccessException(sql, e);
		}

	}

	protected Page getPage(DynaForm form, String sql) throws DaoAccessException {
		Connection conn = getConnection();
		Page page = getPage(conn, form, sql);
		return page;
	}

	// 获取分页对象
	protected Page getPage(Connection conn, DynaForm form, String sql)
			throws DaoAccessException {
		int p = form.getInt("p");
		if (p < 1) {
			p = 1;
		}
		int size = form.getInt("size");
		if (size < 10) {
			size = 10;
		}
		Page page;
		try {
			page = new JdbcPage(conn, sql, p, size);
		} catch (SQLException e) {
			throw new DaoAccessException(sql, e);
		}
		return page;
	}
}

所有的select sql,不管是一对多,还是一对一,还是多对一,尽可能通过视图操作数据库!
数据库要改动的时候,改动视图即可!
如果表经常可能改动。那么请用动态表
http://supttkl.iteye.com/admin/blogs/181411

   发表时间:2008-04-15  
视图?可能出问题吧,都不提倡用。
0 请登录后投票
   发表时间:2008-04-16  
如果是安全性高的项目,那么恐怕你连一个表都操作不到。你操作的全部是视图!
0 请登录后投票
   发表时间:2009-02-17  
老大 代码是不是不全啊com.oa.tools包呢~~?
0 请登录后投票
论坛首页 Java企业应用版

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