利用反射机制查询数据库内数据,数据库内数据库类型为类型时

在数据库内数据类型为datetime类型,在创建实体类型属性时,属性设为Timestamp类型

/**BaseDao内容为**/

package com.lzcc.google_007.base.dao;

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.List; import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

/**  * @author wqj  *所有DAO实现类,定义基本的数据库访问操作  */

package com.lzcc.google_007.base.dao;

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.List;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

/**
 * @author wqj
 *所有DAO实现类,定义基本的数据库访问操作
 */
public class BaseDao {
 private static Properties pro = null;
 
 public static void setPro(Properties pro){
  BaseDao.pro = pro;
 }
 
 /**获取连接
  * @return
  * @throws Exception
  * @author wqj
  */
 protected Connection getConnection() throws Exception{
  DataSource ds = BasicDataSourceFactory.createDataSource(pro);
  return ds.getConnection();
 }
 
 /** 查询的方法
  * @param sql 查询语句,可带“?”占位符
  * @param oList “?”号占位符需要填充的值
  * @param clazz  封装数据的类
  * @return 以封装好数据后
  * @throws Exception
  * @author wqj
  */
 protected <T> List<T> select(String sql, List<Object> oList, Class<T> clazz) throws Exception{
  // 创建返回的list集合
  List<T> list = new ArrayList<T>();
  
  Connection conn = getConnection();
  
  PreparedStatement ps = conn.prepareStatement(sql);
  
  // 给SQL语句中的?号赋值
  for (int i = 0; oList != null && i < oList.size(); i++) {
   ps.setObject(i + 1, oList.get(i));
  }
  
  // 执行查询方法
  ResultSet rs = ps.executeQuery();
  
  // 获取结果集中的元数据
  ResultSetMetaData rsmd = rs.getMetaData();
  
  // 遍历保存数据库中对应表的列名
  List<String> columnList = new ArrayList<String>();
  for (int i = 0; i < rsmd.getColumnCount(); i++) {
   columnList.add(rsmd.getColumnName(i + 1));
  }
  // 循环遍历记录
  while(rs.next()){// 每次获取表中对应的一条记录
   // 创建封装记录的对象
   T obj = clazz.newInstance();
   // 遍历一个记录中的所有列
   for (int i = 0; i < columnList.size(); i++) {
    // 获取列名
    String column = columnList.get(i);
    // 根据列名创建set方法
    String setMethd = "set" + column.substring(0, 1).toUpperCase() + column.substring(1);
    // 获取clazz中所有方法对应的Method对象
    Method[] ms = clazz.getMethods();
    
    // 循环遍历ms
    for (int j = 0; j < ms.length; j++) {
     // 获取每一个method对象
     Method m = ms[j];
     // 判断m中对应的方法名和数据库中列名创建的set方法名是否形同
     if(m.getName().equals(setMethd)){
      // 反调set方法封装数据
      m.invoke(obj, rs.getObject(column));// 获取rs中对应的值,封装到obj中
      break; //提高效率
     }
    }
   }
   // 封装好的一条记录对应的对象放入list集合中
   list.add(obj);
  }
  // 关闭资源
  close(rs, ps, conn);
  
  return list;
 }
 
 /** 执行增、删、改方法
  * @param sql
  * @param oList
  * @return
  * @throws Exception
  * @author wqj
  */
 public int executeUpdate(String sql, List<Object> oList) throws Exception{
  int rowCount = -1;
  
  Connection conn = this.getConnection();
  
  PreparedStatement ps = conn.prepareStatement(sql);
  
  if(oList != null && oList.size() > 0){
   for (int i = 0; i < oList.size(); i++) {
    ps.setObject(i + 1, oList.get(i));
   }
  }
  
  rowCount = ps.executeUpdate();
  
  close(null, ps, conn);
  
  return rowCount;
  
 }
 
 /**关闭资源
  * @param rs
  * @param ps
  * @param conn
  * @throws SQLException
  * @author wqj
  */
 public void close(ResultSet rs, PreparedStatement ps, Connection conn) throws SQLException{
  if(rs != null){
   rs.close();
   rs = null;
  }
  if(ps != null){
   ps.close();
   ps = null;
  }
  if(conn != null){
   conn.close();
   conn = null;
  }
 }
}

 

你可能感兴趣的:(利用反射机制查询数据库内数据,数据库内数据库类型为类型时)