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----
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值