在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个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版的对象关系映射实现的更多相关文章

  1. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  4. 自己动手写一个简易对象关系映射,ORM(单例版和数据库池版)

    准备知识 DBUtils模块  <<-----重点 DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: Persist ...

  5. Java 自定义注解实现ORM对象关系映射

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

  6. 对象关系映射ORM

    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...

  7. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  8. LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具

    LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...

  9. hibernate(四)__由表逆向创建Domain对象和对象关系映射文件

    之前我们是手写Domain对象和对象关系映射文件->然后生成数据库中的Table. 现在我们反过来先在数据库中建好Table->然后用工具生成Domain对象和对象关系映射文件. 步骤: ...

  10. android对象关系映射框架ormlite之一对多(OneToMany)

    前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...

随机推荐

  1. Python如何根据给定模型计算权值

    在机器学习和深度学习中,模型的权值(或参数)通常是通过训练过程(如梯度下降)来学习和调整的.然而,如果我们想根据一个已经训练好的模型来计算或提取其权值,Python 提供了许多工具和库,其中最常用的是 ...

  2. 解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功

    解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功 如果是实体拖动,是比较好解决的. 如果是虚拟应用程序数据,拖动到本机桌面或资源管理器目录下,获取目录路径 ...

  3. 优秀的 Java 程序员所应该知道的 Java 知识

    JDK 相关知识 JDK 的使用 JDK 源代码 JDK 相应技术背后的原理 JVM 相关知识 服务器端开发需要重点熟悉的 Java 技术 Java 并发 Java IO 开源框架 Java 之外的知 ...

  4. vue之项目部署

    一.将vue项目打包同步文件到远程服务器 1. 打包 默认情况下,使用vue-cli创建的项目,package.json里的script应该已经配置了build指令,直接执行yarn build 或者 ...

  5. Simple FOC内置通信接口学习(二):电机命令接口

    本文参(zhao)考(chao)至官方文档https://docs.simplefoc.com/docs_chinese/commander_interface Commander 接口 Comman ...

  6. 【Amadeus原创】GFS 安装使用

    准备环境: 一.修改每台主机的host文件,在/etc/hosts下添加内容: 172.62.21.44 gfs1 172.62.21.43 gfs2 172.62.21.37 gfs3 二.分别安装 ...

  7. 【Amadeus原创】更改docker run启动参数

    经过一整天的摸索,答案: 没法直接修改.只能另外创建. 但是还好不用完全重头来,用docker commit命令可以基于当前修改的内容创建一个新的image. 执行docker 看看帮助先: Comm ...

  8. 搭建 zerotier 的行星服务

    放弃moon节点,直接搭建Zerotier根服务器_软件应用_什么值得买 Zerotier的优点在于其部署十分简便,只需在zerotier官网注册登陆并创建网络,在自己的设备安装客户端加入网络后,ze ...

  9. SpringSecurity认证流程分析

    重要组件 SecurityContext 上下文对象,Authentication(认证)对象会放在里面 SecurityContextHolder 用于拿到上下文对象的静态工具类 Authentic ...

  10. Argo CD使用CLI工具修改默认密码

    查看默认密码 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}&q ...