使用QueryRunner类实现更新(增、删、改、批处理)
(1)更新
public int update(Connection conn, String sql, Object… params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。
public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
(2)插入
public <T> T insert(Connection conn,String sql,ResultSetHandler<T> rsh)throws SQLException:其中 rsh – The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自动生成的键值
public <T> T insert(Connection conn,String sql,ResultSetHandler<T> rsh, Object… params) throws SQLException:只支持INSERT
public <T> T insert(String sql,ResultSetHandler<T> rsh)throws SQLException:只支持INSERT
public <T> T insert(String sql,ResultSetHandler<T> rsh,Object… params)throws SQLException:只支持INSERT
(3)批处理
public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE语句
public int[] batch(String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE语句
public <T> T insertBatch(Connection conn,String sql,ResultSetHandler<T> rsh,Object[][] params)throws SQLException:只支持INSERT
public <T> T insertBatch(String sql,ResultSetHandler<T> rsh,Object[][] params)throws SQLException:只支持INSERT
(4)是否需要传递Connection?
A:不需要传递Connection对象:
前提是不考虑事务而且QueryRunner对象创建时指定数据源,这样在QueryRunner的所有增删改查方法中都会从数据源中自己获取连接
B:必须传递Connection对象
如果有事务,必须传递Connection对象,因为同一个事务的多条语句必须在一个Connection连接中完成
public static void main(String[] args) throws Exception{
//1、通过数据库连接池来获取连接
DataSource ds = new ComboPooledDataSource(“mypool”);
//2、传sql,并执行,并接收结果
String sql = “insert into t_goods(pname,price,description)values(?,?,?)”;
QueryRunner qr = new QueryRunner(ds);
int len = qr.update(sql, “电源”,78,”充电必备”);//自己到数据库连接池中拿连接
System.out.println(len>0?”添加成功”:”添加失败”);
}
public static void main(String[] args)throws Exception{
//1、通过数据库连接池来获取连接
DataSource ds = new ComboPooledDataSource(“mypool”);
QueryRunner qr = new QueryRunner();
//从web页面传过来,有这样的数据
int uid = 1;
int[] pids = {5,6,7};
int[] amount = {1,1,1};
double[] price = {560,58,68};
String sql1 = “insert into t_order(ordertime,sumprice,uid)values(now(),?,?)”;
String sql2 = “insert into t_detail(oid,pid,amount)values(?,?,?)”;
//2、获取连接
Connection conn = null;
try {
conn = ds.getConnection();
conn.setAutoCommit(false);//手动提交事务
double sumprice = 0;
for(int i=0; i<amount.length; i++){
sumprice += amount[i] * price[i];
}
//返回的是自增的键值
Object object = qr.insert(conn, sql1, new ScalarHandler(), sumprice,uid);
Object[][] params = new Object[pids.length][3];
for(int i=0;i<params.length;i++){
for(int j=0; j<params[i].length; j++){
params[i][0] = object;//订单编号
params[i][1] = pids[i];//产品编号
params[i][2] = amount[i];//每一件产品的数量
}
}
qr.insertBatch(conn, sql2, new ScalarHandler(), params);//如果没有自增的键值,那么返回值是null
//提交事务
conn.commit();
} catch (Exception e) {
//回滚事务
if(conn!=null){
conn.rollback();
}
} finally{
if(conn!=null){
//在关闭之前,要设置conn的事务方式为自动提交
conn.setAutoCommit(true);
//关闭连接
DbUtils.closeQuietly(conn);
}
}
}
文章来源:Java培训