利用反射与接口访问数据库的区别

今天上课,老师讲了一个很小的通用性的访问数据库和程序,主要是利用反射,写了一个数据库类,进行增删改查……

 下面是代码:

public class CommonDao {
	
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;
	
	
	public boolean add(Object obj){
		StringBuffer sql = new StringBuffer("insert into ");
		Class cls = obj.getClass();
		String tableName = cls.getSimpleName().toLowerCase();
		sql.append(tableName+"(");
		System.out.println(tableName);
	
		ArrayList values = new ArrayList();
		
		Field[] fs = cls.getDeclaredFields();
		for(int i=0;i<fs.length;i++){
			
			String colName = fs[i].getName().toLowerCase();
			if(!colName.equals("id")){
				
				
				String methodName = "get"+
				fs[i].getName().substring(0, 1).toUpperCase()+
				fs[i].getName().substring(1);
				Method m = null;
				Object value = null;
				try {
					m = cls.getDeclaredMethod(methodName, null);
					value = m.invoke(obj, null);
				} catch (Exception e) {
					e.printStackTrace();
				} 
				
				values.add(value);
				
				if(i<fs.length-1){
					sql.append(colName+", ");
				}else{
					sql.append(colName+") values(");
				}
			}
		}
		
		for (int i=0;i<values.size();i++){
			Object value = values.get(i);
			if(i<values.size()-1){
				sql.append("?, ");
			}else{
				sql.append("?)");
			}
		}
		
		
		System.out.println(sql.toString());
		//保存user
		try {
			con = DBUtil.getConnection();
			ps = con.prepareStatement(sql.toString());
			for (int i=0;i<values.size();i++){
				Object value = values.get(i);
//				if(value instanceof java.util.Date){
//					
//				}
				Class c = value.getClass();
				if(c.getName().equals("java.util.Date")){
					Date d = (Date)value;
					java.sql.Date sd = new java.sql.Date(d.getTime());
					value = sd;
				}
				ps.setObject(i+1, value);
			}
			
			return ps.executeUpdate()>0?true:false;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally{
			DBUtil.close(con);
		}
	}
	
	public boolean update(Object obj){
		//修改user
		return false;
	}
	
	public Object findById(int id,Class cls){
		return null;
	}
	
	public List find(Class cls){
		
		return null;
	}
	
	public boolean deleteById(int id,Class cls){
		
		return false;
	}
	
	public static void main(String[] args) {
		UserInfo user = new UserInfo("admin","123456");
		ProductInfo pro = new ProductInfo("杯具",20.8,new Date());
		EmployeeInfo emp = new EmployeeInfo("张三",3000.00,new Date(),"销售部门");
		
		CommonDao dao = new CommonDao();
		dao.add(emp);
		
		dao.findById(1, UserInfo.class);
		
	
	}

}


看看代码确实觉得不错,通用性很强,下课后问老师,这样代码通用性看似很强,跟我以前学的老是提倡用面向接口编程,不同……

老师,这个通用性并不是很强,只适用于一个数据库,当需要数据库转移的时候,就不能了,这样就需要使用接口,针对每一种数据库操作都需要写一个接口实现,数据库转移的时候,就不需要重写了……

 

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangbiao86/article/details/6877418
个人分类: javase例题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭