0

私は 2 年間 Java に関する知識を向上させてきました。今日、データベースの作業を開始しました。DatabaseConnection と UserModel.Databaseconnection クラスの 2 つのクラスがあり、接続操作があり、UserModel はメソッドを追加、削除、更新します。 「削除と更新のコードはまだ書きません。追加メソッドだけを書きました。しかし、それはユーザーに追加されます。それについて多くの考えを検索しましたが、修正できません。」

これは私の接続クラスです:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.beans.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

/**
 *
 * @author KHn
 */
public abstract class DatabaseConnection {
    private Connection connect;
    private static final String dbUsername="root";
    private static final String dbPassword="";
    private static final String dbName="virtualblog";
    private static final String dbHost="jdbc:mysql://localhost:3306/";
    private String driver="com.mysql.jdbc.Driver";
    private Statement st;
    private ResultSet rs;
    /** Creates a new instance of DatabaseConnection */
    public DatabaseConnection(){
        try { 
        Class.forName(this.driver).newInstance();
        setConnect((Connection)DriverManager.getConnection(dbHost+dbName,dbUsername,dbPassword));

        } catch (Exception e) {
            System.out.println(e);
        }
    }
    public Connection getConnect() {
        return connect;
    }

    public void setConnect(Connection connect) {
        this.connect = connect;
    }



}

さらに、これは UserModelClass です。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.beans.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

    /**
 *
 * @author KHn
 */
@ManagedBean
@RequestScoped
public class UserModel extends DatabaseConnection{
    private PreparedStatement ps;
    private Statement st;
    private ResultSet ts;
    Register member =new Register();
    public Register getUser() {
        return member;
    }
    public void setUser(Register member) {
        this.member = member;
    }
    public boolean addUser(){
        try{
            ps=(PreparedStatement)getConnect().prepareStatement("INSERT INTO `members`(`id`, `username`, `email`, `password`, `name`, `avatar`, `blogname`) VALUES (null,?,?,'3694406','kaan','asdasd','blog adi')");
            ps.setString(2, member.getUsername());
            ps.setString(3, member.getEmail());
            ps.executeUpdate();
        }catch (Exception e) {
            System.err.println("ekleme hatasi: "+e);
        }
        return true;
    }
/** Creates a new instance of UserModel */
    public UserModel() {
    }
}

私はどこで間違ったのですか?それについて教えていただけませんか。よろしくお願いいたします。

4

1 に答える 1

0

JDBC 接続がトランザクション モードになっている可能性があります。つまり、接続を介して渡された (複数の) クエリは、接続がコミットされた (または閉じられた) ときにのみ実際に (分離して) 実行されます。

だから、呼び出すconnection.commit()か、それconnection.close()を行う必要があります。

コードに大きな設計ミスがあるだけで、これを適切に実装するのが難しくなります。基本的にすべて書き直す必要があります。まず、 のような高価な DB リソースを、クラスのインスタンス変数として持つべきではありConnectionませStatementResultSet。それらは、可能な限り短いスコープで、できれば SQL クエリを実行している場所とまったく同じメソッド ブロックで、宣言、取得、およびクローズする必要があります。また、すべての JDBC ジョブはマネージド Bean ではなく、別の DAO クラスに属します。addUser()最終的にメソッドで次のようになるように、DAO コードをそのように設計する必要があります。

public void addUser() throws SQLException {
    memberDAO.create(member);
}

さらに一歩踏み出すには、EJB/JPA も学習することを検討してください。EJB では、トランザクションをより細かく制御でき、デフォルトの動作が適切で (たとえば、リクエストの最後まで自動コミット)、JPA によって JDBC ボイラープレート コードが少なくなり、基本的にすべての JDBC コードをワンライナーに置き換えることができます。

于 2012-04-18T20:22:10.680 に答える