2012-01-24 65 views
3

我有一个Java类,它具有匹配SQL数据库表的列名的实例字段(和匹配的setter方法)。我想优雅地从表中取出一行(到ResultSet中)并将其映射到此类的一个实例。将一行从SQL数据映射到Java对象

例如:

我有一个“学生”类实例字段“FNAME”,“L-NAME”,“等级”和每个相应的getter和setter方法。

我也有一个SQL表,有三个同名的列。

现在我做这样的事情:

rs = statement.executeQuery(query); 

Student student = new Student(); 

student.setFNAME(rs.getString("FNAME")); 
student.setLNAME(rs.getString("LNAME")); 
student.setGRADE(rs.getString("GRADE")); 

必须有这样做的更简洁的方式,对不对?当我添加列时,这可能会变得非常烦人和混乱。

+1

你也可以使用SpringJDBC,你将不得不为你的表和DAO创建RowMappers模型类来处理数据。在许多场合,我发现SpringJDBC比休眠更容易使用,但这取决于我在这一点上的习惯。在这里,你去http://www.vaannila.com/spring/spring-jdbc-tutorial-1.html –

回答

1

您可以像使用JPA提供程序之一那样使用ORM,例如Hibernate。这使您可以设置对象和表格之间的映射。

0

如果您使用JDBC,它就是如何工作的。如果你想避免在Java中添加这样的列,你可以考虑使用一些ORM框架。

0

稍微不详细的方法是给Student一个接受3个字符串的构造函数。然后,你可以这样做:

Student student = new Student(rs.getString("FNAME"), rs.getString("LNAME"), rs.getString("GRADE")); 

的另一种方式来做到这一点是使用ORM像Hibernate但只有Hibernate的成为值得处理大量的表非常大的项目,大量的设置工作。

+0

这是一个内部使用的网络应用程序,将由约2-3人使用,并可能涉及5桌。值得努力? – Martin

+2

@Martin你必须告诉Hibernate所有表中的每个表和每一列。你也必须指定列类型和其他一些东西。 Hibernate对于映射一对多/一对一关联非常有用。如果你只是从数据库中加载非常简单的数据,可能不值得。 –

4

我推荐使用Spring JDBC。您不需要使用Spring的其余部分来使用它们的JDBC库。它将为您管理连接(不再需要结束Connection,StatementResultSet),并且有许多便利,包括行映射。

我们使用Spring JDBC对遗留代码进行了改进,没有多少麻烦。

下面是Spring JDBC概述的演示文稿(PDF)。虽然没有让Spring注入依赖关系,但它还有几年的历史,但其工作原理基本相同。

Spring JDBC Presentation PDF

+0

我添加了一个PDF链接,给出了Spring JDBC的概述。 – Paul

0

有迹象表明,简化或消除JDBC苦差事许多ORM库。有关示例,请参阅Source Forge ORM。我喜欢我的图书馆,sormula,因为它可以使用最少的配置。

0

如果您不想使用任何其他框架,则可以创建标准映射方法并在每个Result后使用它。

public class CurrencyDAO(){ 

     public Currency findById(int id) { 
     String sql = "SELECT * FROM CCR.CURRENCY WHERE id = ?"; 
     Currency currency = null; 
     Connection c = null; 
     try { 
      c = DBConnection.getConnection(); 
      PreparedStatement ps = c.prepareStatement(sql); 
      ps.setInt(1, id); 
      ResultSet rs = ps.executeQuery(); 
      if (rs.next()) { 
       currency = processRow(rs); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException(e); 
     } finally { 
      DBConnection.close(c); 
     } 
     return currency; 
    } 


    protected Currency processRow(ResultSet rs) throws SQLException { 
     Currency currency = new Currency(); 
     currency.setId(rs.getInt("id")); 
     currency.setEUR(rs.getString("EUR")); 
     currency.setUSD(rs.getString("USD")); 
     currency.setRate(rs.getString("rate"));  
     return currency; 

    } 
} 
4

您可以通过执行以下简单的方法做到这一点一般:

接口的方法指针使用:

public interface I_DBtoJavaObjectConvertable<T> 
{ 
    public T createFromDB(ResultSet i_rs) throws SQLException; 
} 

通用类来处理每一个映射,从SQL到Java对象:

public class DBManager 
{ 

    static volatile Connection conn; 

    //set here a static c'tor to handle the connection to the database 

    //The General generic method:  
    public static <T> List<T> GetObjectsFromDB(String i_Query, I_DBtoJavaObjectConvertable i_Converter) 
    { 
     List<T> ResList = new ArrayList<>(); 

     try 
     { 
      Statement st = conn.createStatement(); 
      for (ResultSet rs = st.executeQuery(i_Query); rs.next();) 
      { 
       ResList.add((T) i_Converter.createFromDB(rs)); 
      } 
     } 
     catch (SQLException ex) 
     { 
      _LOG_ERROR(ex.getMessage()); 
     } 

     return ResList; 
    } 
} 

现在通过使用Lanbda表达式可以很容易地转换一个SQL行t O对象,通过给你的皈依方法,例如:

public static User FetchUserFromDB(ResultSet i_rs) 
{ 
    User userToCreate = null; 
    try 
    { 
     String FirstName = i_rs.getString("FirstName"); 
     String LastName = i_rs.getString("LastName"); 
     String Password = i_rs.getString("Password"); 

     userToCreate = new User(FirstName, LastName, Password); 

    } 
    catch (SQLException ex) 
    { 
     _LOG_ERROR("Error in fetching user from DB: \n" + ex.getMessage()); 
    } 
    return userToCreate; 
} 

现在你可以使用这个这个方法给你带来想要的任何用户:

public static List<User> GetAllUsersFromDB() throws SQLException 
{ 
    String Query = "select * " 
      + "from UsersTable"; 

    return DBManager.GetObjectsFromDB(Query, rs -> FetchUserFromDB(rs)); 
} 

或者:

public static List<String> GetAllNamesFromDB() throws SQLException 
{ 
    String Query = "select FirstName " 
      + "from UsersTable"; 

    return DBManager.GetObjectsFromDB(Query, rs -> rs.getString("FirstName")); 
} 
+0

我真的很喜欢这个。 – bharal