HCodeRunner 2016-08-25 15:02 采纳率: 20%
浏览 5055

关于preparedstatement.executeUpdate方法

我在自己写一个JDBC工具类。但卡在了update方法的实现。工具类目前的代码如下:
public final class HDBTools {

// 数据库url,username,password
private static String URL = "jdbc:mysql://localhost:3306/shiyan?" + "useUnicode=true&characterEncoding=UTF8";
private static String URN = "root";
private static String PSW = "root";

private static HDBTools hdb = null;
private HDBTools(){}


// 单例模式
public static HDBTools getHDBTools() {
    // 延迟加载
    if (hdb == null) {
        // 双重锁,防止多个线程同时访问
        synchronized (HDBTools.class) {
            // 双重锁,调度程序的偶然情况
            if (hdb == null) {
                hdb = new HDBTools();
            }
        }
    }
    return hdb;
}

// 静态代码块
static {
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

// 链接
private Connection conn = null;
// 结果集
private ResultSet resultSet = null;
// 语句
private PreparedStatement preparedstatement = null;

//get the connection of database
private Connection getConn() throws SQLException {
    return DriverManager.getConnection(URL, URN, PSW);
}

public List<Map<String,Object>> findAll(String sql,Object[] objs) throws SQLException{
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    conn = getConn();
    preparedstatement = (PreparedStatement) conn.prepareStatement(sql);
    for(int i = 0;i<objs.length;i++){
        preparedstatement.setObject(i+1, objs[i]);
    }
    resultSet = (ResultSet) preparedstatement.executeQuery();

    ResultSetMetaData rsmd = preparedstatement.getMetaData();
    // 取得结果集列数
    int columnCount = rsmd.getColumnCount();

    Map<String, Object> data = null;

    while(resultSet.next()){
        data = new HashMap<String, Object>();
         // 每循环一条将列名和列值存入Map
        for (int i = 1; i < columnCount; i++) {
            data.put(rsmd.getColumnLabel(i), resultSet.getObject(rsmd.getColumnLabel(i)));
        }
        // 将整条数据的Map存入到List中
        list.add(data);

    }

    close(resultSet, preparedstatement, conn);

    return list;

}

public int update(String sql,Object[] objs) throws SQLException{
    conn = getConn();
    preparedstatement = (PreparedStatement) conn.prepareStatement(sql);
    for(int i = 0;i<objs.length;i++){
        preparedstatement.setObject(i+1, objs[i]);
    }
    System.out.println(preparedstatement);
    int rows = preparedstatement.executeUpdate(sql);

    close(resultSet, preparedstatement, conn);

    return rows;
}

public void close(ResultSet rs, PreparedStatement pst, Connection conn) {
    try {
        if (rs != null) {
            rs.close();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (pst != null) {
                pst.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

}

测试代码如下:

HDBTools hdbt = HDBTools.getHDBTools();
    int i = hdbt.update("insert into stu (name,address,money) values (?,?,?)", new Object[]{"hanshuai","changchun",10000});
    System.out.println(i);

运行测试代码,预处理完成的SQL语句以及出现的异常如下:

com.mysql.jdbc.PreparedStatement@14b2db7: insert into stu (name,address,money) values ('hanshuai','changchun',10000)
Exception in thread "main" com.mysql.jdbc.exceptions.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 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3243)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1343)
at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1260)
at com.shuai.utils.jdbc.HDBTools.update(HDBTools.java:101)
at com.shuai.utils.jdbc.Demo.main(Demo.java:12)

异常说,我的SQL 语句有问题,但是我将预处理后的SQL语句输出到控制台(见控制台结果第一行),将控制台SQL语句拷贝到SQL yang 中,运行数据添加成功。也就是说SQL语句没有问题。我感觉是我对preparedstatement.executeUpdate方法的理解出现了问题。希望各路大神不吝赐教。

  • 写回答

2条回答 默认 最新

  • threenewbee 2016-08-25 15:10
    关注

    money是关键字,需要转义
    用你数字键1左侧的那个单引号包裹money

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘