`
sadfasfasd
  • 浏览: 1036 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

一个写得不错的DAO操作类

阅读更多

package com.scitel.gdnumcommon.utils;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

import com.scitel.gdnumcommon.entity.Pagination;
import com.scitel.gdnumcommon.entity.BaseVO;


public class BaseDAO {
 private static final Log log = LogFactory.getLog(BaseDAO.class);

 /**
  * 保存数据,新建和修改都用这个
  *
  * @param con
  * @param SQL
  * @param params
  * @throws Exception
  * @author
  */
 public void save(Connection con, String SQL, List params)
   throws Exception {
  PreparedStatement ps = null;
  try {
   ps = con.prepareStatement(SQL);
   if (SQL == null) {
    throw new Exception();
   }

   if (params != null && params.size() > 0) {
    int count = 0;
    for (Iterator iterator = params.iterator(); iterator.hasNext(); count++) {
     Object object = iterator.next();
     setObjectValue(ps, count + 1, object);
    }
   }
   ps.executeUpdate();
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try{
    if(ps != null) {
     ps.close();
    }
   }catch(Exception e){

   }
  }
 }

 /**
  * 保存数据,新建和修改都用这个,通过字段名称匹配类型
  * @param con
  * @param SQL
  * @param voclass
  * @param paramMap
  * @throws Exception
  * @author
  */
 public void save(Connection con, String SQL, Class voclass, Map paramMap)
   throws Exception {
  PreparedStatement ps = null;
  try {
   ps = con.prepareStatement(SQL);
   if (SQL == null) {
    throw new Exception();
   }

   if (paramMap != null && paramMap.size() > 0) {
    int count = 0;
    for (Iterator iterator = paramMap.keySet().iterator(); iterator.hasNext(); count++) {

     String key = (String)iterator.next();
     Object object = paramMap.get(key);
     setObjectValue(ps, voclass, count+1, key, object);
    }
   }
   ps.executeUpdate();
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try{
    if(ps != null) {
     ps.close();
    }
   }catch(Exception e){

   }
  }
 }

 /**
  * 删除数据
  *
  * @param con
  * @param SQL
  * @param params
  * @throws Exception
  * @author
  */
 public void remove(Connection con, String SQL, List params)
   throws Exception {
  PreparedStatement ps = null;
  try {
   ps = con.prepareStatement(SQL);
   if (SQL == null) {
    throw new Exception();
   }
   if (params != null && params.size() > 0) {
    int count = 0;
    for (Iterator iterator = params.iterator(); iterator.hasNext(); count++) {
     Object object = iterator.next();
     setObjectValue(ps, count + 1, object);
    }
   }
   ps.executeUpdate();
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try{
    if(ps != null) {
     ps.close();
    }
   }catch(Exception e){

   }
  }
 }

 /**
  * 根据ID选择数据
  *
  * @param con
  * @param SQL
  * @param id
  * @param voclass
  * @return
  * @throws Exception
  * @author
  */
 public BaseVO selectById(Connection con, String SQL, String id,
   Class voclass) throws Exception {
  Object po = null; // 承载值对象
  PreparedStatement ps = null;
  ResultSet rs = null;
  ResultSetMetaData rsm = null;
  try {
   ps = con.prepareStatement(SQL);
   if (SQL == null) {
    throw new Exception();
   }

   ps.setString(1, id);

   rs = ps.executeQuery();
   rsm = rs.getMetaData();
   if (rs.next()) {
    Map entity = new HashMap();
    for (int i = 1; i <= rsm.getColumnCount(); i++) {
     String columnName = rsm.getColumnName(i).toLowerCase();
     Object columnValue = getObjectValue(rs, voclass, i, columnName);
     entity.put(columnName, columnValue);
    }
    if (voclass != null) {
     po = voclass.newInstance();
     BeanUtils.populate(po, entity);
    }
    
   }
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try {
    if (rs != null) {
     rs.close();
    }
   } catch (Exception e) {

   }
   try {
    if (ps != null) {
     ps.close();
    }
   } catch (Exception e) {

   }
  }
  return (BaseVO) po;
 }

 /**
  * 选择记录,不分页
  * @param con
  * @param SQL
  * @param params
  * @param voclass
  * @return
  * @throws Exception
  * @author
  */
 public List select(Connection con, String SQL, List params, Class voclass)
   throws Exception {
  Object vo = null; // 承载值对象
  PreparedStatement ps = null;
  ResultSet rs = null;
  ResultSetMetaData rsm = null;
  List relist = null;
  try {
   ps = con.prepareStatement(SQL);
   if (SQL == null) {
    throw new Exception();
   }
   if (params != null && params.size() > 0) {
    int count = 0;
    for (Iterator iterator = params.iterator(); iterator.hasNext(); count++) {
     Object object = iterator.next();
     setObjectValue(ps, count + 1, object);
    }
   }
   rs = ps.executeQuery();
   rsm = rs.getMetaData();
   relist = new ArrayList();
   while (rs.next()) {
    Map entity = new HashMap();
    for (int i = 1; i <= rsm.getColumnCount(); i++) {
     String columnName = rsm.getColumnName(i).toLowerCase();
     Object columnValue = getObjectValue(rs, voclass, i, columnName);
     entity.put(columnName, columnValue);
     
    }
    if (voclass != null) {
     vo = voclass.newInstance();
     BeanUtils.populate(vo, entity);
     relist.add(vo);
    } else {
     relist.add(entity);
    }
   }
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try {
    if (rs != null) {
     rs.close();
    }
   } catch (Exception e) {

   }
   try {
    if (ps != null) {
     ps.close();
    }
   } catch (Exception e) {

   }
   
  }
  return relist;
 }

 /**
  * 分页查询
  *
  * @param con
  * @param SQL
  * @param params
  * @param voclass
  * @param pagination
  * @return
  * @throws Exception
  * @author
  */
 public List selectPagination(Connection con, String SQL, List params,
   Class voclass, Pagination pagination) throws Exception {
  if (SQL == null) {
   throw new NullPointerException("SQL不能为空!");
  }
  if (pagination == null) {
   throw new NullPointerException("分页类不能为空!");
  }

  // TODO Auto-generated method stub
  Object vo = null; // 承载值对象
  PreparedStatement ps = null;
  ResultSet rs = null;
  ResultSetMetaData rsm = null;
  List relist = null;
  try {

   ps = con.prepareStatement("select count(1) as count_ from ( " + SQL + " )");

   if (params != null && params.size() > 0) {
    int count = 0;
    for (Iterator iterator = params.iterator(); iterator.hasNext(); count++) {
     Object object = iterator.next();
     setObjectValue(ps, count + 1, object);
    }
   }

   rs = ps.executeQuery();
   if (rs.next()) {
    pagination.setTotalCount(rs.getInt(1));
    
   }
   

   if (pagination.getTotalCount() > 0) {
    /* 组成分页内容 */
    StringBuffer pagingSelect = new StringBuffer(100);
    pagingSelect
      .append("select * from ( select row_.*, rownum rownum_ from ( ");
    pagingSelect.append(SQL);
    pagingSelect
      .append(" ) row_ where rownum <= ?) where rownum_ > ?");

    ps = con.prepareStatement(pagingSelect.toString());
    int count = 0;
    if (params != null && params.size() > 0) {
     for (Iterator iterator = params.iterator(); iterator.hasNext(); count++) {
      Object object = iterator.next();
      setObjectValue(ps, count + 1, object);
     }
    }
    
    ps.setInt(count + 1, pagination.getPage()
      * pagination.getCount());
    ps.setInt(count + 2, (pagination.getPage() - 1)
      * pagination.getCount());

    log.info("pagination.getPage():" + pagination.getPage());
    log.info("pagination.getCount():" + pagination.getCount());
    rs = ps.executeQuery();
    rsm = rs.getMetaData();
    relist = new ArrayList();
    while (rs.next()) {
     Map entity = new HashMap();
     for (int i = 1; i <= rsm.getColumnCount(); i++) {
      String columnName = rsm.getColumnName(i).toLowerCase();
      Object columnValue = getObjectValue(rs, voclass, i, columnName);
      entity.put(columnName, columnValue);
     }
     if (voclass != null) {
      vo = voclass.newInstance();
      BeanUtils.populate(vo, entity);
      relist.add(vo);
     } else {
      relist.add(entity);
     }
    }
   }
  } catch (Exception e) {
   log.error(e);
   throw e;
  } finally {
   try {
    if (rs != null) {
     rs.close();
    }
   } catch (Exception e) {

   }
   try {
    if (ps != null) {
     ps.close();
    }
   } catch (Exception e) {

   }

  }
  return relist;
 }

 /**
  * 获得SequenceValue
  * @param sequenceName
  * @return
  * @throws Exception
  * @author
  */
 public Long getSequenceValue(Connection con, String sequenceName)throws Exception {
  PreparedStatement ps = null;
  ResultSet rs = null;
  Long sequenceValue = null;
  try{
   ps = con.prepareStatement("select " + sequenceName + ".nextval from dual");
   rs = ps.executeQuery();
   if(rs.next()) {
    sequenceValue = new Long(rs.getLong(1));
   }
  }catch(Exception e){
   log.error(e);
   throw e;
  }finally{
   try {
    if (rs != null) {
     rs.close();
    }
   } catch (Exception e) {

   }
   try {
    if (ps != null) {
     ps.close();
    }
   } catch (Exception e) {

   }
  }
  return sequenceValue;
 }
 /**
  * 把对象传入数据库
  * @param ps
  * @param count
  * @param object
  * @author
  */
 private final void setObjectValue(PreparedStatement ps, int count, Object object) throws Exception {
  log.debug("count is " + count + " object is " + object);
  if(object != null) {
   if(object instanceof Integer){
    ps.setInt(count, ((Integer)object).intValue());
   }else if(object instanceof Long) {
    ps.setLong(count, ((Long)object).longValue());
   }else if(object instanceof BigDecimal){
    ps.setBigDecimal(count, (BigDecimal)object);
   }else if(object instanceof String){
    ps.setString(count, (String)object);
   }else if(object instanceof java.util.Date) {
    if(object!=null){
     long time = ((java.util.Date)object).getTime();
     ps.setDate(count, new java.sql.Date(time));
    }else{
     ps.setDate(count, null);
    }
   }else{
    ps.setObject(count, object);
   }
  }else{
   ps.setNull(count, Types.INTEGER);
  }
 }

 /**
  * 把对象传入数据库
  * @param ps
  * @param clazz
  * @param count
  * @param columnName
  * @param object
  * @throws Exception
  * @author
  */
 private final void setObjectValue(PreparedStatement ps, Class clazz, int count,
   String columnName, Object object)throws Exception {
  log.debug("count is " + count + " columnName is " + columnName + " object is " + object);
  String classType = clazz.getDeclaredField(columnName).getType().getName();
  if(classType.equals("java.lang.Integer")){
   if(object != null) {
    ps.setInt(count, ((Integer)object).intValue());
   }else{
    ps.setNull(count, Types.INTEGER);
   }
  }else if(classType.equals("java.lang.Long")) {
   if(object != null ) {
    ps.setLong(count, ((Long)object).longValue());
   }else{
    ps.setNull(count, Types.INTEGER);
   }
  }else if(classType.equals("java.math.BigDecimal")){
   if(object != null) {
    ps.setBigDecimal(count, (BigDecimal)object);
   }else{
    ps.setNull(count, Types.NUMERIC);
   }
  }else if(classType.equals("java.lang.String")){
   if(object != null) {
    ps.setString(count, (String)object);
   }else{
    ps.setString(count, null);
   }
  }else if(classType.equals("java.util.Date")) {
   if(object!=null){
    long time = ((java.util.Date)object).getTime();
    ps.setDate(count, new java.sql.Date(time));
   }else{
    ps.setDate(count, null);
   }
  }else{
   ps.setObject(count, object);
  }
 }

 /**
  * 把数据从数据取出来
  * @param rs
  * @param clazz
  * @param count
  * @param columnName
  * @return
  * @throws Exception
  * @author
  */
 private final Object getObjectValue(ResultSet rs, Class clazz, int count, String columnName) throws Exception {
  Object fieldValue = null;
  log.debug("columnName is " + columnName + " count is " + count);
  if(columnName != null) {
   if("rownum".equals(columnName)) {
    fieldValue = new Long(rs.getLong(count));
   }else if("rownum_".equals(columnName)) {
    fieldValue = new Long(rs.getLong(count));
   }else if("count_".equals(columnName)) {
    fieldValue = new Long(rs.getLong(count));
   }else{
    String classType = clazz.getDeclaredField(columnName).getType().getName();

    if(classType.equals("java.lang.Integer")){
     fieldValue =new Integer( rs.getInt(count));
    }else if(classType.equals("java.lang.Long")) {
     fieldValue =new Long( rs.getLong(count));
    }else if(classType.equals("java.math.BigDecimal")){
     fieldValue = rs.getBigDecimal(count);
    }else if(classType.equals("java.lang.String")){
     fieldValue = rs.getString(count);
    }else if(classType.equals("java.util.Date")) {
     java.sql.Date date = rs.getDate(count);
     if(date!= null){
      fieldValue = new java.util.Date(date.getTime());
     }
    }else{
     fieldValue = rs.getString(count);
    }
   }
  }
  return fieldValue;
 }


}
分享到:
评论

相关推荐

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

    在一个项目中只使用一个DAO类,可能意味着所有的数据库操作都被集中管理。这可能会导致代码复用性降低,但如果设计得当,可以减少代码量并简化数据库交互。 Ajax是异步JavaScript和XML的缩写,允许网页在不刷新整个...

    IBATISDAO库类操作

    总的来说,`IBATISDAO`库类为Java开发者提供了一种简洁、高效的数据库操作方式,它结合了IBATIS的灵活性和DAO模式的封装性,使得数据库操作变得更加简单和可控。在实际项目中,正确理解和运用`IBATISDAO`库类,可以...

    DAO模式数据库操作源代码

    本例子是自己做的,,有很强的可读性。。代码使用率高。是用DAO模式设计的, 实现了对数据库的添加、删除、查询、更新等操作。。不懂的可以联系我:qq:420804832

    Hibernate_通用DAO模式,一个写好的dao层

    在实际应用中,除了基本的DAO操作,还可能扩展了分页查询、事务管理、缓存支持等功能,以满足更复杂的需求。 总的来说,这个资源为开发者提供了一个高效的工具,通过使用Hibernate和通用DAO模式,可以快速构建数据...

    几个老外写的ado,dao,odbc数据库操作类的vc代码

    标题中的“ado,dao,odbc数据库操作类的vc代码”揭示了这些代码库主要涉及在Visual C++(VC)环境中使用不同的数据库访问技术,包括ActiveX Data Objects (ADO), Data Access Objects (DAO),以及Open Database ...

    自己用的DAO实现类

    在本压缩包中,只有一个名为"dao"的文件,可能是包含了一个或多个DAO实现类的Java源代码文件。这些类通常会对应数据库中的表,每个类负责一个特定的数据操作,如增删改查。下面将详细介绍DAO实现类可能涉及的一些...

    数据库dao操作jdbc

    DAO设计模式的核心思想是创建一个接口或抽象类,代表特定的数据对象,然后实现这个接口或抽象类来处理与数据库的交互。在Java中,通常会为每个数据库表创建一个DAO类,用于执行CRUD(Create、Read、Update、Delete)...

    SSH中通用dao类

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

    泛型dao 泛型dao 泛型dao

    } 告诉对哪个类操作,如不需要自定义扩展方法就作有一个构造方法。 泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层...

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

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

    完整的数据库操作类

    "完整的数据库操作类"是一个设计用于简化数据库交互的软件组件。这个类库包含了处理数据库中的数据所需的所有基本功能,包括添加(Insert)、删除(Delete)、更新(Update)和查询(Select),以及执行存储过程...

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

    在Java编程语言中,DAO(Data Access Object)类是一个重要的设计模式,主要用于处理数据库操作。这个模式将数据访问逻辑封装起来,使得业务层代码与数据存储细节相分离,提高了代码的可重用性和可测试性。本文将...

    DAO模式写的一个小的购物车程序

    使用DAO模式实现的简单的购物车的添加,修改操作

    一个简单的DAO例子

    通常,一个DAO类会包含对数据库的CRUD(Create、Read、Update、Delete)操作。例如,假设我们正在创建一个用户管理系统的DAO,可能会有如下方法: 1. `createUser(User user)`: 用于插入新的用户记录。 2. `...

    JAVA Dao 数据库操作

    - 接着,创建一个实现了该接口的类,通常会为每个表创建一个对应的DAO实现类,比如`NewsDAOImpl`。 2. **JDBC基础**: - JDBC(Java Database Connectivity)是Java访问数据库的标准API,包括加载驱动、建立连接...

    一个很好的通用泛型dao(含源码)

    为什么我们要使用通用DAO接口呢,因为我们的数据库操作无非是增删改查,CRUD操作,我们不需要为每个实体去编写一个dao接口,对于相似的实体操作可以只编写一个通用接口,然后采用不同的实现! DAO已经成为持久层...

    Eclipse 插件 生成dao层实现类 和服务层 action等

    生成struts2 dwr spring 配置文件和数据操作类(com.comm 中BaseDao) idao层 dao层的实现类 Service 层和IService层 总的情况为 src 下有 com.comm BaseDao com.idao pojo所在的类的接口 com.daoimlp pojo所在...

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

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

    数据库Dao封装类

    数据库Dao(Data Access Object)封装类是软件开发中一个重要的设计模式,特别是在Java或类似的面向对象编程语言中,用于处理数据库交互。 Dao层是MVC(Model-View-Controller)架构的一部分,它作为业务逻辑层与...

    自己写一个DAO 实现对jdbc dbcp封装 开源小组件

    本组件"自己写的一个DAO 实现对jdbc dbcp封装 开源小组件"是作者学习研究的成果,适用于小型项目,同时也是初学者了解和实践DAO设计模式、JDBC以及Apache DBCP连接池的好材料。 1. JDBC(Java Database ...

Global site tag (gtag.js) - Google Analytics