zoukankan      html  css  js  c++  java
  • 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.lang.NoClassDefFoundError: org/apache/hadoop/hbase/filter/Filter
    【HBase】通过Bulkload批量加载数据到Hbase表中
    【HBase】HBase和Hue的整合
    【HBase】协处理器是什么?又能干什么?怎么用?
    【HBase】带你了解一哈HBase的各种预分区
    【HBase】快速了解上手rowKey的设计技巧
    【HBase】HBase和Sqoop整合
    【HBase】快速搞定HBase与Hive的对比、整合
    hive元数据报错?试了很多方法都没辙?也许你漏了这一步
    【HBase】HBase与MapReduce集成——从HDFS的文件读取数据到HBase
  • 原文地址:https://www.cnblogs.com/Rong-/p/5519623.html
Copyright © 2011-2022 走看看