ORM基于反射的简单实现
1.写在前面
前几天听胡老师讲了反射,本来想做个对ajax的框架的,像dwr那样,不过....额.....能力不够。所以做了个类似Hibernate的东西。以下是对save方法的简单实现
2.思路
a.前提:
数据库中的表名必须与对象的名字一致
表格属性必须与对象属性在内容和类型上保持一致(属性名最大首字母大写,原因嘛...)
对象中必须写好相关的get和set方法
b.获得传入对象的类,利用反射解析出类的:
classname:作为表名
fieldname:作为表格属性名
c.利用属性名获得相应属性的get方法,取得相应属性的值
d.将表名,属性名,相应属性的值组装成sql的字符串语句,根据数据类型不同,值得字符串形式也有不同。
e.执行语句
3.代码:Session.java:
public class Session { public boolean save(Object obj) { //获得对象的class对象 Class c = obj.getClass(); //类名即为表名 String tablename = c.getName(); tablename = tablename.substring(tablename.lastIndexOf(".")+1); //表属性集合 String attributes = "("; //表实体集合 String entities = "("; //获得obj属性对象列表(这样连private的属性也可以获得了) Field[] fields = c.getDeclaredFields(); for(Field f : fields){ String attr = f.getName();//获得属性名 attributes += attr + ",";//组装属性集 Method getter = getMethod(c,"get" + attr,null);//取得属性f的get方法 try{ Object value = getter.invoke(obj);//传入保存对象obj,得到f的值 //类型判断暂只支持int 和 String if(f.getType() == int.class){ entities += value + ","; } else{ entities += "'" + value + "',"; } System.out.println(attr + ":" + value); }catch(Exception e){ System.out.println("方法调用时:"); e.printStackTrace(); } } //去掉最后的一个逗号 attributes = attributes.substring(0, attributes.lastIndexOf(",")); attributes += ")"; entities = entities.substring(0, entities.lastIndexOf(",")); entities += ")"; System.out.println(attributes); System.out.println(entities); //拼接SQL语句 String sql = "insert into "+ tablename+ " " + attributes + " values " + entities; System.out.println(sql); try{ //通过连接获得PreparedStatement PreparedStatement ps = ConnFactory.getConn().prepareStatement(sql); //执行语句 if(ps.executeUpdate() > 0){ return true; } }catch(Exception e){ System.out.println("sql语句执行时:"); e.printStackTrace(); } return false; } /** * 获取方法 * @param c :方法所在类 * @param methodName 方法名 * @param params 参数类型 * @return */ private Method getMethod(Class c,String methodName,Class[] params){ Method m = null; try{ //得到类的方法对象 m = c.getMethod(methodName, params); }catch(Exception e){ e.printStackTrace(); } return m; }
student.java:
public class Student { private int ID; private String Name; public int getID() { return ID; } public void setID(int iD) { ID = iD; } public String getName() { return Name; } public void setName(String name) { Name = name; } }
main:
public static void main(String args[]){ Student st = new Student(); st.setID(1); st.setName("SwineX"); Session session = new Session(); session.save(st); }
----theend----
相关推荐
技术之博大精深 2020-10-16
jimgreatly 2020-08-03
Lingforme 2020-07-18
chenjiazhu 2020-07-08
Yort 2020-06-28
zry 2020-06-28
技术之博大精深 2020-06-10
Lingforme 2020-06-10
jediaellu 2020-06-02
PengQ 2020-06-01
jediaellu 2020-05-31
Danialzhou 2020-05-30
shawroad 2020-05-30
tlsmile 2020-05-28
jediaellu 2020-05-28