JAVA描述的简单ORM框架
代码路径:https://github.com/m2492565210/java_orm自行下载
框架的类结构如下,anno包下注解和MODEL类结合用于定义数据库结构。MyORM类是工具类,获取工厂SESSIONFACTORY,工厂资源采用单例模式,目前没有考虑线程安全。使用工厂获取SESSION,利用SESSION类是数据库直接执行者,通过传入MODEL完成数据库读写。时间有限,SESSION方法中只是完成写数据库语句,并没有真正进行数据库操作。

测试类中有SESSION的使用方法,如下。
@Test
public void test() throws ClassNotFoundException, SQLException, IOException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
Session ss = MyORM.getSessionFactory("db.properties").openConnection();//db.properties是数据库URL,密码等信息, ss.save(new Student(1001, "A", 27));
ss.update(new Student(1001, "A", 27));
ss.delete(new Student(1001, "A", 27));
ss.query(new Student(1001, "A", 27)); ss.close();
}
MyORM:
package m.cnblogs.com.orm; import m.cnblogs.com.orm.conn.Factory;
import m.cnblogs.com.orm.conn.Session; public final class MyORM
{
private static Factory sin = null; private static class SessionFactory implements Factory
{
private SessionFactory(String path) throws ClassNotFoundException
{
System.out.println("use the file path provided to init factory");
} public Session openConnection()
{
return new Session();
} } public static Factory getSessionFactory(String path) throws ClassNotFoundException
{
if (null == sin)
{
sin = new SessionFactory(path);
}
return sin;
}
}
Student类对应数据表,定义如下:
@Table(name = "STUDENT")
public class Student
{
@ID //框架中定义的注解
@Property(name = "ID", type = "int")
private int id;
@Property(name = "NAME", type = "varchar")
private String name;
@Property(name = "AGE", type = "int")
private int age; public Student(int id, String name, int age)
{
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
session.java
package m.cnblogs.com.orm.conn; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import m.cnblogs.com.orm.anno.ID;
import m.cnblogs.com.orm.anno.Property;
import m.cnblogs.com.orm.anno.Table; public class Session
{ public Session()
{
System.out.println("SESSION INIT");
} public <T> void save(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("INSERT INTO "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl)
{
sql.append(tbl.name());
}
else
{
sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1));
} sql.append("( "); Field[] fields = cls.getDeclaredFields();
StringBuffer valueSql = new StringBuffer(); for (Field field : fields)
{ Property proper = field.getAnnotation(Property.class); // 获得字段第一个字母大写
String methodFirstLetter = field.getName().substring(0, 1).toUpperCase();
// 转换成字段的get方法
String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[]
{});
// 这个对象字段get方法的值
Object value = getMethod.invoke(obj, new Object[]
{}); if (field.getType().getName().equals(java.lang.String.class.getName()))
{
valueSql.append("'" + value + "'").append(",");
}
else
{
valueSql.append(value).append(",");
} if (null != proper)
{
sql.append(proper.name()).append(",");
}
else
{
sql.append(field.getName()).append(",");
}
} valueSql.deleteCharAt(valueSql.length() - 1);
sql.deleteCharAt(sql.length() - 1);
sql.append(" ) VALUES( ");
sql.append(valueSql);
sql.append(" )"); System.out.println(sql.toString());
} public <T> void query(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("SELETE FROM "); Table tbl = (Table)cls.getAnnotation(Table.class); if (null != tbl) {
sql.append(tbl.name());
} else {
sql.append(cls.getName().substring(cls.getName().lastIndexOf(".")+1));
} Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { if (null != field.getAnnotation(ID.class))
{
//获得字段第一个字母大写
String methodFirstLetter = field.getName().substring(0,1).toUpperCase();
//转换成字段的get方法
String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[] {});
//这个对象字段get方法的值
Object value = getMethod.invoke(obj, new Object[] {});
sql.append(" WHERE ").append(field.getName()).append("=");
if (field.getType().getName().equals(java.lang.String.class.getName())) {
sql.append("'" + value + "'");
} else {
sql.append(value);
}
} } System.out.println(sql.toString()); } public <T> void update(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer();
StringBuffer condition = new StringBuffer(); sql.append("UPDATE "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl)
{
sql.append(tbl.name());
}
else
{
sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1));
} sql.append(" SET "); Field[] fields = cls.getDeclaredFields(); for (Field field : fields)
{ Property proper = field.getAnnotation(Property.class); // 获得字段第一个字母大写
String methodFirstLetter = field.getName().substring(0, 1).toUpperCase();
// 转换成字段的get方法
String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[]
{});
// 这个对象字段get方法的值
Object value = getMethod.invoke(obj, new Object[]
{}); if (null != field.getAnnotation(ID.class))
{
condition.append(" WHERE ").append(field.getName()).append("=");
if (field.getType().getName().equals(java.lang.String.class.getName()))
{
condition.append("'" + value + "'");
}
else
{
condition.append(value);
}
}
else
{
String tmp = ""; if (field.getType().getName().equals(java.lang.String.class.getName()))
{
tmp = "'" + value + "'";
}
else
{
tmp = value + "";
} if (null != proper)
{
sql.append(proper.name()).append("=").append(tmp).append(",");
}
else
{
sql.append(field.getName()).append("=").append(tmp).append(",");
}
} } sql.deleteCharAt(sql.length() - 1); sql.append(condition); System.out.println(sql.toString());
} public <T> void delete(T obj) throws NoSuchMethodException, SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
Class<? extends Object> cls = obj.getClass(); StringBuffer sql = new StringBuffer(); sql.append("DELETE FROM "); Table tbl = (Table) cls.getAnnotation(Table.class); if (null != tbl)
{
sql.append(tbl.name());
}
else
{
sql.append(cls.getName().substring(cls.getName().lastIndexOf(".") + 1));
} Field[] fields = cls.getDeclaredFields(); for (Field field : fields)
{ if (null != field.getAnnotation(ID.class))
{
// 获得字段第一个字母大写
String methodFirstLetter = field.getName().substring(0, 1).toUpperCase();
// 转换成字段的get方法
String getterName = "get" + methodFirstLetter + field.getName().substring(1); Method getMethod = cls.getMethod(getterName, new Class[]
{});
// 这个对象字段get方法的值
Object value = getMethod.invoke(obj, new Object[]
{});
sql.append(" WHERE ").append(field.getName()).append("=");
if (field.getType().getName().equals(java.lang.String.class.getName()))
{
sql.append("'" + value + "'");
}
else
{
sql.append(value);
}
} } System.out.println(sql.toString());
} public void close()
{
System.out.println("SESSION CLOSE");
}
}
简易框架模仿hibernate,运算后的结果如下:

JAVA描述的简单ORM框架的更多相关文章
- java基础强化——深入理解java注解(附简单ORM功能实现)
目录 1.什么是注解 2. 注解的结构以及如何在运行时读取注解 2.1 注解的组成 2.2 注解的类层级结构 2.3 如何在运行时获得注解信息 3.几种元注解介绍 3.1 @Retention 3.2 ...
- Weed3 for java 新的微型ORM框架
Weed3,微型ORM框架(支持:java sql,xml sql,annotation sql:存储过程:事务:缓存:监听:等...) 05年时开发了第一代: 08年时开发了第二代,那时候进入互联网 ...
- 封装JDBC:实现简单ORM框架lfdb
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 框架就是一组可重用的构件,LZ自己写的姑且就叫微型小框架:lfdb.LZ也对其他的ORM框架没有什么了解,现 ...
- java集群优化——ORM框架查询优化原理
众所周知,当下的流行的企业级架构中,ORM一直是最基础的部分,在架构设计的底层.对逻辑层提供面向对象的操作支持,而事实总是和我们预想的有所偏差,ORM在提供了较好的操作体验时,也流失了一部分原生SQL ...
- Java回顾之ORM框架
这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别. 概述 ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立 ...
- 基于java注解实现自己的orm框架
ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系. 现在常见的 ...
- 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)
ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...
- 简单实用的Android ORM框架TigerDB
TigerDB是一个简单的Android ORM框架,它能让你一句话实现数据库的增删改查,同时支持实体对象的持久化和自动映射,同时你也不必关心表结构的变化,因为它会自动检测新增字段来更新你的表结构. ...
- PHP ORM框架与简单代码实现(转)
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据 ...
随机推荐
- 第二部分----CSS的基础语法
PART-1 CSS的基础常识 一.什么是CSS? W3C标准中,倡导有3:其一为内容与表现分离,其二为内容与行为分离,其三为内容结构的语义化.其倡导中第一条的"表现"指的便可以说 ...
- Jquery一些常用的方法
整理以前的笔记,在学习JavaScript时候,经常会用到一些方法,但是有时忘掉了具体用法,因此记下.方便以后查阅. 这篇博文先说明这些方法的用途: removeClass().remove().cs ...
- StringBuffer和String的相互转换
1:用法: * A:String -- >StringBuffer * a:通过构造方法 * b:通过append()方法 * B:StringBuffer --> String * a: ...
- JS设计模式(二) 惰性模式
惰性模式:减少代码每次执行时的重复性判断,通过重新定义对象来避免原对象中的分支判断,提高网站性能. 例如针对不同浏览器的事件注册方法: var AddEvent = function(dom, typ ...
- Oculus关于Internal Error:OVR53225466报错解决方法
安装Oculus过程中可能会出现Internal Error:OVR53225466报错提示,如附件所示: 解决方法:修改hosts文件 操作方法: (1)以管理员方式打开记事本: (2)打开C:\W ...
- Ubuntu16.04 Using Note
I meet lots of problems when i installed and use ubuntu 16.04.below is my using note: (my operating ...
- IDEA- idea代码调试debug
IDEA有很多的快捷键,下面整理Debug的快捷键,方便自己使用!(阅读本篇可能花费您2分钟,需要多的实践练习) F9 resume programe 恢复程序 Alt+F10 show execut ...
- LDA工程实践之算法篇之(一)算法实现正确性验证(转)
研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...
- python---random模块使用详解
random与随机操作有关的模块 常用方法: random() --- 返回0-1之见得一个随机浮点数. 调用:random.random() 例如: >>> random.rand ...
- python之路第四篇(基础篇)
一.冒泡算法实现: 方法一: li = [13,33,12,80,66,1] print li for m in range(4): num1 = li[m] num2 = li[m+1] if nu ...