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是通过使用描述对象和数据库之间映射的元数据 ...
随机推荐
- 201521123098 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 1. TCP的特征: ①可靠:具有失败重传的功能: ②开销大:需要建立通路以维持通信: ③控制能力较强:有 ...
- 201521123051《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ·所有的异常类是从 java.lang.Exception 类继承的子类. ·Exception 类是 Throwa ...
- Apache Spark 2.2.0 中文文档 - Spark Streaming 编程指南 | ApacheCN
Spark Streaming 编程指南 概述 一个入门示例 基础概念 依赖 初始化 StreamingContext Discretized Streams (DStreams)(离散化流) Inp ...
- JVM菜鸟进阶高手之路六(JVM每隔一小时执行一次Full GC)
转载请注明原创出处,谢谢! 上次分析详细地址在:http://www.jianshu.com/p/a6236cd39e2d 以为上次问题是rmi的问题就此结束了,但是问题并没有结束,其实本次问题不是r ...
- Dynamic web module 版本之间的区别
Servlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传Servlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释Servlet ...
- 【设计模式】module(模块)模式
写在前面 最近刚接触到设计模式, <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个 ...
- MX4拍摄视频转码方法
问题 使用魅族4手机拍摄的视频,其视频编码是H.265 目前大多数设备不支持解码,表现为常用播放器无法正常播放视频,剪辑软件无法剪辑视频. 解决方案 使用软件进行转码,期间尝试软件如下: 爱剪辑 部分 ...
- 深入理解String的关键点和方法
String是Java开发中最最常见的,本篇博客针对String的原理和常用的方法,以及String的在开发中常见问题做一个整体性的概括整理.因为之前对String的特性做过一些分析,所以不在详细描述 ...
- SSM之整合Redis
Redis安装与使用 第一步当然是安装Redis,这里以Windows上的安装为例. 首先下载Redis,可以选择msi或zip包安装方式 zip方式需打开cmd窗口,在解压后的目录下运行redis- ...
- vector 利用swap 函数进行内存的释放 vector<int>().swap
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...