在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个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. Nuxt.js 应用中的 vite:configResolved 事件钩子

    title: Nuxt.js 应用中的 vite:configResolved 事件钩子 date: 2024/11/17 updated: 2024/11/17 author: cmdragon e ...

  2. 【网关开发】Openresty使用cosocket API 发送http与tcp网络请求

    背景 为网关提供健康检查功能时需要对节点发送http或者tcp探活请求.Openresty 提供cosocket来处理非阻塞IO. 实现 跟工程结合在一起,这里简单拼接数据结构 local funct ...

  3. SoftReference,WeakReference&WeakHashMap

    zz http://java.chinaitlab.com/oop/716371.html 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于 ...

  4. golang之异步队列Asynq

    Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3].Go生态类似的还有machinery[4]和gowor ...

  5. Xdebug+Phpstorm远程调试

    开发环境: 本地 Windows10 日常开发使用的环境 装有PHPStorm 远程主机 Linux 服务器 装php-fpm/nginx等所有开发依赖环境 本地可以访问远程主机 但远程主机无法访问本 ...

  6. 题解:AT_abc382_c [ABC382C] Kaiten Sushi

    题目传送门 思路 首先看一下数据范围. \(1 \leq N, M \leq 2 \times 10^5\) \(1 \leq A_i, B_i \leq 2 \times 10^5\) 这么大的数据 ...

  7. Python版本与Jupyter记录

    最近使用Python的时候,遇到一个版本问题.我本地安装的Python版本是3.8.0,在使用match...case...语法时,提示如下报错: 查询之后,才知晓3.8.0还没有match语法,ma ...

  8. Redis探秘Sentinel(哨兵模式)

    概述 Redis的高可用机制有持久化.复制.哨兵和集群.其主要的作用和解决的问题分别是: 持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保 ...

  9. IO介绍-下

    中断 由外部设备引起的中断,称为外中断. 由内部错误引起的中断,称为内中断,或者是陷入.例如:非法指令,地址越界,电源故障等.   中断向量表 中断优先级 多中断源的处理方式 屏蔽中断 嵌套中断 根据 ...

  10. CVE-2023-32233 Linux 内核 UAF 漏洞分析与利用

    Linux 内核 nftable 模块在处理匿名 set 时存在 UAF. ‍ 漏洞分析 漏洞成因是 nf_tables_deactivate_set​ 在释放匿名 set 时没有将 set 的标记设 ...