java - 使用 java 反射映射包含其他对象的对象

标签 java mysql reflection orm

我尝试在数据库中映射一个对象。 它适用于像 int、string 等简单类型...但是我遇到了关于包含其他对象的类的问题。

例如,我收到了一个类(class)订单:

public class order
{
  int id;
  Client c;

 public int getId();
 public void setId(int id);
}

和一个类客户端:

public class Client
{
 int id;
 //some stuff like name ect and getter/setter...
}

我想通过获取客户端 ID 来映射订单。

问题是,当我尝试获取字段 Client 的包名称时,它返回 java.lang (字段类的包...)

field.getType().getClass().getPackage().getName().compareTo("fr.javatp.model") == 0

我不知道为什么它不返回类型 Client...

有什么线索吗?

这是代码:

   public void insertObject(Object instance) throws SQLException,
        SecurityException, IllegalArgumentException,
        InstantiationException, IllegalAccessException,
        IntrospectionException, InvocationTargetException
{
    Connection connection = null;
    PreparedStatement preparedStatement = null;

    this.type = instance.getClass();
    this.query = createInsertQuery();
    try
    {
        try 
        {
            connection = this.getConnexion();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        preparedStatement = connection.prepareStatement(query);
        int i = 0;
        Class clazz;
        for (Field field : type.getDeclaredFields())
        {
            System.out.println("PACKAGE NAME : " + field.getType().getClass().getPackage().getName());

            if (field.getType().getClass().getPackage().getName().compareTo("fr.javatp.model") == 0)
                clazz = field.getType();
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    field.getName(), type);
            Method method = propertyDescriptor.getReadMethod();
            Object value = method.invoke(instance);
            preparedStatement.setObject(++i, value);
        }
        preparedStatement.addBatch();
        preparedStatement.executeBatch();
    }
    finally
    {
        connection.close();
        preparedStatement.close();
    }

}

并创建插入查询代码:

私有(private)字符串createInsertQuery() {

    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO ");
    sb.append(type.getSimpleName());
    sb.append("(");
    sb.append(this.getCol(false));
    sb.append(")");
    sb.append(" VALUES (");
    sb.append(this.getCol(true));
    sb.append(")");
    System.out.println("QUERY TO SEND : " + sb.toString());
    return sb.toString();
}

并获取 Col 代码:

 private String getCol(boolean usePlaceHolders)
{
    StringBuilder sb = new StringBuilder();
    boolean first = true;

    for (Field f : this.type.getDeclaredFields())
    {
//      System.out.println("PACKAGE NAME : " + f.getType().getClass().getName());

        if (first)
            first = false;
        else
            sb.append(",");

        if (usePlaceHolders)
            sb.append("?");
        else if (f.getType().getClass().getPackage().getName().compareTo("fr") == 0)
            {
                sb.append(f.getName() + ".id");
            }
        else
            sb.append(f.getName());
    }

    return sb.toString();
}

最佳答案

问题在于这个表达式:

field.getType().getClass().getPackage()

Field.getType()返回您感兴趣的字段的Class对象。通过对其调用getClass(),您将获得Class的类对象,即java.lang.Class.class。所以只需使用

field.getType().getPackage()

您是否考虑过使用现有的 ORM 而不是重新发明轮子?

关于java - 使用 java 反射映射包含其他对象的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21159997/

相关文章:

java - 动画 Android Ring Shape 的扫角

java - 帕斯卡的三角形格局突然破裂

php - (HTML/PHP) 下拉菜单选择影响表格和表单

mysql - 解析另一个命令的 SQL 输出

C# 与装饰成员一起工作

c# - 区分属性 protected 和 setter protected

java - 从 Java EE 调用 Groovy 类 + 添加到 jsp

java - 是否可以并且建议在 JTable 的prepareRenderer 方法中编辑单元格数据?

mysql - 使用 vb.net 窗口窗体中的复选框列表更新数据库中列的值

java - 如果调用的方法采用可变数量的参数,如何使用 Invoke()