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----

orm

相关推荐