Spring 中jdbcTemplate 实现执行多条sql语句示例

网友投稿 317 2023-06-18


Spring 中jdbcTemplate 实现执行多条sql语句示例

说一下Spring框架中使用jdbcTemplate实现多条sql语句的执行:

很多情况下我们需要处理一件事情的时候需要对多个表执行多个sql语句,比如淘宝下单时,我们确认付款时要对自己银行账户的表里减去订单所需的钱数,即需要更新银行账户的表,同时需要更新淘宝订单的表将订单状态改为“已付款”,这就需要先后执行多个sql(仅仅用于表达执行多的SQL的举例说明,具体淘宝如何实现并不是很清楚~~~~~); 但如果这中间出现电脑断网断电等问题,仅将我们银行账户的钱扣掉了,订单状态并没有改,那我们是不是很惨,但实际上我们并没有遇到这种情况对吧,下面我就来讲一下如何使用Spring 中jdbcTemplate 实现执行多条sql语句,而不出现这种情况

@Test

public void 权限分配(){

//1.客户端复选框传递过来一个数组1,2 菜单的ID

Integer[] menus =new Integer[]{1,2};

//2.声明sql数组

String [] sql =new String [menus.length+1];

//3.通过Role_id 200 删除表中数据

sql[0] = "delete from role_link_menu where fk_role_id=200";

//4新数据添加到中间表

for (int i=0;i

sql[i+1]="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200, "+menus[i]+")";

}

jdbcTemplate.batchUpdate(sql);

}

前提我们已经连接好数据库

这样我们一共执行了3条SQL语句

1.delete from role_link_menu where fk_role_id=2http://00

2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,1")";

3.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,2")";

这期间任一条SQL语句出现问题都会回滚[**]会所有语句没有执行前的最初状态^_^

对比下面一组代码,我们就可以发现其中不同

@Test

public void 权限分配单个处理() throws Exception{

//1.通过Role_id 200 删除表中数据

String sql = "delect from role_link_menu where fk_role_id=200";

jdbcTemplate.update(sql);

//2.客户端复选框传递过来一个数组1,2 菜单的id

Integer[] menus =new Integer[]{1,2};

//3.新数据添加到中间表

for (int i=0;i

String menu_sql="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,"+menus[i]+")";

if(i==1){

throw new Exception("=====");

}

jdbcTemplate.update(menu_sql);

}

}

这里当i=1会出现异常程序终止,共执行了2条语句

1.delect from role_link_menu where fk_role_id=200

2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,1)";

下面一句不会执行,但之前这两条执行完毕,就相当于本来我们要买啤酒喝炸鸡,账户钱扣了,结果就只给了你一罐啤酒,是不是郁闷捏,啊哈,反正我不会开心

滴~~~

**注:

回滚:事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。

例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。

如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事http://务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。

sql[i+1]="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200, "+menus[i]+")";

}

jdbcTemplate.batchUpdate(sql);

}

前提我们已经连接好数据库

这样我们一共执行了3条SQL语句

1.delete from role_link_menu where fk_role_id=2http://00

2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,1")";

3.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,2")";

这期间任一条SQL语句出现问题都会回滚[**]会所有语句没有执行前的最初状态^_^

对比下面一组代码,我们就可以发现其中不同

@Test

public void 权限分配单个处理() throws Exception{

//1.通过Role_id 200 删除表中数据

String sql = "delect from role_link_menu where fk_role_id=200";

jdbcTemplate.update(sql);

//2.客户端复选框传递过来一个数组1,2 菜单的id

Integer[] menus =new Integer[]{1,2};

//3.新数据添加到中间表

for (int i=0;i

String menu_sql="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,"+menus[i]+")";

if(i==1){

throw new Exception("=====");

}

jdbcTemplate.update(menu_sql);

}

}

这里当i=1会出现异常程序终止,共执行了2条语句

1.delect from role_link_menu where fk_role_id=200

2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,1)";

下面一句不会执行,但之前这两条执行完毕,就相当于本来我们要买啤酒喝炸鸡,账户钱扣了,结果就只给了你一罐啤酒,是不是郁闷捏,啊哈,反正我不会开心

滴~~~

**注:

回滚:事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。

例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。

如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事http://务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。

String menu_sql="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,"+menus[i]+")";

if(i==1){

throw new Exception("=====");

}

jdbcTemplate.update(menu_sql);

}

}

这里当i=1会出现异常程序终止,共执行了2条语句

1.delect from role_link_menu where fk_role_id=200

2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,1)";

下面一句不会执行,但之前这两条执行完毕,就相当于本来我们要买啤酒喝炸鸡,账户钱扣了,结果就只给了你一罐啤酒,是不是郁闷捏,啊哈,反正我不会开心

滴~~~

**注:

回滚:事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。

例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。

如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事http://务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringMVC基于注解的Controller详解
下一篇:bootstrap网格系统使用方法解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~