代码路径: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框架的更多相关文章

  1. java基础强化——深入理解java注解(附简单ORM功能实现)

    目录 1.什么是注解 2. 注解的结构以及如何在运行时读取注解 2.1 注解的组成 2.2 注解的类层级结构 2.3 如何在运行时获得注解信息 3.几种元注解介绍 3.1 @Retention 3.2 ...

  2. Weed3 for java 新的微型ORM框架

    Weed3,微型ORM框架(支持:java sql,xml sql,annotation sql:存储过程:事务:缓存:监听:等...) 05年时开发了第一代: 08年时开发了第二代,那时候进入互联网 ...

  3. 封装JDBC:实现简单ORM框架lfdb

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 框架就是一组可重用的构件,LZ自己写的姑且就叫微型小框架:lfdb.LZ也对其他的ORM框架没有什么了解,现 ...

  4. java集群优化——ORM框架查询优化原理

    众所周知,当下的流行的企业级架构中,ORM一直是最基础的部分,在架构设计的底层.对逻辑层提供面向对象的操作支持,而事实总是和我们预想的有所偏差,ORM在提供了较好的操作体验时,也流失了一部分原生SQL ...

  5. Java回顾之ORM框架

    这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别. 概述 ORM框架不是一个新话题,它已经流传了很多年.它的优点在于提供了概念性的.易于理解的数据模型,将数据库中的表和内存中的对象建立 ...

  6. 基于java注解实现自己的orm框架

    ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系. 现在常见的 ...

  7. 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  8. 简单实用的Android ORM框架TigerDB

    TigerDB是一个简单的Android ORM框架,它能让你一句话实现数据库的增删改查,同时支持实体对象的持久化和自动映射,同时你也不必关心表结构的变化,因为它会自动检测新增字段来更新你的表结构. ...

  9. PHP ORM框架与简单代码实现(转)

    对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据 ...

随机推荐

  1. 201521123093 java 第十二周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  2. java课程设计---计算器(201521123020 邱伟达)

    1.团队课程设计博客链接 http://www.cnblogs.com/br0823/p/7064407.html 2.个人负责模板或任务说明 1.初始化按键 2.实现加减乘除开方乘方等运算 3.每个 ...

  3. 子元素设定margin值会影响父元素

    有些情况下,我们设定父元素下的子元素margin值时,父元素会被影响. 这是个常见问题,而且只在标准浏览器下 (FirfFox.Chrome.Opera.Sarfi)产生问题,IE下反而表现良好. 例 ...

  4. IIC-BUS INTERFACE

    I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. To control multi-master IIC-bus opera ...

  5. js 倒计时(服务器时间同步)

    首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...

  6. crontab的两大坑:百分号和环境变量

    今天想给服务器加个自动备份mysql数据库的功能(别怪我这么久才加,阿里云每天全盘备份的,不怕丢数据库),本以为只要5分钟就能搞定的,结果入了两个大坑. 我的crontab是这样写的: * * * m ...

  7. ubuntu12.04添加程序启动器到Dash Home

    ubuntu12.04 dash home中每个图标对应/usr/share/applications当中的一个配置文件(文件名后缀为.desktop).所以要在dash home中添加一个自定义程序 ...

  8. Linux入门之常用命令(9)进程及端口查看

    [Linux下查看进程] 查看程序对应进程号:ps –ef|grep 程序名 查看进程占用端口:ss -pl | grep 进程号 [通过进程查看端口] 查看占用的端口号:netstat –nltp| ...

  9. 【POJ】2348 Euclid's Game(扩欧)

    Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first pl ...

  10. Football 概率DP poj3071

                                                                                                 Footbal ...