javamysql更新查询

javamysql更新查询,java,mysql,jdbc,Java,Mysql,Jdbc,我收到错误“无法发布数据” 这是SSCCE //package mysqltest; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.Applet; import java.awt.TextArea.*; import java.sql.*; import java.util.*; import javax.swing.plaf.*; import javax.swing.

我收到错误“无法发布数据”

这是SSCCE

//package mysqltest;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.Applet;
import java.awt.TextArea.*;
import java.sql.*;
import java.util.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.net.*;
import java.applet.*;

    public class test extends JApplet {

      public JTextArea c;

      public void init() {

          c = new JTextArea();

          add(c);
          c.append("Looking for database...");

        Connection conn = null;
        Properties props = new Properties();
        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "mystik";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "";
        String loggedusername = getParameter("name");
        try {
          Class.forName(driver).newInstance();
          props.put("user", "root");
          conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mystik", props);
          c.append("\nConnected to the database");


                        c.append("\nGetting stats for: " + loggedusername);
                        PreparedStatement statement = conn.prepareStatement( "select * from `user` where `username` = '"+loggedusername+"'");
                        ResultSet result = statement.executeQuery();
                        // just a dumb mysql statement!
                        while(result.next())
                        {
                        c.append("\nUsername: "+result.getString(2)+ "\nLevel: "+result.getString(6)+"\nEXP: "+result.getString(8)+"\n");
                        }

                        PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666'  where `username` = '"+loggedusername+"'");
                        ResultSet updateEXP_done = updateEXP.executeQuery();

                        while(result.next())
                        {
                        c.append("\nUsername: "+result.getString(2)+ "\nLevel: "+result.getString(6)+"\nEXP: "+result.getString(8)+"\n");
                        }


          conn.close();
          c.append("\nDisconnected from database");
        } catch (Exception e) {
          e.printStackTrace();
        }

      }

    }
而且它是有效的。。。只是
update
java查询没有

以下是JTextArea看到的内容:

Looking for database...
Connected to the database
Getting stats for: weka
Username: weka
Level: 1
EXP: 1
这是我的错误:

added manifest
adding: test.class(in = 2440) (out= 1308)(deflated 46%)
adding: mysql-connector-java-5.1.13-bin.jar(in = 767492) (out= 735869)(deflated
4%)

Warning:
The signer certificate will expire within six months.
java.sql.SQLException: Can not issue data manipulation statements with executeQu
ery().
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
        at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:436)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:
2176)
        at test.init(test.java:53)
        at sun.applet.AppletPanel.run(AppletPanel.java:424)
        at java.lang.Thread.run(Thread.java:619)
最后,这里是我如何使用.bat文件编译的

@ECHO OFF
C:
CD \wamp\www\mystikrpg\mysqltest
javac -cp mysql-connector-java-5.1.13-bin test.java
jar cvf mysqlTry.jar test.class mysql-connector-java-5.1.13-bin.jar
jarsigner -keystore dankey -storepass soccer -keypass soccer mysqlTry.jar gamerpg
appletviewer -J-Djava.security.policy=game.policy mysqltry.html
如何修复此错误? 谢谢。

作为文档:

执行此数据库中的SQL语句 PreparedStatement对象,它必须 可以是SQL插入、更新或删除 陈述或者一个SQL语句 不返回任何内容,例如DDL 声明

要执行更新、删除或插入数据库中任何数据的查询,您不能使用
executeQuery
。。。您必须使用:
.executeUpdate(查询)

所以这个代码(错了):

必须看起来像():

正确用法
根据Javadoc,DML查询(
INSERT
UPDATE
DELETE
)需要使用而不是使用来执行。它返回一个包含受影响行数的
int

PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666'  where `username` = '"+loggedusername+"'");
int affectedRows = updateEXP.executeUpdate();
这就是说,应该在
finally
块中关闭
conn
(和
语句
结果集
!),否则在调用
close()
之前抛出异常时,它仍将打开。您使用的
PreparedStatement
也是错误的。您仍然通过简单的字符串连接来内联列值,而不是将它们设置为参数化值。您没有利用它的SQL注入预防功能

另见:

<> >代码>执行更新(查询)<代码>,而不是<代码> ExcUTEQuices(<)/代码>

< P>也考虑使用用户名的参数:

PreparedStatement updateeExp=conn.prepareStatement(“更新
user
set
exp
='666',其中
username
=?”

updateEXP.setString(1,loggedusername)


ResultSet updateEXP_done=updateEXP.executeUpdate()

好的,谢谢!我得到了它。现在,当我调用第二个结果whiel循环时。。。它将不可见,并直接转到“断开与数据库的连接”。您只能使用一次准备好的语句吗?
ResultSet
next()
方法向前移动到下一行,在第一行
结束后,
ResultSet
位于末尾。如果要(再次)在
ResultSet
中查看,请调用
result.first()
   PreparedStatement updateEXP = conn.prepareStatement("update `user` set `exp` = ? ");
   updateEXP.setString(1, loggedusername);
   ResultSet updateEXP_done = updateEXP.executeUpdate();
PreparedStatement updateEXP = conn.prepareStatement( "update`user` set `exp` = '666'  where `username` = '"+loggedusername+"'");
int affectedRows = updateEXP.executeUpdate();