JAVA
JAVA

Reputation: 31

Problem using generics in function

I have this functions and need to make it one function. The only difference is type of input variable sourceColumnValue. This variable can be String or Integer but the return value of function must be always Integer. I know I need to use Generics but can't do it.

    public Integer selectReturnInt(String tableName, String sourceColumnName, String sourceColumnValue, String targetColumnName) {
    Integer returned = null;
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue+"' LIMIT 1";

    try {
        Connection connection = ConnectionManager.getInstance().open();
        java.sql.Statement statement = connection.createStatement();
        statement.execute(query.toString());
        ResultSet rs = statement.getResultSet();
        while(rs.next()){
            returned = rs.getInt(targetColumnName);
        }

        rs.close();
        statement.close();
        ConnectionManager.getInstance().close(connection);
    } catch (SQLException e) {
        System.out.println("Заявката не може да бъде изпълнена!");
        System.out.println(e);
    }

    return returned;
}


// SELECT (RETURN INTEGER)
public Integer selectIntReturnInt(String tableName, String sourceColumnName, Integer sourceColumnValue, String targetColumnName) {
    Integer returned = null;
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue+"' LIMIT 1";

    try {
        Connection connection = ConnectionManager.getInstance().open();
        java.sql.Statement statement = connection.createStatement();
        statement.execute(query.toString());
        ResultSet rs = statement.getResultSet();
        while(rs.next()){
            returned = rs.getInt(targetColumnName);
        }

        rs.close();
        statement.close();
        ConnectionManager.getInstance().close(connection);
    } catch (SQLException e) {
        System.out.println("Заявката не може да бъде изпълнена!");
        System.out.println(e);
    }

    return returned;
}

Upvotes: 3

Views: 167

Answers (5)

Skip Head
Skip Head

Reputation: 7760

Have the second method just call the first:

public Integer selectIntReturnInt(String tableName, String sourceColumnName, Integer sourceColumnValue, String targetColumnName) {
    return selectReturnInt(tableName, sourceColumnName, sourceColumnValue.toString(), targetColumnName);
}

Upvotes: 0

Shekhar_Pro
Shekhar_Pro

Reputation: 18430

No you don't need to use generics for this.. generic should be used when your supported Types can be to many and you don't know about them before hand and they share something common in them.

Only for just two Types Generics is not a good choice. Using objects can be a better choice.

May be i will say you don't even need to merge these functions, that's what polymorphism is for. keeping things discreet will allow more readability of code

Upvotes: 1

Tom Hawtin - tackline
Tom Hawtin - tackline

Reputation: 147164

For the love $deity please don't use dynamic SQL. You will get injection vulnerabilities.

You want to break this into (at least) three method. One with the bulk of the implementation, and one each for the different types.

Also of note:

  • Resource handling should be of the form final Resource resource = acquire(); try { ... } finally { resource.release(); }, or in JDK7 try (final Resource resource = acquire()) { ... }.
  • Singletons are the work of the devil.
  • Exception handling considered a good idea, whereas sinking to a printf is bad.
  • You're probably better off only returning a value if there is exactly one result set and throwing an exception otherwise.

Upvotes: 0

Oleg Pavliv
Oleg Pavliv

Reputation: 21172

You don't need to use generics. Just declare it as

public Integer selectReturnInt(String tableName, 
      String sourceColumnName, 
      Object sourceColumnValue, 
      String targetColumnName) {
      ...
 }

Upvotes: 0

krtek
krtek

Reputation: 26607

No need to use generic, you can just use Object as the variable type for the function :

public Integer selectIntReturnInt(String tableName, String sourceColumnName, Object sourceColumnValue, String targetColumnName) {
    Integer returned = null;
    String query = "SELECT "+targetColumnName+" FROM "+tableName+" WHERE "+sourceColumnName+"='"+sourceColumnValue.toString()+"' LIMIT 1";

    try {
        Connection connection = ConnectionManager.getInstance().open();
        java.sql.Statement statement = connection.createStatement();
        statement.execute(query.toString());
        ResultSet rs = statement.getResultSet();
        while(rs.next()){
            returned = rs.getInt(targetColumnName);
        }

        rs.close();
        statement.close();
        ConnectionManager.getInstance().close(connection);
    } catch (SQLException e) {
        System.out.println("Заявката не може да бъде изпълнена!");
        System.out.println(e);
    }

    return returned;
}

Upvotes: 0

Related Questions