通用Dao方法

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;

public class RDao {

	
	/**
	 * 通过表明获取数据库中表的列明
	 * @param tableName
	 * @return
	 */
	public ArrayList<String> getAllColumn(String tableName){
		ArrayList<String> ar = new ArrayList<String>();
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		//1=2不成立只能查出来列明
		String sql = "select * from "+tableName+" where 1=2";
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			ResultSetMetaData metedata = rs.getMetaData();
			int colum = metedata.getColumnCount();
			for (int i=1;i<=colum;i++) {
				String columnName = metedata.getColumnName(i);
				ar.add(columnName);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps, rs);
		}
		
		return ar;
	}
	/**
	 * 通过元数据获得数据列明,数据类型等
	 * 
	 * 两者的区别R可以获得SQL语句查询出来的所有的列明
	 * D只可以获取单表列明以及列的所有的属性
	 * 
	 * @param tableName
	 * @return
	 */
	public ArrayList<String> getAllColumns(String tableName){
		ArrayList<String> ar = new ArrayList<String>();
		Connection  conn = BaseConnection.getConnection();
		ResultSet rs = null;
		try {
			//数据库元数据对象,就是数据库数据对象
			DatabaseMetaData dbm = conn.getMetaData();
		    rs = dbm.getColumns(null, "%", tableName, "%");
			while (rs.next()) {
				String columnName = rs.getString("COLUMN_NAME");
				String columnType = rs.getString("TYPE_NAME");
				String datasize = rs.getString("COLUMN_SIZE");
				String digits = rs.getString("DECIMAL_DIGITS");
				String nullable = rs.getString("NULLABLE");
				ar.add(columnName);
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, rs);
		}
		
		return ar;
		
	}
	
	public boolean insert(Object ob){
		boolean b = false;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		
		
		Class cl = ob.getClass();
		
		Field[] fi = cl.getDeclaredFields();
		
		ArrayList<String >col = getAllColumn(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		StringBuffer sb1 = new StringBuffer();
		
		sb.append("insert into ");
		sb.append(cl.getSimpleName());
		sb.append("(");
		for (int i=1;i<col.size();i++) {
			sb.append(col.get(i));
			sb1.append("?");
			if (i != col.size()-1) {
				sb.append(",");
				sb1.append(",");
			}
		}
		sb.append(")values(");
		sb.append(sb1);
		sb.append(")");
		
		try {
			ps = conn.prepareStatement(sb.toString());
			for (int i=1;i<col.size();i++) {
				for (Field ff:fi) {
					if (ff.getName().equals(col.get(i))) {
						ff.setAccessible(true);
						ps.setObject(i, ff.get(ob));
						break;
						
					}
				}
			}
			
			int a = ps.executeUpdate();
			if (a > 0) {
				b = true;
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps);
		}
		
		return b;
	}
	
	//需求是现在有一个表,这个表是一个订单表(订单号,订单时间,订单人)
	//                             33  20150101 zhang
	//                       从表订单详细表     编号     订单号  商品名 数量
	//                                   1    33   ku 2
	//                                   2    33   qun 3
	//依次订单有好多数据,我们插入数据的时候就是先插入订单表,然后再插入订单详细表,再插入订单详细表的时候你是需要订单表中的订单号的。
	
	public int insertGetKey(Object ob) {
		
		int id = 0;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		Class cl = ob.getClass();
		
		Field[] fi = cl.getDeclaredFields();
		
		ArrayList<String >col = getAllColumn(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		StringBuffer sb1 = new StringBuffer();
		
		sb.append("insert into ");
		sb.append(cl.getSimpleName());
		sb.append("(");
		for (int i=1;i<col.size();i++) {
			sb.append(col.get(i));
			sb1.append("?");
			if (i != col.size()-1) {
				sb.append(",");
				sb1.append(",");
			}
		}
		sb.append(")values(");
		sb.append(sb1);
		sb.append(")");
		
		try {
			ps = conn.prepareStatement(sb.toString());
			for (int i=1;i<col.size();i++) {
				for (Field ff:fi) {
					if (ff.getName().equals(col.get(i))) {
						ff.setAccessible(true);
						ps.setObject(i, ff.get(ob));
						break;
						
					}
				}
			}
			
			int a = ps.executeUpdate();
			if (a > 0) {
				////获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
				rs = ps.getGeneratedKeys();
				if (rs.next()) {
					id = rs.getInt(1);
				}
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps);
		}
		
		return id;
		
		
	}
	
	//删除自己写根据id删除
	
	public boolean deleteById(Class cl,int id) {
		
		boolean b = false;
		
		Object ob = null;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		
		
		Field[] fi = cl.getDeclaredFields();
		//获得表中的所有列
		ArrayList<String> col = getAllColumns(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		sb.append("delete ");
		
		sb.append("from ");
		sb.append(cl.getSimpleName());
		sb.append("where");
		sb.append(col.get(0));
		sb.append("?");
		
		try {
			ps = conn.prepareStatement(sb.toString());
			ps.setInt(1, id);
			int a = ps.executeUpdate();
			
			if (a>0) {
				b = true;
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps);
		}
		
		return b;
		
	}
	
	
	
	
	
	
	/**
	 * 这个方法是不需要的,没有意义,直接忘记,还获取不到值
	 * @param ob
	 * @return
	 */
	public int updateGetKey(Object ob){
		int id = 0;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		Class cl = ob.getClass();
		
		Field[] fi = cl.getDeclaredFields();
		
		ArrayList<String >col = getAllColumn(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("update ");
		sb.append(cl.getSimpleName());
		sb.append(" set");
		
		for (int i=1;i<col.size();i++) {
			sb.append(col.get(i));
			sb.append("?");
			if (i != col.size()-1) {
				sb.append(",");
				
			}
		}
		
		sb.append(" where");
		sb.append(col.get(0));
		sb.append("=?");
		
		
		try {
			ps = conn.prepareStatement(sb.toString());
			for (int i=1;i<col.size();i++) {
				for (Field ff:fi) {
					if (ff.getName().equals(col.get(i))) {
						ff.setAccessible(true);
						ps.setObject(i, ff.get(ob));
						break;
						
					}
				}
			}
			
			fi[0].setAccessible(true);
			ps.setObject(col.size(), fi[0].get(ob));
			int a = ps.executeUpdate();
			if (a > 0) {
				//获得主键,主键必须是递增,还有必须是添加的方法才能获得主键
				rs = ps.getGeneratedKeys();
				if (rs.next()) {
					id = rs.getInt(1);
				} 
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps);
		}
		
		
		return id;
	}
	
	public boolean update(Object ob){
		boolean b = false;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		
		Class cl = ob.getClass();
		
		Field[] fi = cl.getDeclaredFields();
		
		ArrayList<String >col = getAllColumn(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("update ");
		sb.append(cl.getSimpleName());
		sb.append(" set");
		
		for (int i=1;i<col.size();i++) {
			sb.append(col.get(i));
			sb.append("?");
			if (i != col.size()-1) {
				sb.append(",");
				
			}
		}
		
		sb.append(" where");
		sb.append(col.get(0));
		sb.append("=?");
		
		
		try {
			ps = conn.prepareStatement(sb.toString());
			for (int i=1;i<col.size();i++) {
				for (Field ff:fi) {
					if (ff.getName().equals(col.get(i))) {
						ff.setAccessible(true);
						ps.setObject(i, ff.get(ob));
						break;
						
					}
				}
			}
			
			fi[0].setAccessible(true);
			ps.setObject(col.size(), fi[0].get(ob));
			int a = ps.executeUpdate();
			if (a > 0) {
				b = true;
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps);
		}
		
		
		return b;
	}
	
	/**
	 * 
	 * @param cl
	 * @param name 数据库中的列明
	 * @param value
	 * @return
	 */
	public ArrayList getListByLike(Class cl,String name,Object value) {
		
		ArrayList ar = new ArrayList();
		Connection conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		Field[] fi = cl.getDeclaredFields();
		ArrayList<String> col = getAllColumns(cl.getName());
		StringBuffer sb = new StringBuffer();
		sb.append("select ");
		for (int i=0;i<col.size();i++) {
			sb.append(col.get(i));
			if (i != col.size()-1) {
				sb.append(",");
			}
		}
		
		sb.append(" from");
		sb.append(cl.getSimpleName());
		sb.append(" where ");
		sb.append(name);
		sb.append(" like '%");
		sb.append(value);
		sb.append("%'");
		//like 语句不支持占位符
		
		try {
			ps = conn.prepareStatement(sb.toString());
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Object obj = cl.newInstance();
				for (String str:col) {
					for (Field ff:fi) {
						if (str.equals(ff.getName())) {
							ff.setAccessible(true);
							ff.set(obj, rs.getObject(ff.getName()));
							break;
						}
					}
				}
				
				ar.add(obj);
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps, rs);
		}
		
		
		return ar;
		
		
		
		
	}
	
	/**
	 * 该方法用于所有的查询
	 * 注意:尽量保证链接表中数据 除了主外键关联的外,尽量不要使用重复的表列名
	 * @param 查询出来的数据放到那个类中 实体类中
	 * @param sql 查询的sql语句
	 * @param obs 所有的条件
	 * @return
	 */
	public ArrayList getListBySqlX(Class cl,String sql,Object[]obs){
		Connection conn = BaseConnection.getConnection();
		ArrayList ar = new ArrayList();
		PreparedStatement ps = null;
		ResultSet rs = null;
		Field[] fi = cl.getDeclaredFields();
		
		ArrayList<String> col = new ArrayList<String>();
		try {
			ps = conn.prepareStatement(sql);
			
			
			//获得数据表中的列
			ResultSetMetaData metaData = rs.getMetaData();
			int column = metaData.getColumnCount();
			for (int i=1;i<=column;i++) {
				String columnName = metaData.getColumnName(i);
				col.add(columnName);
			}
			for (int i=0;i<obs.length;i++) {
				ps.setObject(i+1, obs[i]);
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				Object ob = cl.newInstance();
				for (String str:col) {
					for (Field ff:fi) {
						if (str.equals(ff.getName())) {
							ff.setAccessible(true);
							ff.set(ob, rs.getObject(ff.getName()));
							break;
						}
					}
				}
				ar.add(ob);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally{
			BaseConnection.close(conn, ps, rs);
		}
		return ar;
	}
	
	
	
	
	
	
	
	
	public ArrayList getListBySome(Class cl,String name,Object value) {
		
		ArrayList ar = new ArrayList();
		
		
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		Field[] fi = cl.getDeclaredFields();
		//获得表中的所有列
		ArrayList<String> col = getAllColumns(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		sb.append("select ");
		for (int i=0;i<col.size();i++) {
			sb.append(col.get(i));
			if (i != col.size()-1) {
				sb.append(",");
			}
		}
		sb.append("from ");
		sb.append(cl.getSimpleName());
		sb.append(" where ");
		sb.append(name);
		sb.append(" =? ");
		
		try {
			ps = conn.prepareStatement(sb.toString());
			ps.setObject(1, value);
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Object obj = cl.newInstance();
				for (String str:col) {
					for (Field ff:fi) {
						if (str.equals(ff.getName())) {
							ff.setAccessible(true);
							ff.set(obj, rs.getObject(ff.getName()));
							break;
						}
					}
				}
				
				ar.add(obj);
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps, rs);
		}
		
		
		return ar;
		
		
	}
	
	public Object getObById(Class cl,int id){
		
		Object ob = null;
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		Field[] fi = cl.getDeclaredFields();
		//获得表中的所有列
		ArrayList<String> col = getAllColumns(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		sb.append("select ");
		for (int i=0;i<col.size();i++) {
			sb.append(col.get(i));
			if (i != col.size()-1) {
				sb.append(",");
			}
		}
		sb.append("from ");
		sb.append(cl.getSimpleName());
		sb.append("where");
		sb.append(col.get(0));
		sb.append("?");
		
		try {
			ps = conn.prepareStatement(sb.toString());
			ps.setInt(1, id);
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Object obj = cl.newInstance();
				for (String str:col) {
					for (Field ff:fi) {
						if (str.equals(ff.getName())) {
							ff.setAccessible(true);
							ff.set(obj, rs.getObject(ff.getName()));
							break;
						}
					}
				}
				
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps, rs);
		}
		
		return ob;
		
	}
	
	
	public ArrayList getList(Class cl){
		ArrayList ar = new ArrayList();
		Connection  conn = BaseConnection.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		Field[] fi = cl.getDeclaredFields();
		//获得表中的所有列
		ArrayList<String> col = getAllColumns(cl.getSimpleName());
		
		StringBuffer sb = new StringBuffer();
		
		sb.append("select");
		for (int i=0;i<col.size();i++) {
			sb.append(col.get(i));
			if (i != col.size()-1) {
				sb.append(",");
			}
		}
		
		sb.append("from");
		
		sb.append(cl.getSimpleName());
		
		try {
			ps = conn.prepareStatement(sb.toString());
			rs = ps.executeQuery();
			
			while (rs.next()) {
				Object obj = cl.newInstance();
				for (String str:col) {
					for (Field ff:fi) {
						if (str.equals(ff.getName())) {
							ff.setAccessible(true);
							ff.set(obj, rs.getObject(ff.getName()));
							break;
						}
					}
				}
				ar.add(obj);
				
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}finally {
			BaseConnection.close(conn, ps, rs);
		}
	
		return ar;
	}
	
	public static void main(String[] args) {
		
	}
	
	
}

  

posted on 2015-09-19 12:07  airycode  阅读(264)  评论(0编辑  收藏  举报

导航