JDBC-04-笔记

本文展示了在Java中如何使用手动事务管理进行批量数据添加,通过Service层控制事务,确保数据操作的原子性。在DAO层,利用传递的Connection对象执行SQL语句。当遇到异常时,事务会回滚以保持数据一致性。
摘要由CSDN通过智能技术生成

案例演示-批量添加事务管理

事物管理在MySQL中有介绍:

  • 操作事务的三个步骤
    1. 开启事务:记录回滚点,并通知服务器,将要执行一组操作,要么同时成功、要么同时失败
    2. 执行sql语句:执行具体的一条或多条sql语句
    3. 结束事务(提交|回滚)
      • 提交:没出现问题,数据进行更新
      • 回滚:出现问题,数据恢复到开启事务时的状态
  • 将事务放到service来进行管理,需要注意因为一个事务是使用的同一个Connection,而且Connection对象是在dao层使用的对象,所以在service创建了一个Connection对象并传递给调用的dao层接口,以此来保证Connection对象的唯一。

1. service层

  • 接口

    /*
    	 批量添加
    */
    void batchAdd(List<User> users);
    
  • 实现类

    /*
          事务要控制在此处
    */
    @Override
    public void batchAdd(List<User> users) {
        //获取数据库连接
        Connection connection = JDBCUtils.getConnection();
        try {
            //开启事务
            connection.setAutoCommit(false);
            for (User user : users) {
                //1.创建ID,并把UUID中的-替换
                String uid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
                //2.给user的uid赋值
                user.setUid(uid);
                //3.生成员工编号
                user.setUcode(uid);
    
                //模拟异常
                //int n = 1 / 0;
    
                //4.保存
                userDao.save(connection,user);
            }
            //提交事务
            connection.commit();
        }catch (Exception e){
            try {
                //回滚事务
                connection.rollback();
            }catch (Exception ex){
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtils.close(connection,null,null);
        }
    }
    

2. dao层

  • 接口

    /**
    	支持事务的添加
    */
    void save(Connection connection,User user);
    
  • 实现类

    /*
           支持事务的添加
    */
    @Override
    public void save(Connection connection, User user) {
        //定义必要信息
        PreparedStatement pstm = null;
        try {
            //1.获取连接
            connection = JDBCUtils.getConnection();
            //2.获取操作对象
            pstm = connection.prepareStatement("insert into user(uid,ucode,loginname,password,username,gender,birthday,dutydate)values(?,?,?,?,?,?,?,?)");
            //3.设置参数
            pstm.setString(1,user.getUid());
            pstm.setString(2,user.getUcode());
            pstm.setString(3,user.getLoginname());
            pstm.setString(4,user.getPassword());
            pstm.setString(5,user.getUsername());
            pstm.setString(6,user.getGender());
            pstm.setDate(7,new Date(user.getBirthday().getTime()));
            pstm.setDate(8,new Date(user.getDutydate().getTime()));
            //4.执行sql语句,获取结果集
            pstm.executeUpdate();
        }catch (Exception e){
            throw new RuntimeException(e);
        }finally {
            JDBCUtils.close(null,pstm,null);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值