在前面的几篇文章中,实现了获得基本类型的默认值,基本数据类型的转换等,主要的目标就是实现一个Java版的对象关系映射程序.
思路如下:
1: 对象必须是一个Java Bean.
2: 遍历对象的所有以set开头且只有一个参数的函数,为该函数提供数据值以填充该对象.
3: 如果获得的set参数值为null,则根据参数类型,以默认值对位参数调用该函数.
我的这个ORM接口名称为HiCBO,名称来自于一个C#开源项目DNN中的一个ORM转换为(CBO).
接口如下:
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static boolean FillObject(T obj, Class type, IEventRet8Param handler) ;
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static boolean FillObjectEx(T obj, Class type, IEventRet8Param handler)
该接口的调用如下:
@Test
public void Test_CBO() {
TestObj obj = new TestObj();
boolean ret = HiCBO.FillObject(obj, TestObj.class, new IEventRet8Param(){
@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(){
@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 boolean FillObject(T obj, Class type, IEventRet8Param2, 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 boolean FillObject(T obj, Class type, IEventRet8Param handler) {
return FillObject(obj, type, new IEventRet8Param2, String>(){
public Object OnEvent(Class> cls, String property) {
return handler.OnEvent(property);
}
});
}
/**
* 根据回调填充对象
* @param obj
* @param type
* @param handler
* @return
*/
public static boolean FillObjectEx(T obj, Class type, IEventRet8Param handler) {
return FillObject(obj, type, new IEventRet8Param2, String>(){
public Object OnEvent(Class> cls, String property) {
return handler.OnEvent(property);
}
});
}