Java版的对象关系映射实现
在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序.
思路如下:
1: 对象必须是一个Java Bean.
2: 遍历对象的所有以set开头且只有一个参数的函数,为该函数提供数据值以填充该对象.
3: 如果获得的set参数值为null,则根据参数类型,以默认值对位参数调用该函数.
我的这个ORM接口名称为HiCBO,名称来自于一个C#开源项目DNN中的一个ORM转换为(CBO).
接口如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * 根据回调填充对象 * @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) |
该接口的调用如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | @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 ); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 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; } } |
该接口实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** * 根据提供数据装载对象 * @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 ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * 根据回调填充对象 * @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); } }); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?