插入的sql语句因为数值不对应报错,怎么解决?

有一条sql插入语句,问号数比实际数要多,因为实际数不确定,所以我吧问号数写到最大,但有个问题,再插入实际数时有为null的数值,用PreparedStatement就无法执行,请问怎么完整的插入数据并不会报错?
public static void logToDB(String[] split) {
Connection conn=null;
PreparedStatement state=null;
JDBCUtilProperties.getValue("db.properties");//这是一个工具类
String sql = "insert into job values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
try {
conn = JDBCUtilProperties.getConnection();
state= conn.prepareStatement(sql);
System.out.println("split=="+split.length);
for(int i =0;i< split.length;i++){
state.setString(i+1,split[i] );//这条语句因为数值的不对应老是报错
}
int rows = state.executeUpdate();
if(rows!=0){
System.out.println("插入成功");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
// 4. 释放资源
JDBCUtilProperties.releaseResource(conn, state, null);
}

}

这是我的工具类

package com.user.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

/**
 * JDBC工具类
 * @author zkc
 *  @version 1.0 2017-09-21
 */
public class BaseDAO {
    /**
     * 连接对象
     */
    Connection conn = null;
    /**
     * 执行对象
     */
    PreparedStatement stmt = null;
    /**
     * 读取对象
     */
    ResultSet rs = null;

    /**
     * 获取连接对象
     * @return Connection
     */
    public Connection getConn(){
        try {
//          Class.forName("oracle.jdbc.driver.OracleDriver");
//          conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","zkc","123");

            Context ctx = new InitialContext();

            DataSource ds = (DataSource) ctx.lookup("java:comp/env/zkc");

            conn = ds.getConnection();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 增删改操作
     * @param sql
     * @param args
     * @return int
     */
    public int update(String sql,Object...args){
        int result = 0;
        try {
            conn = getConn();
            stmt = conn.prepareStatement(sql);

            for(int i=0;i<args.length;i++){
                stmt.setObject(i+1, args[i]);
            }

            result = stmt.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 关闭对象
     */
    public void close(){
        try {
            if(rs!=null){
                rs.close();
            }
            if(stmt!=null){
                stmt.close();
            }
            if(conn!=null){
                conn.close();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

我这里的update方法就不用限定参数个数,传多少参数就有多少问号,下面是具体用的例子

public boolean add(UserInfo user) {
        String sql = "insert into person values (?,?,?,?,?,?,?,?,?)";
        int result = update(sql,user.getAcc(),user.getPwd(),user.getName(),user.getSex(),user.getAge(),user.getIdcard(),user.getTel(),user.getAdd(),user.getEmail());
        boolean flag = true;
        if(result>0){
            System.out.println("添加成功");
            flag = true;
        }else{
            System.out.println("添加失败");
            flag = false;
        }

        close();
        return flag;
}

问号的数量必须和数据库中的列相对应。如果多出的列,则默认系统赋值为空。

数据库中有多少个列,问号就得有多少个列,相对应才行

你先把所有的列数统计出来,然后拼接?到sql里面

数据库中的列和问号的列是相对应的,没有多也没有少

你的SQL语法有问题,而且要插入的值和字段位置要对应上!

传的参数值split[]数组里的字段和SQL里的字段对应上就没问题,如果缺省就有问题,null值就传空,只要不违反非空约束就可以

@airfling 的方法很好啊,传过来多少参数,就循环拼接问号,很简单的啊