java - 从结果集中创建对象。我这样做对吗?

标签 java jdbc resultset

<分区>

我正在学习 Java,现在正在学习 JDBC。我想我已经掌握了如何使用结果集对象,但我想确保我做的是正确的。

请参阅下面的代码。它在名为“restaurant”的数据库中查询名为“menu”的表。该表有四列:

  • id_menu 整数,表的主键。
  • name 字符串,菜单项的名称(例如“Double cheeseburger”)
  • descr 字符串,菜单项的描述(例如“全麦面包上的两个全牛肉馅饼。”)
  • price Double,元素的价格(例如 5.95)(注意我知道我可以使用 Money 类型,但我尽量保持简单)

下面是 menuItem 对象的 Java 代码。表中的每一行都应该用于创建一个 menuItem 对象:

public class menuItem {

    public int id = 0;
    public String descr = "";
    public Double price = 0.0;
    public String name = "";
    public menuItem(int newid, String newdescr, Double newprice, String newname){
        id = newid;
        descr = newdescr;
        price = newprice;
        name = newname;
        }
    }

一切都是公开的,只是为了简化这个练习。

这是填充数据库的代码。目前,这段代码是主类中的一个方法。

public static ArrayList<menuItem> reQuery() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException{    

    ArrayList<menuItem> mi = new ArrayList<menuItem>();

    //Step 1. User Class.forname("").newInstance() to load the database driver.
    Class.forName("com.mysql.jdbc.Driver").newInstance();

    //Step 2. Create a connection object with DriverManager.getConnection("")
    //Syntax is jdbc:mysql://server/database? + user=username&password=password
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/miguelel_deliveries?" + "user=root&password=");

    //Step 3. Create a statement object with connection.createStatement();
    Statement stmt = conn.createStatement();

    //Step 4. Create variables and issue commands with the Statement object.
    ResultSet rs = stmt.executeQuery("Select * from menu");

    //Step 5. Iterate through the ResultSet. Add a new menuItem object to mi for each item.
    while(rs.next()){
    menuItem item = new menuItem(rs.getInt("id_menu"),rs.getString("descr"),rs.getDouble("price"),rs.getString("name"));
    mi.add(item);
    }
    return mi;
}

此代码有效。我最终得到了一个包含 menuItem 的 ArrayList,因此每个元素对应于表中的一行。但这是最好的方法吗?我可以将其概括为一种处理结果集的方式吗?

  1. 为数据库中的每个表或 View 创建一个 Java 类,其属性等同于表的列。

  2. 将表格内容加载到 ResultSet 对象中。

  3. 使用 while(ResultSet.next()) 循环访问 ResultSet,在步骤 1 中为 ResultSet 中的每个项目创建一个新对象(来自类)。

  4. 创建每个新对象时,将其添加到类的 ArrayList 中。

  5. 根据需要操作 ArrayList。

这是一种有效的方法吗?有更好的方法吗?

最佳答案

代码逻辑没问题,但是实现有几个问题:

  • 它不遵守命名约定。类以大写字母开头
  • 您不应该使用公共(public)字段。如果字段在构造函数之后立即重新初始化,则将字段初始化为默认值是没有用的
  • 你没有关闭连接,这意味着每次执行该方法时,它都会留下一个连接打开,导致内存白白消耗,你的程序最终会因为打开连接的最大数量而失败到达。连接应该在 finally block 中关闭,或者使用自 Java 7 以来可用的 try-with-resources 结构。ResultSets 和语句也应该关闭,尽管不关闭它们不像不关闭连接那样有问题。
  • Class.forName().newInstance() 对于足够新的驱动程序和 JVM 应该不是必需的
  • 选择的类型很奇怪。例如,价格存储在可为 null 的 Double 变量中。但是你使用永远不会返回 null 的 getDouble() 来获取它的值。此外,使用 double 作为价格也是一个糟糕的选择。请改用 BigDecimal。
  • 使用select * 是一种不好的做法。选择所需的列,而不是所有列。

我不会概括为每个表创建一个类。很多时候,您不会查询单个表中的所有列,而是查询多个联接表的某些列。

我还会考虑使用 ORM (JPA) 而不是 JDBC。这将使您的代码更简洁、更短、更易读且更安全。

关于java - 从结果集中创建对象。我这样做对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392832/

相关文章:

java - 如何在 Android 应用程序中使用 AsYouTypeFormatter TextWatcher?

java 连接到 VirtualBox Oracle 服务器不起作用

java - 如何在不使用事务的情况下使用 JDBC/jTDS 执行存储过程?

java - 执行匿名 pl/sql block 并在 java 中获取结果集

java - 在android后台下载图像

java - 映射与 Hibernate 的关系

java - 如何获取结果集中的列表?

java - 如何使用 Java 中的 ResultSet 获取行数?

java - 将ResultSet放入HashMap?

java - Libgdx 中的返回键