2 qq 34573155 qq_34573155 于 2016.04.27 09:43 提问

JDBC使用占位符的插入语句插入不成功是什么原因
……
public static void insert(String name,String password) throws Exception{

          Connection conn = null;
          PreparedStatement st = null;
          ResultSet rs =null;
          conn = DbUtils.getConn();
        String sql="insert into User(name,password) values(?,?)";
        st = conn.prepareStatement(sql);

        st.setString(1,name);
        st.setString(2, password);
        int num = st.executeUpdate(sql);
                    if(num>0){
                     System.out.println("插入成功!!");
             }


                   DbUtils.release(conn, st, rs);
    }

        public static void main(String args[]) throws Exception{
    …… 
        IUserDao.insert("hello","89790");
    …… 
    }

}

+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| userID | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
一直报错,但是不知道是怎么错了。求教 orz
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?)' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
at com.mysql.jdbc.Util.getInstance(Util.java:387)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547)
at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1541)
at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2605)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1469)
at dao.IUserDao.insert(IUserDao.java:107)
at dao.IUserDao.main(IUserDao.java:120)

表名没错,id不是自增的,没有primarykey。把sql写死是可以插入的,用“?”就不行了,为什么呢?

3个回答

fk002008
fk002008   2016.04.27 10:12
已采纳

看看错误信息:
【You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?)' at line 1】
sql的语法错误了

st = conn.prepareStatement(sql);
这个已经将sql语句设置了

    st.setString(1,name);
    st.setString(2, password);

** int num = st.executeUpdate(sql);**
你这里就不要这个sql的参数了,不然认为你是按照sql中有值的方式不是占位符的方式来执行

int num = st.executeUpdate(sql);
改为
int num = st.executeUpdate();

qq_34573155
qq_34573155 原来如此!O(∩_∩)O谢谢
大约 2 年之前 回复
devmiao
devmiao   Ds   Rxr 2016.04.27 09:44

user是关键字,需要转义

qq_34573155
qq_34573155 回复qq_34573155: \' user\'
大约 2 年之前 回复
qq_34573155
qq_34573155 回复qq_34573155: 没有经过转义的查找方法也没出现问题
大约 2 年之前 回复
qq_34573155
qq_34573155 insert into user (name,password) values(?,?) 这样? 但好像还是没有解决。貌似不是这里的问题,而且没有转义过
大约 2 年之前 回复
w172087242
w172087242   Ds   Rxr 2016.04.27 10:08

我就想知道你的preparedstatement属于哪个包的?
是java.sql包下的吗?

qq_34573155
qq_34573155 是的。
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
jdbc之使用占位符的增删改查
package com.hanchao.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * jdbc学习总结二 * @author hanlw * 2012-07-09 */
java中占位符出错的问题
String content = MessageFormat.format("点击这里完成注册",form.getCode()); 当我使用上面这条语句时,code总为{0},也就是说占位符有问题,form.getcode(0)没有替换{0} 正确应这样写: String content = MessageFormat.format("点击这里完成注册",form.getCode()
对IN子查询使用绑定变量
 怎么对IN子查询使用绑定变量 怎么对IN子查询使用绑定变量在实际使用中,经常会有带in的子查询,如where id in (1,2,3)这样的情况,但是如果很多这样的语句在数据库中出现,将引起数据库的大量硬解析与共享池SQL碎片。所以,在实际应用中,可以采用其他方法,将这些in list给绑定起来。如果需要绑定in list,首先,需要创建两个类型(type):针对数据类型的CREATE
关于SQL语句的占位符使用及动态SQL
一、SQL占位符的使用 1、对于存储过程中占位符的使用: DECLARE BEGIN   SQL_STMT := 'select * from student where id=:1 and course = ''yw''';   EXECUTE IMMEDIATE SQL_STMT     INTO STU_REC     USING &1;  END; 2、直
sql语句中的#{}占位符和${}占位符
#方式能够很大程度防止sql注入;$方式无法防止Sql注入。
sqlite3 带占位符插入数据
//用问号形式插入数据 -(void) insertRecord:(NSString *)table                   withValue1:(NSString*) value1                   withValue2:(NSString*) value2                   withValue3:(NSString*) value3
JDBC中将一个变量加入SQL语句执行
很常见的一个问题。 使用JDBC编程时,我们有时需要输入的数据来更改数据库,这个数据是由用户输入的而提前不知情的。 这是,我们就应该使用PreparedStatement来进行动态SQL。 例如,我们通过sno删除学生表中的信息,把学号以形参传递给方法deleteOneStudent,实参由前台界面或者主类给出,代码如下:pstmt = con.prepareStatement("delete
jdbc中Statement与Preparestament的区别(从jdbc与数据库的方向来理解)
1.先了解下sql语句在数据库中的执行过程: 一、 基本阶段         当用户执行SQL语句(这里主要值数据操纵语言DML)时,通过连接,先将该语句发送到oracle服务器,再由服务器进程处理该语句。服务器进程处理SQL语句的基本阶段是:解析、执行、返回结果。     1、解析(perse)         解析指检查SQL语句的语法和语义,生成SQL语句的执行计
使用PreparedStatement为占位符?赋值
String sql="select * from student where name in (?,?)"; 在使用PreparedStatement ps为?赋值的时候,注意: 1.下标从1开始 2.赋值的时候不需要为字符串变量的两边加上'' 直接使用下面的形式 ps.setString(1, "dada"); ps.setString(2, "dandan"); 3.如果是下面
使用JDBC添加带参数的数据
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class TestDML2 ...{    public static void main(String