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

来源:互联网 发布:3c证书编号 淘宝 编辑:程序博客网 时间:2024/05/16 11:07

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

 下面是代码:

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());//保存usertry {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){//修改userreturn 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);}}


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

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