zoukankan      html  css  js  c++  java
  • 通用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) {
    		
    	}
    	
    	
    }
    

      

  • 相关阅读:
    Apache Tomcat Ajp CVE-2020-1938漏洞复现
    关于JDK高版本下RMI、LDAP+JNDI bypass的一点笔记
    javaweb-codereview 学习记录-5
    java 动态代理机制
    关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-2
    关于<Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)>看后的一些总结-1
    javaweb-codereview 学习记录-4
    从0到1掌握某Json-TemplatesImpl链与ysoserial-jdk7u21的前因后果
    javaweb-codereview 学习记录-2
    javaweb-codereview 学习记录-1
  • 原文地址:https://www.cnblogs.com/airycode/p/4821252.html
Copyright © 2011-2022 走看看