0

私はこれがうまくいかないことを知っています.IMOを吸っていますが、私の最善の解決策は何だろうと思っています. いくつか検索した後、ORMと休止状態について知りました。それらについて知った後、私はそれが価値があるよりも面倒だと言い、怠惰を助長する多くの人々を見つけました. 誰かが私を良い方向に向けることができますか?

//Setup the weapon classes
logger.info("Initializing the weapon classes.");
stat = conn.prepareStatement("SELECT *" + 
                            " FROM " + DB_NAME + ".weapons");
rs = stat.executeQuery();
while (rs.next()) {
    Weapon rs.getString("name") = new Weapon(rs.getint("weapon_id"), rs.getString("name"), rs.getString("description"), rs.getString("filename"), rs.getint("rarity"), rs.getint("sell_price"), rs.getint("quantity_max"), rs.getint("slot"), rs.getint("level_requirement"), rs.getint("strength_requirement"), rs.getint("dexterity_requirement"), rs.getint("intelligence_requirement"), rs.getint("enchanted_increase"), rs.getint("enchanted_cost"), rs.getint("hit_min"), rs.getint("hit_max"), rs.getint("speed"), rs.getint("elemental_type"), rs.getint("elemental_hit_min"), rs.getint("elemental_hit_max"));
}

これは何度も質問されていることは知っていますが、矛盾した意見がたくさんあることに気づきました。:(

4

3 に答える 3

2

Mapを使用して、データベースから取得した武器のインスタンスを保存することをお勧めします。キーは名前で、値は Weapons クラスのインスタンスです。

何かのようなもの:

while(rs.next()){
    Weapon weapon = new Weapon(rs.getint("weapon_id"), rs.getString("name"), rs.getString("description"), rs.getString("filename"), rs.getint("rarity"), rs.getint("sell_price"), rs.getint("quantity_max"), rs.getint("slot"), rs.getint("level_requirement"), rs.getint("strength_requirement"), rs.getint("dexterity_requirement"), rs.getint("intelligence_requirement"), rs.getint("enchanted_increase"), rs.getint("enchanted_cost"), rs.getint("hit_min"), rs.getint("hit_max"), rs.getint("speed"), rs.getint("elemental_type"), rs.getint("elemental_hit_min"), rs.getint("elemental_hit_max"));
    //Assuming you have an instance of Map<String, Weapon>
    map.add(rs.getString("name"), weapon);
}
于 2012-11-07T06:03:20.223 に答える
1

ORM の使用は、プロジェクトのサイズによって異なります。個人的には、Java の理解度を考えると、今のところ休止状態などに移行することはお勧めしません。最初に SQL を直接操作して、永続性について理解を深めることをお勧めします。

投稿したコードについては、次のことができます。

//Setup the weapon classes
logger.info("Initializing the weapon classes.");
stat = conn.prepareStatement("SELECT *" + 
                            " FROM " + DB_NAME + ".weapons");

HashMap<String, Weapon> weapons = new HashMap<String, Weapon>();

rs = stat.executeQuery();
while (rs.next()) {
    Weapon weapon = new Weapon()
        .setId(rs.getint("weapon_id"))
        .setName(rs.getString("name"))
        .setDescription(rs.getString("description"))
        .setFilename(rs.getString("filename"))
        .setRarity(rs.getint("rarity"))
        .setSellPrice(rs.getint("sell_price"))
        .setQuantityMax(rs.getint("quantity_max"))
        .setSlot(rs.getint("slot"))
        .setLvlRequirement(rs.getint("level_requirement"))
        .setStrRequirement(rs.getint("strength_requirement"))
        .setDexRequirement(rs.getint("dexterity_requirement"))
        .setIntRequirement(rs.getint("intelligence_requirement"))
        .setEnchantedInc(rs.getint("enchanted_increase"))
        .setEnchantedCost(rs.getint("enchanted_cost"))
        .setHitMin(rs.getint("hit_min"))
        .setHitMax(rs.getint("hit_max"))
        .setSpeed(rs.getint("speed"))
        .setElementalType(rs.getint("elemental_type"))
        .setElementalHitMin(rs.getint("elemental_hit_min"))
        .setElementalHitMax(rs.getint("elemental_hit_max"));

    weapons.put(rs.getString("name"), weapon);
}

非常に多くの引数を持つコンストラクター (またはメソッド!) を持つことは避けてください。クラスをサードパーティにエクスポートしたり、一部のユーザー プラグインに公開したりして、誰も内部値を変更したくない場合を除き、セッターについて心配する必要はありません。次に、各set*メソッドが返さthisれるため、チェーンできるようになります。例えば ​​:

public Weapon setHitMax(int max) {
    this.hitMax = max;
    return this;
}

そして、 を使用して武器にアクセスできますMap。たとえば、次のようにします。

weapons.get("sword").getHitMax();
于 2012-11-07T06:08:44.627 に答える
0

「動的クラス作成」とは正確にはどういう意味ですか? コードから理解できることが 2 つあります。

a) あなたは本当に下手な Java プログラマーです :) または

b) データベースの行ごとに変数の名前を変えようとしている(これは意味がありません)

于 2012-11-07T06:03:11.640 に答える