`
canofy
  • 浏览: 831481 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

一个Dao类

    博客分类:
  • j2EE
阅读更多
package cn.yicha.adunion.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;



import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;


public class BaseDao {
    private final static Logger logger = Logger.getLogger(BaseDao.class);


    public boolean save(final Object entity) {
		Session sn = null;
		boolean flag = false;
		try {
			sn = SessionManager.getSession();
			Transaction ts = sn.beginTransaction();
			sn.save(entity);
			ts.commit();
			flag = true;
		} catch (Exception ex) {
			flag = false;
			logger.error("save() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return flag;
	}

	public boolean update(final Object entity) {
		Session sn = null;
		boolean flag = false;
		try {
			sn = SessionManager.getSession();
			Transaction ts = sn.beginTransaction();
			sn.update(entity);
			ts.commit();
			flag = true;
		} catch (Exception ex) {
			flag = false;
			logger.error("update() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return flag;
	}

	public boolean delete(final Object entity) {
		Session sn = null;
		boolean flag = false;
		try {
			sn = SessionManager.getSession();
			Transaction ts = sn.beginTransaction();
			sn.delete(entity);
			ts.commit();
			flag = true;
		} catch (Exception ex) {
			flag = false;
			logger.error("delete() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return flag;
	}

	public Object get(final Class entity, final Serializable id) {
		Session sn = null;
		Object obj = null;
		try {
			sn = SessionManager.getSession();
			
			obj = sn.get(entity, id);
			
		} catch (Exception ex) {
			logger.error("get() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return obj;
	}

	public List findAll(final Class entity) {
		Session sn = null;
		List list = null;
		try {
			sn = SessionManager.getSession();
			//Transaction ts = sn.beginTransaction();
			list = sn.createQuery(" from " + entity.getName()).list();
			//ts.commit();
		} catch (Exception ex) {
			logger.error("find() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return list;
	}

	public List find(final String query) {
		Session sn = null;
		List list = null;
		try {
			sn = SessionManager.getSession();
			//Transaction ts = sn.beginTransaction();
			list = sn.createQuery(query).list();
			//ts.commit();
		} catch (Exception ex) {
			logger.error("find() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return list;
	}

	public List find(final String queryStr, final Object[] parameter) {
		Session sn = null;
		List list = null;
		try {
			sn = SessionManager.getSession();
			//Transaction ts = sn.beginTransaction();
			Query query = sn.createQuery(queryStr);
			int len = parameter.length;
			for (int i = 0; i < len; i++) {
				query.setParameter(i, parameter[i]);
			}
			list = query.list();

			//ts.commit();
		} catch (Exception ex) {
			logger.error("find error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return list;
	} 
	
	/**
	 * 用标准Sql语句查询数据库
	 * @param sql sql语句
	 * @return
	 */
	public List selectWithSql(String sql){
		Session  sn = null;
		try {
			
			sn = SessionManager.getSession();
			Transaction ts =  sn.beginTransaction();
			ts.begin();
			SQLQuery query = sn.createSQLQuery(sql);
			List l = query.list();
			ts.commit();
			return l;
		}finally{
			SessionManager.closeSession();
		}
	}
	
	/**
	 * 得到分页的结果
	 * @param currentPage : 当前页
	 * @param pageSize : 每页要显示多少条数据
	 * @param countSql : 统计Hql
	 * @param countValues : 统计Hql中的值(是一个对象数组)
	 * @param sql
	 * @param values
	 * @return
	 */
	public HashMap getPageResult(int currentPage, final int pageSize
		     ,final String countHql,final Object[] countValues, final String hql,final Object[] values) {
		
		HashMap map = new HashMap();
		List list=new ArrayList();
	
		int totalSize= getTotalSize(countHql,countValues);	      
	           
		int start = 0;   //第currentPage页数据是从哪条记录开始的
		int end = 0;     //第currentPage页数据是从哪条记录结束的
		int totalPage = 0;
			
					 	
		/***** 找出当前要显示页(currentpage)的开始记录号"start"和结束记录号"end",以便只把当前页的数据给找出来 ******/
		totalPage = (int)Math.ceil((double)totalSize/pageSize);   //共有多少页
		//System.out.println("total:"+total+"   totalPage:"+totalPage+"   currentPage:"+currentPage);
		//如果当前页大于总页数,则显示最后一页
		if(currentPage>totalPage) currentPage = totalPage;
		//如果当前页小于0,则显示第一页
		if(currentPage<1) currentPage = 1;
			
		// 根据条件判断,取出所需记录		
		start = pageSize*(currentPage-1);
		end = start + pageSize;
		if(end>totalSize) end = totalSize;   //因为在下面的循环中用到的是小于,所以在此用"="
		 
	      	      
	      
	    list = getCurrentPageResult(start,pageSize,hql,values);  
	
		
		map.put("list",list);
		map.put("currentPage",String.valueOf(currentPage));
		map.put("totalPage",String.valueOf(totalPage));
		map.put("pageSize", String.valueOf(pageSize));
		map.put("totalSize", String.valueOf(totalSize));
		
		return map;

	}
	
	private int getTotalSize(String countHql,Object[] countValues){
		Session session = SessionManager.getSession();
		Query query = session.createQuery(countHql);
		
		if(countValues!=null){
			for (int i = 0; i < countValues.length; i++) {
				String type = getType(countValues[i].getClass().getName());
				if (type.equals("String")) {
					query.setString(i, "%" + countValues[i].toString() + "%");
				}else if (type.equals("Date")) {
					query.setDate(i, (Date)countValues[i]);
				}else if (type.equals("int")) {
					query.setInteger(i, Integer.parseInt((countValues[i].toString())));
				}else if (type.equals("Boolean")) {
					query.setBoolean(i, Boolean.getBoolean(countValues[i].toString()));
				}
			}
		}	
		return Integer.parseInt(query.uniqueResult().toString());
	}
	
	/**
	 * 功能:得到分页的结果(当前页)
	 * @param start : 开始记录号
	 * @param pageSize : 每页显示多少条记录
	 * @param sql : 要查询的sql语句
	 * @param values : sql语句中的变量值
	 * @return
	 */
	private List getCurrentPageResult(final int start,final int pageSize,final String sql,final Object[] values){
		
		Session session = SessionManager.getSession();	
				
		Query query = session.createQuery(sql);
		
		if(values!=null){
			for (int i = 0; i < values.length; i++) {
				String type = getType(values[i].getClass().getName());
				if (type.equals("String")) {
					query.setString(i, "%" + values[i].toString() + "%");
				}else if (type.equals("Date")) {
					query.setDate(i, (Date)values[i]);
				}else if (type.equals("int")) {
					query.setInteger(i, Integer.parseInt(values[i].toString()));
				}else if (type.equals("Boolean")) {
					query.setBoolean(i, Boolean.getBoolean(values[i].toString()));
				}
			}	
		}
						
		query.setFetchSize(30);
		query.setFirstResult(start);
		query.setMaxResults(pageSize);
	  
		return query.list();		
	}
	
	
	/**
	 * jiangys, 2008-01-24
	 * 查询数据库,并根据页数和页面显示数返回结果集
	 * @param hql 查询语句
	 * @param pageSize 页面显示数
	 * @param pageNum 页数
	 * @return
	 */
	public List find(final String hql, int pageSize, int pageNum) {
		Session sn = null;
		List list = null;
		try {
			sn = SessionManager.getSession();
			Query query = sn.createQuery(hql);
			int first = 0;
			int last = 0;
			
			if(pageNum <= 1){
				first = 0;
				last = pageSize;
			}else{
				first = (pageNum - 1) * pageSize;
				last = pageSize * pageNum;
			}
			
			query.setFirstResult(first);
			query.setMaxResults(last);
			list = query.list();
		} catch (Exception ex) {
			logger.error("find() error:" + ex.getMessage(), ex);
		} finally {
			SessionManager.closeSession();
		}
		return list;
	}
	
	private String getType(String typeParam) {
		int last = typeParam.lastIndexOf(".");
		return typeParam.substring(last + 1);
	}
	
	
	/**
	 * 执行sql语句
	 * @param sql
	 * @return List HashMap
	 * @throws YiChaAdException
	 */
	public List executeQuery(String sql){
		Session  sn = null;
		ResultSet rs = null;
		List list = null;
		try {
			sn = SessionManager.getSession();
			Connection conn=sn.connection();
			rs = conn.createStatement().executeQuery(sql);
			list = getList(rs);
		}catch(Exception e){
			logger.error("executeQuery :"+e.getMessage(),e);
		}finally{
			SessionManager.closeSession();
		}
		
		return list;
	}	
	
	/**
	 * 执行sql语句
	 * @param sql
	 * @return boolean 
	 */
	public boolean executeSql(String sql){
		boolean result=false;
		Session  sn = null;
		logger.info(sql);
		try {			
			sn = SessionManager.getSession();
			Connection conn=sn.connection();
			conn.setAutoCommit(false);
			conn.createStatement().executeUpdate(sql);
			conn.commit();
			
			result=true;
		}catch(Exception e){
			logger.error("execute:" + sql + e.getMessage(),e);
		}finally{
			SessionManager.closeSession();
		}
		
		return result;
	}	
	
	
	/*
	 * @由rs得到ArrayList
	 */
	 ArrayList getList(ResultSet rs) {
		ArrayList vector = new ArrayList();
		ResultSetMetaData rsmd = null;
		HashMap map = new HashMap();
		int columnCount = 0;
		try{
			rsmd = rs.getMetaData();
			columnCount = rsmd.getColumnCount();
			String[] columnName = new String[columnCount];
			
			for(int i=0;i<columnCount;i++){
				columnName[i]=rsmd.getColumnName(i+1);
			}
			while(rs.next()){
				map = new HashMap();
		//		System.out.println("rows:"+rs.getRow()+" id:"+rs.getInt("id")+"  email:"+rs.getString("email"));
				for(int i=0;i<columnCount;i++){
					int type = rsmd.getColumnType(i + 1);
			//		System.out.println(columnName[i]+type);
					try{
						if(rs.getObject(i+1)==null)
							map.put(columnName[i].toLowerCase(),null);
						else{
							switch (type) {
								case 4:		//integer型
									map.put(columnName[i], Integer.valueOf(rs.getString(i+1)));
									break;
								case 91:	//date型
									map.put(columnName[i],rs.getDate(i+1));
									break;				
								case 93:	//datetime 或 timestamp
									map.put(columnName[i],(Timestamp)rs.getObject(i+1));
									break;
								case -7:	//boolean型
									map.put(columnName[i],(Boolean)rs.getObject(i+1));
									break;
								default:
									map.put(columnName[i],rs.getString(i+1));
								}
						}
					}catch(Exception e){
						map.put(columnName[i],"");
						//System.out.println("列名:"+columnName[i]+"出错!"+e.getMessage().toString());
					}	
				}		
				vector.add(map);
			}
		}catch(SQLException e){
			logger.error("ProcessVO.java中的getVector()方法出错:"+e.getMessage());
		}		
		return vector;
	}
	 
}

分享到:
评论

相关推荐

    让java网站开发从此简单起来[一个项目只用一个Servlet和一个Dao类]demo

    在给定的项目中,作者尝试简化这个过程,通过仅使用一个Servlet和一个DAO类来构建整个网站。这种方式旨在降低复杂性,提高开发效率。 Servlet在Java Web应用中扮演着服务器端处理程序的角色,它接收HTTP请求并返回...

    一个简单的DAO例子

    在这个简单的DAO例子中,我们将深入理解DAO模式的基本概念,以及如何创建和使用一个基本的DAO类。 首先,DAO模式的核心思想是提供一个接口或者抽象类,通过这个接口或抽象类,应用可以与数据库进行交互,而无需关心...

    一个的DAO数据访问层的实现

    在描述中提到的链接是一个博客文章,可能详细介绍了如何实现一个DAO类,包括如何建立数据库连接、执行SQL语句、处理结果集等。由于没有直接提供文章内容,我们只能根据常规步骤进行解释。 实现DAO时,通常需要以下...

    泛型dao

    泛型DAO则进一步增强了这种模式,通过泛型参数化,使得一个DAO类可以服务于多种类型的实体对象,减少了代码重复,提高了效率。 首先,我们需要理解什么是泛型。Java泛型是Java SE 5.0引入的新特性,它允许在定义类...

    DAO开发模式介绍.......

    2. **DAO的职责**:DAO通常只负责单一的业务对象,比如一个DAO类对应一个实体类。DAO不处理会话、连接或事务,而是将其交给专门的工具类来管理,以提高代码的可维护性和灵活性。 三、DAO的实现 1. **泛型DAO**:...

    数据库dao操作jdbc

    在Java中,通常会为每个数据库表创建一个DAO类,用于执行CRUD(Create、Read、Update、Delete)操作。 JDBC(Java Database Connectivity)是Java语言连接数据库的标准API,它提供了与多种数据库进行交互的能力。在...

    DAO.rar_dao

    3. **DAO的结构**:通常,一个DAO类包含一个或多个对应于数据库操作的方法,如`insert()`, `update()`, `delete()`和`query()`。 4. **DAO的实现**:可能会通过JDBC(Java Database Connectivity)来实现,或者使用...

    使用DAO访问数据库的例子(189KB).zip_dao

    1. **DAO接口/抽象类**:首先,一个DAO类会定义一系列的方法,如增删查改(Insert、Delete、Select、Update),以及可能的事务处理方法。这些方法通常以通用的方式声明,不涉及具体的数据库操作细节。 2. **实现类*...

    SSH中通用dao类

    一个通用的DAO类通常会提供一些基础的数据库操作方法,如增删改查(CRUD),以便于在不同的业务组件中复用。 1. **Spring框架中的DAO支持**:Spring提供了对DAO的出色支持,包括事务管理、数据源配置以及DAO接口的...

    java代码 根据domain自动生成DAO层 小tool(功能有待又垒加)

    在Java中,一个DAO类通常包含一组方法,对应于对数据库表的操作,如增删查改。例如,对于一个名为`User`的实体类,对应的DAO可能会有`saveUser()`, `getUserById()`, `updateUser()`, `deleteUser()`等方法。 这个...

    java代码生成器(dao层service层)

    通常,一个DAO类会对应数据库中的一个表,包含对应表的CRUD(创建、读取、更新、删除)操作。使用代码生成器,我们可以自定义模板,生成符合项目规范的DAO接口和实现类,以及对应的SQL映射文件(如MyBatis框架中的...

    java倒类详解 讲解java Dao类的里各种语句与变量之间的关系

    首先,一个基本的DAO类通常包含以下元素: 1. **接口定义**:定义了对数据库进行操作的方法,如增删查改(CRUD)操作。例如,`UserDao` 接口可能包含 `getUserById(int id)` 和 `saveUser(User user)` 等方法。 2....

    Dao的实现类

    定义一个DAo的接口类,z再建一个IMPL实现类,实现接口类的所有方法

    泛型dao 泛型dao 泛型dao

    1)dao类的繁多,很多设计都是一个entity对应一个dao (不同的只有类名和方法名) 2)dao接口需要维护的method庞大。 3)业务逻辑改变时,dao需要同时修改两个类文件(接口和实现类) 在本文中,我将为您展示如何...

    DWR的访问DAO和Servlet

    然后,我们需要定义一个DAO类,该类将包含所有与数据库交互的逻辑。这些方法可以是CRUD(创建、读取、更新、删除)操作,以及其他特定于应用的数据库查询。DAO通常会使用JDBC或者ORM框架如Hibernate或MyBatis来实现...

    Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作1

    在本文中,`StudentDAO.java`就是这样一个DAO类,负责处理与学生表相关的增删改查操作。 Java Bean则是一个符合一定规范的Java类,通常用于封装数据和业务逻辑,便于在多个组件之间共享和传递数据。例如,`Student....

    .net 自动生成实体类、DAO工具

    这个".net 自动生成实体类、DAO工具"是一个实用的小型工具,能够帮助开发者快速构建数据访问层,从而节省手动编写代码的时间。 首先,让我们了解一下实体类(Entity Class)。实体类是对数据库表的面向对象表示,它...

    通用数据库访问模块,通用DAO类

    在给定的“generalDAO”压缩包中,可能包含了一个或多个通用 DAO 类的实现,这些类可能是针对不同数据库操作(如增删改查)的封装。这些类可能使用了参数化 SQL 语句或者预编译的 SQL 语句(如 Java 中的 ...

    前后端javaWeb+Dao

    在Java中,一个DAO类通常会包含一组方法,如增删查改,用于执行特定的数据库操作。通过接口或者继承,我们可以实现不同数据库(如MySQL、Oracle等)的切换,而无需修改业务代码。 在"DrugManagementSystem"这个项目...

    简单mvc,dao servlet 适合课后小作业

    在Java中,一个DAO类通常会包含连接数据库、执行SQL语句、处理结果集等方法。 **Servlet技术** Servlet是Java EE的一部分,它是一个Java类,用于扩展服务器的功能。在Web应用中,Servlet用于处理HTTP请求,可以生成...

Global site tag (gtag.js) - Google Analytics