简单数据库操作类

来源:互联网 发布:newblue mac 编辑:程序博客网 时间:2024/06/05 22:59

package xl.dao;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BaseDAO {
 //数据库连接对象
 protected Connection conn=null;
 //数据库操作对象
 protected PreparedStatement pstmt=null;
 //结果集对象
 protected ResultSet rs=null;
 
 //获得数据库连接
 protected Connection getConn(){
  try {
   Context context=new InitialContext();
   Context envCtx=(Context)context.lookup("java:comp/env");
   DataSource dataSource=(DataSource)envCtx.lookup("jdbc/sqlserver");
   conn=dataSource.getConnection();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return conn;
 }
 
 
 /*
  * 公共查询方法返回集合
  */
 
 public List querSqls(String objectDTO,String strSql,Object [] prep){
  //此数组用于存放所有列名
  String [] columnNames=null;
  //此数组用于存放所有set方法名
  String [] methodNames=null;
  ResultSetMetaData meta;
  //存放需要返回的对象
  List<Object> list=new ArrayList<Object>();
  
  Map map=new HashMap();
  try{
   conn=this.getConn();
   
   pstmt=conn.prepareStatement(strSql);
   if(prep!=null){
    for(int i=0;i<prep.length;i++){
     pstmt.setObject(i+1, prep[i]);
    }
   }
    
   rs=pstmt.executeQuery();
   
   meta=rs.getMetaData();
   int columnCount=meta.getColumnCount();
   //分别初始化两个数组
   columnNames=new String[columnCount];
   methodNames=new String[columnCount];
   //获得每列的列名
   for(int i=0;i<columnCount;i++){
    columnNames[i]=meta.getColumnName(i+1);
   }
   
   while(rs.next()){   
    String columnName=null;
    Object objValue=null;
    //查询生成的列名与值存入map中
    for(int i=0;i<columnCount;i++){
     columnName=columnNames[i];
     objValue=rs.getObject(columnName);
     map.put(columnName, objValue);
    }
    
    //使用实体类名生成实体类
    Class cl=Class.forName(objectDTO);
    Object object=cl.newInstance();
    
    //获得实体类的所有字段
    Field [] field=object.getClass().getDeclaredFields();
    //获得每个字段的名称和set方法
    for(int i=0;i<field.length;i++){
     String str=field[i].getName();
     String methodstr="set"+str.substring(0,1).toUpperCase()+str.substring(1);
     methodNames[i]=methodstr;
    }
    //设置bean的值
    for(int i=0;i<methodNames.length;i++){
     Method method=null;
     
     if(field[i].getType().getName().equals("java.lang.String")){
      method=object.getClass().getMethod(methodNames[i],String.class);
      method.invoke(object, map.get(columnNames[i]));
     }
     if(field[i].getType().getName().equals("int")){
      method=object.getClass().getMethod(methodNames[i],int.class);
      method.invoke(object, map.get(columnNames[i]));
     }
    }
    list.add(object);
    map.clear();
   }
  }catch(Exception ex){
   ex.printStackTrace();
  }finally{
   close();
  }
  return list;
 }
 }

原创粉丝点击