package com.huawei.common;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface CallBack {
	void execute(ResultSet rs) throws SQLException;
}
package com.huawei.utils;
import java.lang.reflect.Field;
import com.huawei.domain.Address;
import com.huawei.domain.Users;
/**
 * bean 工具
 * @author Administrator
 *
 */
public class BeanUtil {
	/**
	 * 获取set方法名
	 * 获取标名
	 * @param clazz
	 */
	public static String getTableName(Class<?> clazz){
		//获取类名
		String name = clazz.getSimpleName();
		name = name.substring(0, 1).toLowerCase()+name.substring(1);
		return name;
	}
	
	/**
	 * @param field
	 * @return
	 */
	public static String setter(Field field){
		String name = field.getName();
		return "set"+name.substring(0,1).toUpperCase()+name.substring(1);
	}
	public static String getter(Field field){
		String name = field.getName();
		return "get"+name.substring(0,1).toUpperCase()+name.substring(1);
	}
	
	public static void main(String[] args) {
		System.out.println(getTableName(Address.class));
	}
	
	public static String getColumnName(Field field){
		String name = field.getName();
		return name.substring(0,1).toLowerCase()+name.substring(1);
	}
}
package com.huawei.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @author Administrator
 *
 */
public class DBUtil {
	
	/**
	 * 得到数据库连接
	 * @return
	 */
	public static Connection getConnection(){
		//显示加载驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
			return connection;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 
	 * 释放资源
	 * @param objects
	 */
	public static void close(Object ...objects){
		if(objects!=null && objects.length>0){
			try {
				for(Object o:objects){
					if(o instanceof ResultSet){
						((ResultSet)o).close();
					}else if(o instanceof Statement){
						((Statement)o).close();
					}else if(o instanceof Connection){
						((Connection)o).close();
					}
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		System.out.println(getConnection());
	}
}
package com.huawei.base;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
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.Arrays;
import java.util.List;
import com.huawei.common.CallBack;
import com.huawei.domain.Users;
import com.huawei.utils.BeanUtil;
import com.huawei.utils.DBUtil;
/**
 * @author Administrator
 * 
 * 
 * void executeQuery(String sql,Object[] parmas,CallBack callback)		通用的查询
 * void executeUpdate(String sql,Object[] parmas)	//通用的执行
 * 
 * List<Object> findAll()	//查询全部
 * Object findOne(Integer id)	//根据id查询一个
 * 
 * void save(Object o)	//给定一个对象   然后存储到数据库
 * 
 * void update(Object o)	//根据一个对象  更新数据库中所对应的字段
 * 
 * void delete(Object o)	//根据一个对象删除数据库中  对应的记录
 * void deleteById(Integer id)	//根据传入的id删除
 * void delete(String sql,Object[] params)	//自定义删除
 * 
 * 
 * 
 *
 */
public abstract class BaseDAO1<T,ID extends Serializable> {
	
	
	//目标类   用于  反射
	protected Class<T> clazz;
	@SuppressWarnings("unchecked")
	public BaseDAO1() {
		ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
		//得到类上面的泛型参数的实际类型
		clazz =  (Class<T>) type.getActualTypeArguments()[0];
	}
	/**
	 * 通用的查寻方法
	 * @param sql	给定一个sql语句
	 * @param params	给定与sql语句中相对应的参数
	 * @param callBack	用于处理结果集的回调函数
	 */
	public void executeQuery(String sql,Object []params,CallBack callBack){
		
		Connection connection = DBUtil.getConnection();
		
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = connection.prepareStatement(sql);
			//处理参数
			if(params!=null && params.length>0){
				for(int i=0;i<params.length;i++){
					ps.setObject(i+1, params[i]);
				}
			}
			System.out.println("ORM:"+sql);
			rs = ps.executeQuery();
			//处理业务逻辑
			callBack.execute(rs);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DBUtil.close(rs,ps,connection);
		}
		
	}
	
	/**
	 * 除了查询以外 的所有操作
	 * @param sql	给定一个sql语句
	 * @param params 参数
	 */
	public void executeUpdate(String sql,Object []params){
		Connection connection = DBUtil.getConnection();
		PreparedStatement ps = null;
		try {
			ps = connection.prepareStatement(sql);
			//处理参数
			if(params!=null && params.length>0){
				for(int i=0;i<params.length;i++){
					ps.setObject(i+1, params[i]);
				}
			}
			System.out.println("ORM:"+sql);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			DBUtil.close(ps,connection);
		}
	}
	
	/**
	 * 通用查询
	 * @param sql
	 * @param params
	 * @return
	 */
	public List<T> find(String sql,Object []params){
		
		final List<T> result = new ArrayList<T>();
		this.executeQuery(sql, params, new CallBack() {
			
			@Override
			public void execute(ResultSet rs) throws SQLException {
				//处理结果
				try {
					//得到虚拟表的 结构信息
					ResultSetMetaData rsmd = rs.getMetaData();
					while(rs.next()){
						//每一行代表一个对象
						T o = clazz.newInstance();
						//每一个单元格  代表对象中的一个属性
						for(int i=0;i<rsmd.getColumnCount();i++){
							//得到列明
							String column_name = rsmd.getColumnName(i+1);
							//根据列名去得到 clazz中的  属性
							Field field = clazz.getDeclaredField(column_name);
							//得到 set方法  setUsername(String name)
							Method method = clazz.getDeclaredMethod(BeanUtil.setter(field), field.getType());
							method.invoke(o, rs.getObject(column_name));
						}
						result.add(o);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		return result;
	}
	
	/**
	 * 查找全部
	 * @return	返回一个结果集
	 */
	public List<T> findAll(){
		//存储结果集
		String sql = "SELECT * FROM "+BeanUtil.getTableName(clazz);
		return this.find(sql, null);
	}
	
	public T findById(ID id){
		String sql = "SELECT * FROM "+BeanUtil.getTableName(clazz) +" WHERE id=?";
		List<T> result = this.find(sql, new Object[]{id});
		return result.size()>0?result.get(0):null;
	}
	
	public List<T> findBy(String prop,Object param){
		String sql = "SELECT * FROM "+BeanUtil.getTableName(clazz) +" WHERE "+prop+"=?";
		return this.find(sql, new Object[]{param});
	}
	
	/**
	 * 将给定的对象  持久化到数据库
	 * @param o	被持久化对象
	 */
	public void save(T o){
		StringBuilder sb = new StringBuilder("INSERT INTO "+BeanUtil.getTableName(clazz)+" (");
		StringBuilder values = new StringBuilder(" VALUES (");
		//存储参数
		List<Object> params = new ArrayList<Object>();
		//得到所有的属性
		Field []fields = clazz.getDeclaredFields();
		try{
			for(Field field:fields){
				sb.append(BeanUtil.getColumnName(field)).append(",");
				values.append("?,");
				Method method = clazz.getDeclaredMethod(BeanUtil.getter(field));
				//得到属性的值
				params.add(method.invoke(o));
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		//处理sql语句
		sb.deleteCharAt(sb.length()-1).append(")");
		values.deleteCharAt(values.length()-1).append(")");
		sb.append(values);
		this.executeUpdate(sb.toString(), params.toArray());
	}
	
	
	
	/**
	 * 更新  更新的对象中  一定要包含id
	 * @param o
	 */
	public void update(T o){
		StringBuilder sb = new StringBuilder("UPDATE "+BeanUtil.getTableName(clazz)+" SET ");
		//存储参数
		List<Object> params = new ArrayList<Object>();
		//得到所有的属性
		Field []fields = clazz.getDeclaredFields();
		
		Object id = null;
		
		try{
			for(Field field:fields){
				//UPDATE USERS SET USERNAME=?,PASSWORD=?
				String name = BeanUtil.getColumnName(field);
				Method method = clazz.getDeclaredMethod(BeanUtil.getter(field));
				//得到属性的值
				
				Object value = method.invoke(o);
				
				if("id".equals(name)){
					id = value;
					continue;
				}
				sb.append(name+"=?").append(",");
				params.add(value);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		//处理sql语句
		sb.deleteCharAt(sb.length()-1).append(" WHERE id=?");
		if(id==null){
			System.out.println("ID不能为空");
			return;
		}
		params.add(id);
		this.executeUpdate(sb.toString(), params.toArray());
		
	}
	
	@SuppressWarnings("unchecked")
	public void delete(ID id){
		//动态创建泛型数组
		ID []ids = (ID[])Array.newInstance(id.getClass(), 1);
		ids[0] =id;
		this.delete(ids);
	}
	
	@SuppressWarnings("unchecked")
	public void delete(T o){
		try {
			ID id = (ID)this.clazz.getDeclaredMethod("getId").invoke(o);
			if(id!=null){
				this.delete(id);
				return ;
			}
			System.out.println("ID不能为空");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void delete(ID[] ids){
		String sql = "DELETE FROM "+BeanUtil.getTableName(clazz) + " WHERE id in (?)";
		this.executeUpdate(sql, ids);
	}
	
	public void delete(String sql,Object[] params){
		this.executeUpdate(sql, params);
	}
}
原文:http://www.cnblogs.com/hwgok/p/5858462.html