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是通过使用描述对象和数据库之间映射的元数据 ...
随机推荐
- SpringMVC第一篇【介绍、入门、工作流程、控制器】
什么是SpringMVC? SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发,类似于struts2框架 为什么要使用 ...
- Spring - Spring容器概念及其初始化过程
引言 工作4年多,做了3年的java,每个项目都用Spring,但对Spring一直都是知其然而不知其所以然.鄙人深知Spring是一个高深的框架,正好近期脱离加班的苦逼状态,遂决定从Spring的官 ...
- Kafka水位(high watermark)与leader epoch的讨论
~~~这是一篇有点长的文章,希望不会令你昏昏欲睡~~~ 本文主要讨论0.11版本之前Kafka的副本备份机制的设计问题以及0.11是如何解决的.简单来说,0.11之前副本备份机制主要依赖水位(或水印) ...
- Maven(五)之Maven配置阿里云镜像飞快下jar包
用过Maven的人都知道Maven对于依赖的管理让我们程序员从此远离了自己去在项目中把需要的jar包导入到项目中,但是因为中央仓库是在国外的,所以在我们从中央仓库下载依赖的时候, 我们发现下载速度真的 ...
- Jenkins定时任务
Jenkins配置定时任务 选中Job名称--配置—构建触发器—勾选“Build periodically” 如图中配置所示:该任务每天上午7点定时执行一次. 官方说明翻译 MINUTE HOUR D ...
- express 安装和运行
1.npm install -g express-generator 2.进入服务目录(自己定义的文件夹,或者express Myapp && cd Myapp 新建Myapp文件夹并 ...
- Hive内置数据类型
Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...
- web.xml中servlet-mapping的配置
<servlet-mapping>元素在Servlet和URL样式之间定义一个映射.它包含了两个子元素<servlet- name>和<url-pattern>,& ...
- Coin Change (II)(完全背包)
Coin Change (II) Time Limit: 1000MS Mem ...
- eclipse建立一个jsp项目遇到的问题及解决
打开eclipse 在workplace 区域空白处,右键 填写好Project name,之后,点击finished 即可. 选中webcontent,新建一个文件夹,并新建一个jsp 文件 新建 ...