我这样写对吗,我感觉好怪异啊,没用过这个东西。
请老哥们,帮我看下改如何修改才能做到同时处理2条SQL
而且那格式化参数,我不知道怎么设置到数据库中,请老哥们帮忙纠正下,或者给个原例子看一下。
那个executeBatch是这样判断是否插入成功吗
谢谢了。
[code="java"]
public boolean InsertUpDeOrderData(CheckOutBean bean) {
String sql = "insert into tb_order values(?,?,?,?,?,?,?,?,?,?)";
String sq2 = "insert into tb_order_detail values(?,?,?,?,?,?)";
Object [] obj = {
bean.getUser_id(),bean.getCh_name(),bean.getAddress(),bean.getPostalcode(),
bean.getPhone(),bean.getMobile(),bean.getEmail(),bean.getSendtype(),
bean.getPaytype(),bean.getPostscript()
};
return this.InsertUpDeOrderData(sql,sq2,obj);
}
[/code]
这两个方法不在同一类中
[code="java"]
public boolean InsertUpDeOrderData(String sql,String sq2 ,Object [] obj){
con = DBUtil.getConnection();
int [] in = null;
boolean bool = true;
try {
con.setAutoCommit(false);
stm = con.prepareStatement(sql);
stm.addBatch(sql);
stm.addBatch(sq2);
if(obj != null){
for(int x = 0 ; x<obj.length ; x++){
stm.setObject(x+1, obj[x]);
}
}
in = stm.executeBatch();
for(int x = 0 ; x < in.length; x++){
if(in[x]<=0){
bool = false;
}
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.CloseAll(con, stm, rs);
}
return bool;
}
[/code]
[quote]这sq1 sq2 不能带参数是指 不能用 ? 号吗, 直接插入值啊? [/quote]
没错,PreparedStatement 用?是因为他要执行相同的sql语句(参数不同)多次。
PreparedStatement 表示预编译的 SQL 语句的对象。
SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。
你这个程序有2个大的问题:
1、PreparedStatement只能关联一个sql,对你这个功能无能为力;Statement可以关联多个sql。
2、判断是否失败,最后使用常量Statement.EXECUTE_FAILED。当然,大多数SQL出错直接就出异常了。
3、你这个代码好像忘记commit了。
你的这两条sql都只执行一次,不需要用PreparedStatement
直接用Connection.createStatement()方法
[code="java"]
stm = con.createStatement();
stm.addBatch(sql);
stm.addBatch(sq2);
[/code]
这时候sq1和sq2不能带参数
[code="java"]
String sql = "insert into tb_order values('xxx','yyy','zzz')";
String sq2 = "insert into tb_order_detail values('xxx','yyy','zzz')";
[/code]