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 ...
随机推荐
- Minio安装以及使用
Minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器/虚拟机镜像等,而一个对象文 ...
- 4G模组软件指南 | 必读篇之模块信息(hmeta)
今天我讲解的这篇关于4G模组软件的模块信息属于必读篇,望珍惜! 1.模块信息概述 模块信息是每一个模块携带的信息,就像人的身份证一样,这些信息确定了模块的唯一性; 包含设备唯一id,硬件型号,模组的硬 ...
- php 安装扩展 event
本地环境php8.1,然后我想安装event扩展,找了找资料,直接一句话 sudo pecl install event 然后执行的过程中提示这些 configure.ac:165: the top ...
- .NET9 - 新功能体验(一)
被微软形容为"迄今为止最高效.最现代.最安全.最智能.性能最高的.NET版本"--.NET 9已经发布有一周了,今天想和大家一起体验一下新功能. 此次.NET 9在性能.安全性和功 ...
- 4-CSRF漏洞渗透与防御
1.什么是CSRF漏洞 Cross-Site Request Forgery 跨站请求伪造 从一个第三方的网站,利用其他网站生效的cookie,直接请求服务器的某一个接口,导致攻击发生! 2.CSRF ...
- Javascript 常用封装(二)
1.字符串占位宽度 计算占位宽度:字符串的占位宽度除了涉及到具体的字符串内容,还与字体大小有关,可以将其放入Dom中来获取实际占位宽度 //计算字符串的占位宽度 function getTextWid ...
- 记ios的input框获取焦点之后界面放大问题
在移动端开发项目中,发现页面在使用 iPhone 访问的时候,点击 input 和 textarea 等文本输入框聚焦 focus() 时,页面会整体放大,而且失去焦点之后页面不能返回原来的样子.检查 ...
- 从FTP到Feem:文件传输技术的革新
Feem是一个开源的文件传输协议,旨在提供高效.安全.快速的文件传输服务.与传统的FTP和HTTP协议相比,Feem具有许多优势,如支持任意大小的文件传输.支持实时传输和断点续传等. Feem_v4. ...
- C#调用Python代码的方式(二),以PaddleOCR-GUI为例
前言 前面介绍了在C#中使用Progress类调用Python脚本的方法,但是这种方法在需要频繁调用并且需要进行数据交互的场景效果并不好,因此今天分享的是C#调用Python代码的方式(二):使用py ...
- spring 项目实现带请求链路id的日志记录
我们在做java项目的时候通常需要通过请求日志来排查定位线上问题,在日志比较多而我们又需要查找整个请求的全部日志的时候会比较困难.所以,就需要在日志记录的时候讲同一个请求的关键日志用同一个唯一标识串联 ...