使用DAO和单例,代码问题

时间:2012-04-19 20:49:04

标签: java mysql database singleton dao

也许有人可以帮助我。我正在使用数据访问对象。 我有一个数据库: 表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);}

然后我创建了一个ExpensesDao类,它实现了Dao并在其中创建了一个单例(我也设置了与数据库的连接,但我将跳过该部分)并通过使得可以使用数据库来覆盖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,它在我的数据库中引用了Target。 有谁知道我的代码中出了什么问题以及我应该改变什么。附:我希望我说得够清楚。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

将getName添加到recieverz并更改为此ex.getReceiverz(2).getName()

答案 2 :(得分:0)

有点offtopic,但我建议使用double checked locking singleton代码来避免初始化中的所有并发问题。

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