【JDBC】数据库事务

之前因为教师断了一次网,然后又开始学前端,和js做了一个多月的斗争,回过神要讲Spring了才发现博客已经冷了很久了。。。慢慢补上吧

今天先把数据库事务的一个案例记一下,也是前几个星期刚刚才会写的。。


package mjy.kuguan.ruku.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.Date;

import mjy.common.util.jdbc.JdbcUtil;
import mjy.common.util.jdbc.TransactionManager;
import mjy.kuguan.ruku.dao.RukuUserDao;
import mjy.kuguan.ruku.po.DiaoborukuPO;

/**
 * 调拨单用事务:调拨入库单删除 与 已完成入库表插入
 * @author student
 *
 */
public class DiaoboTransaction {
	//设置本类入库类型显示内容
	private final String RUKU_TYPE = "调拨入库";
	
	private Connection conn;
	private PreparedStatement prep;
	private TransactionManager transactionManager;
	private RukuUserDao rukuUserDao = new RukuUserDaoImpl();
	
	/**
	 * 【事务操作】
	 * 将该条调拨入库单1.插入入库完成表 2.从采购入库表中删除
	 * @param diaoborukuPO
	 * @param wanchengChecker
	 */
	public void diaoboruku(int diaoboBossId, DiaoborukuPO diaoborukuPO, int wanchengChecker){
		//获取连接
		conn = JdbcUtil.getConnection();

		//将连接部署于事务管理
		transactionManager = JdbcUtil.getTransactionManager();
		
		//开启事务,关闭自动提交
		transactionManager.startTransaction();
		
		/*	事务执行主体	*/
		
		//插入语句
		String sqlInsert = "insert into kuguan_rukuwancheng values(?,?,?,?,?,?,?,?,?,?,?)";
		//删除语句
		String sqlDelete = "delete from kuguan_diaoboruku where diaoboBossId = ? and diaoboCode = ?";
		
		try {
			//执行插入操作
			prep = conn.prepareStatement(sqlInsert);
			prep.setString(1, Thread.currentThread().hashCode() + "-" + System.currentTimeMillis());
			prep.setInt(2, diaoboBossId);
			prep.setString(3, diaoborukuPO.getDiaoboCode());			//设置入库单编号
			prep.setString(4, diaoborukuPO.getDiaoboDiaobodanCode());	//设置相关单据号
			prep.setString(5, RUKU_TYPE); 								//设置入库类型
			prep.setInt(6, diaoborukuPO.getDiaoboInCount()); 			//设置入库数量
			prep.setString(7, diaoborukuPO.getDiaoboSetTime()); 		//设置制单时间
			prep.setInt(8, rukuUserDao.getSelectIdByName(diaoborukuPO.getDiaoboAuthor()).get(0)); 			//设置制单人
			prep.setInt(9, wanchengChecker); 						//设置确认人(唯一输入项)
			prep.setString(10, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));//设置确认时间
			prep.setString(11, diaoborukuPO.getDiaoboNote()); 			//设置本单备注
			prep.executeUpdate();
			
			//int i=1/0;	//测试
			
			//执行删除操作
			prep = conn.prepareStatement(sqlDelete);
			prep.setInt(1, diaoboBossId);
			prep.setString(2, diaoborukuPO.getDiaoboCode());
			prep.executeUpdate();
			
		} catch (Exception e) {//此处Exception应包含上述所有可能异常
			// 期间出现异常时,回滚&释放链接
			transactionManager.rollbackAndClose();
			e.printStackTrace();
			return;//防止运行finally
		} finally {
			//无异常则提交
			transactionManager.commitAndClose();
		}
	}
}


这是做上一个项目的时候用到的一个事务,功能是一张调拨单确认入库时将数据从待入库表删除,加入已入库表。
框架还没学完也不知道Spring下的事务该怎么写,不过好歹会写原生了。。。原理虽然是这么个原理不过大概以后不会这么写吧,权当入门练习了。。

用到的TransactionManager类也贴一下:

package mjy.common.util.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * �������Ӷ�����ύ ���ع� ����������Ȳ���
 * @author igeek
 *
 */
public class TransactionManager {
	private Connection connection = null;
	
	public TransactionManager(Connection connection){
		this.connection=connection;
	}
	
	
	/**
	 * ��������
	 */
	public void startTransaction(){
		try {
			connection.setAutoCommit(false);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * �ύ����
	 */
	public void commitAndClose(){
		
		try {
			connection.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JdbcUtil.free(connection);
		}
		
	}
	
	/**
	 * �ع�����
	 */
	public void rollbackAndClose(){
		try {
			connection.rollback();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JdbcUtil.free(connection);
		}
		
	}
	
}

其他组写的工具类编码用的gbk转utf-8的乱码,注释都能猜得出来就不改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值