使用QueryRunner类实现更新

使用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);

}

}

}

使用QueryRunner类实现更新

文章来源:Java培训

上一篇:异常处理


下一篇:任务调度 Quartz