【问题标题】:Working wiith DAO and singleton, problems with code使用 DAO 和单例,代码问题
【发布时间】:2012-04-19 20:49:04
【问题描述】:

也许任何人都可以帮助我。我正在使用数据访问对象。 我有一个数据库: 表 Receiverz

num   name
 1    Walmart
 2    Target
 3    McDonalds

我已经为这个表创建了一个类

public class Receiverz {
private int num;
private String name;

public void setNum(int num) {
    this.num = num;
}

public void setName(String name) {
    this.name = name;
}

}

然后我创建了 Dao 接口并传递了一个方法给它:

public interface Dao {

Receiverz getReceiverz(int num);}

然后我创建了一个实现 Dao 的类 ExpensesDao 并在其中创建了一个单例(我也设置了与数据库的连接,但我将跳过该部分)并通过使其可以使用数据库来覆盖 getReceivers(int num) 方法:

public class ExpensesDao implements Dao {

private static Dao thisdao;
public static synchronized Dao getDao() {
    if (thisdao==null) {
        thisdao = new ExpensesDao();
    }
    return thisdao;
    }

@Override
public Receiverz getReceiverz(int num) {
    Receiverz receiver = new Receiverz();
    try {
        Statement stmt = myConnection.createStatement();
        ResultSet result = stmt.executeQuery("SELECT * FROM receiverz");
        while(result.next()){

            receiver.setNum(num);
            receiver.setName(result.getString(2));

            }

    }
        catch (SQLException e){
             System.out.println(e.getMessage());
         }
    return receiver;

}

当我尝试在主类中运行它时:

public class TryDatabase {

public static void main(String[] args) {
    Dao ex = ExpensesDao.getDao(); 
    System.out.println(ex.getReceiverz(2));

我得到的是:

listexpenses.Receiverz@193499fd

但我必须得到

2 Target

(因为我在参数中传递了 2 并且它引用了我的数据库中的目标。 有谁知道出了什么问题以及我应该在我的代码中更改什么。附:我希望我说得够清楚。

【问题讨论】:

    标签: java mysql database singleton dao


    【解决方案1】:

    ex.getReceiverz(2) 正在返回一个 Receiverz 对象。因此System.out.println(ex.getReceiverz(2)); 使用从java.lang.Object 继承的toString() 方法。在Receiverz 类中创建一个toString() 方法,它将按照您想要的方式输出。

    【讨论】:

    • 如果我理解正确,您真正需要做的是更改您的 SQL 查询。 "SELECT * FROM receiverz" 将从表中检索所有记录,因此 while 循环将遍历每条记录,并且表中的最后一个是设置的。只需将查询更改为"SELECT * FROM receiverz WHERE num = ?",然后使用PreparedStatement 执行查询。那么只有一个结果是正确的。
    【解决方案2】:

    将 getName 添加到您的接收者并更改为此 ex.getReceiverz(2).getName()

    【讨论】:

      【解决方案3】:

      有点离题,但我推荐double checked locking singleton 代码以避免初始化中的所有并发问题。

      Ps.:ex.getReceiverz(2).getName() 打破Law of Demeter,最好避免它。

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 2016-09-14
        • 1970-01-01
        • 2013-06-30
        相关资源
        最近更新 更多