ORM基於反射的簡單實現

[size=x-large]1.寫在前面[/size]
前幾天聽胡老師講了反射,本來想做個對ajax的框架的,像dwr那樣,不過....額.....能力不夠。所以做了個類似Hibernate的東西。以下是對save方法的簡單實現

[size=x-large]2.思路[/size]
a.前提:
數據庫中的表名必須與對象的名字一致
表格屬性必須與對象屬性在內容和類型上保持一致(屬性名最大首字母大寫,原因嘛...)
對象中必須寫好相關的get和set方法
b.獲得傳入對象的類,利用反射解析出類的:
classname:作爲表名
fieldname:作爲表格屬性名
c.利用屬性名獲得相應屬性的get方法,取得相應屬性的值
d.將表名,屬性名,相應屬性的值組裝成sql的字符串語句,根據數據類型不同,值得字符串形式也有不同。
e.執行語句

[size=x-large]
3.代碼:[/size]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);
}


----the end----
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章