有一条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 的方法很好啊,传过来多少参数,就循环拼接问号,很简单的啊