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);
            }
        });
    

  

posted @   荣--  阅读(3738)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示