1

なぜエラーが発生するのですか?私は何をすべきか?Java EE(jsdk)とclasses12をintellijに追加し、classes12をtomcatのlibディレクトリに追加しました。これはDataAccessLayerです。

public class DataBase {
    private Connection connection;
    private PreparedStatement statement;

    public DataBase() throws ClassNotFoundException, SQLException {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "SYSTEM", "1234");
    }

    public void insertOrUpdateOrDelete(String sqlQuery) throws SQLException {
        statement = connection.prepareStatement(sqlQuery);
        statement.executeUpdate();
    }

    public ResultSet select(String sqlQuery) throws SQLException {
        statement = connection.prepareStatement(sqlQuery);
        ResultSet resultSet = statement.executeQuery();
        return resultSet;
    }

    public void disconnect() throws SQLException {
        statement.close();
        connection.close();
    }
}

このクラスは、データベースクラスから使用します。

public class Users {
 DataBase dataBase;
    public Users() throws ClassNotFoundException, SQLException {
        dataBase = new DataBase();
    }

    public void addUser(HttpServletRequest request) throws SQLException {

        String sqlQuery = "insert into users (name,family,email,tel,password) values('" + request.getParameter("name") + "','" + request.getParameter("family") + "','" + request.getParameter("email") + "','" + request.getParameter("tel") + "','" + request.getParameter("password") + "')";
        dataBase.insertOrUpdateOrDelete(sqlQuery);
        dataBase.disconnect();
    }

そして、これは私の登録jspページです。どのユーザーが送信ボタンをクリックしたかを確認し、データベースに保存します。

<%
        if (request.getParameter("name") != null) {
            try {
                Users user = new Users();
                user.addUser(request);

            } catch (Exception error) {
                error.printStackTrace();

            }

        }

%>
        <form id="RegisterForm" action="Regist.jsp" method="post">
            <div>
                <div class="wrapper">
                    <div class="bg"><input type="text" class="input" name="name"/></div>
                    Name:<br/>
                </div>
                <div class="wrapper">
                    <div class="bg"><input type="text" class="input" name="family"/></div>
                    Family:<br/>
                </div>
                <div class="wrapper">
                    <div class="bg"><input type="text" class="input" name="email"/></div>
                    E-mail:<br/>
                </div>
                <div class="wrapper">
                    <div class="bg"><input type="password" class="input" name="password"/></div>
                    Password:<br/>
                </div>
                <div class="wrapper">
                    <div class="bg"><input type="text" class="input" name="tel"/></div>
                    Tel:<br/>
                </div>


                <input Class="button1" type="submit" value="SUBMIT"/>
                <input Class="button1" type="reset" value="RESET"/>

            </div>
        </form>

しかし、私には例外があります

Exceptions :
java.sql.SQLException: ORA-01400: cannot insert NULL into ("SYSTEM"."USERS"."ID")

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:304)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:271)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:625)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181)
    at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:791)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1032)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2884)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2956)
    at airAgency.DataBase.insertOrUpdateOrDelete(DataBase.java:24)
    at airAgency.Users.addUser(Users.java:24)
    at org.apache.jsp.Regist_jsp._jspService(Regist_jsp.java:125)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:619)
4

1 に答える 1

4

エラーメッセージは、問題が何であるかを説明しています。

cannot insert NULL into ("SYSTEM"."USERS"."ID")

usersテーブルにIDという名前のnull許容でない列がありますが、この列には何も挿入されていないため、データベースは文句を言います。

また、コードはプリペアドステートメントを間違った方法で使用する完璧な例であるため、SQLインジェクション攻撃を受ける可能性があります。クエリにはパラメータが必要です。パラメータはバインドする必要があります。

insert into users (name,family,email,tel,password) values(?, ?, ?, ?, ?)

たとえば、私の名前がO'Reillyの場合、クエリは構文エラーで失敗します。そして、それは潜在的な問題の中で最も少ないものです。

JDBCチュートリアルでプリペアドステートメントについて読んでください。

于 2012-07-30T21:48:59.143 に答える