Java版的对象关系映射实现
在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序.
思路如下:
1: 对象必须是一个Java Bean.
2: 遍历对象的所有以set开头且只有一个参数的函数,为该函数提供数据值以填充该对象.
3: 如果获得的set参数值为null,则根据参数类型,以默认值对位参数调用该函数.
我的这个ORM接口名称为HiCBO,名称来自于一个C#开源项目DNN中的一个ORM转换为(CBO).
接口如下:
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static <T> boolean FillObject(T obj, Class<T> type, IEventRet8Param<String, String> handler) ;
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static <T> boolean FillObjectEx(T obj, Class<T> type, IEventRet8Param<Object, String> handler)
该接口的调用如下:
@Test
public void Test_CBO() {
TestObj obj = new TestObj();
boolean ret = HiCBO.FillObject(obj, TestObj.class, new IEventRet8Param<String, String>(){ @Override
public String OnEvent(String v) {
if (v.equals("X")) {
return "test";
}
if (v.equals("Y")) {
return "3";
}
if (v.equals("Z")) {
return "2.7";
}
if (v.equals("Date")) {
return "2016-05-19";
}
if (v.equals("Date2")) {
return "2016-05-19";
}
if (v.equals("Date3")) {
return "2016-05-19 14:03:14";
}
if (v.equals("Date4")) {
return "2016-05-19 02:03:14";
}
return null;
} });
Assert.assertTrue(ret);
Assert.assertEquals(obj.getX(), "test");
Assert.assertEquals(obj.getY(), 3);
Assert.assertEquals(obj.getY2(), -1);
Assert.assertTrue(obj.getZ() == 2.7f);
Assert.assertEquals(obj.getDate(), HiTypeHelper.Convert2Date("2016-05-19"));
Assert.assertEquals(obj.getDate2(), HiTypeHelper.Convert2SqlDate("2016-05-19"));
Assert.assertEquals(obj.getDate3(), HiTypeHelper.Convert2Date("2016-05-19 14:03:14"));
Assert.assertEquals(obj.getDate4(), HiTypeHelper.Convert2SqlDate("2016-05-19 02:03:14"));
Assert.assertEquals(obj.getDate5(), null);
} @Test
public void Test_CBOEx() {
TestObj obj = new TestObj();
boolean ret = HiCBO.FillObjectEx(obj, TestObj.class, new IEventRet8Param<Object, String>(){ @Override
public Object OnEvent(String v) {
if (v.equals("X")) {
return "test";
}
if (v.equals("Y")) {
return 3;
}
if (v.equals("Z")) {
return 2.7;
}
if (v.equals("Date")) {
return "2016-05-19";
}
if (v.equals("Date2")) {
return "2016-05-19";
}
if (v.equals("Date3")) {
return "2016-05-19 14:03:14";
}
if (v.equals("Date4")) {
return "2016-05-19 02:03:14";
}
return null;
} });
Assert.assertTrue(ret);
Assert.assertEquals(obj.getX(), "test");
Assert.assertEquals(obj.getY(), 3);
Assert.assertEquals(obj.getY2(), -1);
Assert.assertTrue(obj.getZ() == 2.7f);
Assert.assertEquals(obj.getDate(), HiTypeHelper.Convert2Date("2016-05-19"));
Assert.assertEquals(obj.getDate2(), HiTypeHelper.Convert2SqlDate("2016-05-19"));
Assert.assertEquals(obj.getDate3(), HiTypeHelper.Convert2Date("2016-05-19 14:03:14"));
Assert.assertEquals(obj.getDate4(), HiTypeHelper.Convert2SqlDate("2016-05-19 02:03:14"));
Assert.assertEquals(obj.getDate5(), null);
}
package HiJUtil.Test;
public class TestObj {
public String x;
public String getX() {
return x;
}
public void setX(String x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public float getZ() {
return z;
}
public void setZ(float z) {
this.z = z;
}
public int y;
public float z;
private java.util.Date date;
public java.util.Date getDate() {
return date;
}
public void setDate(java.util.Date date) {
this.date = date;
}
private java.sql.Date date2;
public java.sql.Date getDate2() {
return date2;
}
public void setDate2(java.sql.Date date2) {
this.date2 = date2;
}
private java.util.Date date3;
public java.util.Date getDate3() {
return date3;
}
public void setDate3(java.util.Date date3) {
this.date3 = date3;
}
private java.sql.Date date4;
public java.sql.Date getDate4() {
return date4;
}
public void setDate4(java.sql.Date date4) {
this.date4 = date4;
}
public int y2;
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
private java.util.Date date5;
public java.util.Date getDate5() {
return date5;
}
public void setDate5(java.util.Date date5) {
this.date5 = date5;
}
}
该接口实现代码如下:
/**
* 根据提供数据装载对象
* @param obj
* @param type
* @param handler
* @return
*/
private static <T> boolean FillObject(T obj, Class<T> type, IEventRet8Param2<Object, Class<?>, String> handler) {
if (obj == null || handler == null) {
return false;
} Method[] methods = type.getMethods(); for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String name = method.getName();
if (!name.startsWith("set")) {
continue;
} if (method.getParameters().length != 1) {
continue;
} Class<?> cls = method.getParameterTypes()[0];
if (cls == null) {
continue;
}
String property = name.substring(3, name.length()); try {
Object value = handler.OnEvent(cls, property);
Object ret = HiTypeHelper.Cast(cls, value);
method.invoke(obj, ret);
} catch(Exception ex) {
ex.printStackTrace();
}
}
return true;
}
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static <T> boolean FillObject(T obj, Class<T> type, IEventRet8Param<String, String> handler) {
return FillObject(obj, type, new IEventRet8Param2<Object, Class<?>, String>(){
public Object OnEvent(Class<?> cls, String property) {
return handler.OnEvent(property);
}
});
} /**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static <T> boolean FillObjectEx(T obj, Class<T> type, IEventRet8Param<Object, String> handler) {
return FillObject(obj, type, new IEventRet8Param2<Object, Class<?>, String>(){
public Object OnEvent(Class<?> cls, String property) {
return handler.OnEvent(property);
}
});
}
Java版的对象关系映射实现的更多相关文章
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- 自己动手写一个简易对象关系映射,ORM(单例版和数据库池版)
准备知识 DBUtils模块 <<-----重点 DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: Persist ...
- Java 自定义注解实现ORM对象关系映射
一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...
- 对象关系映射ORM
对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...
- Hibernate(开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具
LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...
- hibernate(四)__由表逆向创建Domain对象和对象关系映射文件
之前我们是手写Domain对象和对象关系映射文件->然后生成数据库中的Table. 现在我们反过来先在数据库中建好Table->然后用工具生成Domain对象和对象关系映射文件. 步骤: ...
- android对象关系映射框架ormlite之一对多(OneToMany)
前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...
随机推荐
- 大便系统怎样安装RPM包
alien包转换工具 如果我们有很喜欢的RPM包,而又没有deb版本. 怎么办~? 可以同过alien来转换或者直接安装,这个小家伙可是个很方便的东西! 基本命令如下: 首先通过apt-get ins ...
- IPC-7711/7721D-中文版 CN 2024 电子组件的返工、修改和维修标准
IPC-7711D-7721D-中文版 CN 2024 电子组件的返工.修改和维修标准 链接:https://pan.baidu.com/s/1r5dm9vsj4-Oj2Jw0HgeTHw?pwd=1 ...
- (Redis基础教程之十二) 如何解决Redis中的故障
介绍 Redis是一个开源的内存中键值数据存储.它带有几个命令,可以帮助您进行故障排除和调试.由于Redis具有内存中的键值存储的性质,因此其中许多命令都集中在内存管理上,但是还有一些其他命令对于概述 ...
- (Python基础教程之十七)Python OrderedDict –有序字典
一个OrderedDict 维护插入顺序添加到字典中的项目.项目的顺序在迭代或序列化时也会保留. 1. Python OrderedDict示例 OrderedDict 是python collect ...
- WiFi流量劫持—— 浏览任意页面即可中毒!
大家都知道公共场所的Wifi安全性很差,但并不清楚究竟有多差.大多以为只要不上QQ.不登陆网站账号就没事了,看看新闻小说什么的应该毫无关系. 的确如此,看看新闻网页没有涉及任何敏感的账号信息.即便是数 ...
- java公式解析器学习与开发(1)
public class Evaluate { public static void main(String[] args) { Stack<String> ops = new Stack ...
- python下的多线程与多进程
多进程: 进程我们可以理解为是一个可以独立运行的程序单位,比如打开一个浏览器,这就开启了一个浏览器进程:打开一个文本编辑器,这就开启了一个文本编辑器进程.但一个进程中是可以同时处理很多事情的,比如在浏 ...
- Elasticsearch之性能优化
elasticsearch 使用有时候会出现CPU飙升,内存爆满情况,需要进行一些优化设置. 1. 一定要用es自带id生产策略 2. 设置副本数量为0,写入完可恢复 put localhost: ...
- Codeforces Round 878 (Div3)
B. Binary Cafe \(1 \leq n,k \leq 10^9\) 题解:思维 考虑两种情况 第一种:钱足够多,每种咖啡都可以买的情况下,答案为\(2^k\) 第二种:钱不够多,因为任一面 ...
- Helm部署SkyWalking
一 . 部署ElasticSearch 1.下载安装包 helm repo add elastic https://helm.elastic.cohelm pull elastic/elasticse ...