jdbc实现事物管理并搬表
admin
2023-02-19 07:00:05
0次

本文实现旧库中的数据搬到新库中

1、获取jdbc连接

package com.transferdata;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.Connection;

public class ConnectionUtils {
	public Connection getOldConn() {
	    String driver = "com.mysql.jdbc.Driver";
	    String url = "jdbc:mysql://localhost:3306/old?useUnicode=true&characterEncoding=utf-8";
	    String username = "root";
	    String password = "123456";
	    Connection conn = null;
	    try {
	        Class.forName(driver); //classLoader,加载对应驱动
	        conn = (Connection) DriverManager.getConnection(url, username, password);
	    } catch (ClassNotFoundException e) {
	        e.printStackTrace();
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return conn;
	}
	
	public Connection getNewConn() {
	    String driver = "com.mysql.jdbc.Driver";
	    String url = "jdbc:mysql://localhost:3306/new?useUnicode=true&characterEncoding=utf-8";
	    String username = "root";
	    String password = "123456";
	    Connection conn = null;
	    try {
	        Class.forName(driver); //classLoader,加载对应驱动
	        conn = (Connection) DriverManager.getConnection(url, username, password);
	    } catch (ClassNotFoundException e) {
	        e.printStackTrace();
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return conn;
	}
	
	public void closeConnection(Connection conn){  
        // 判断conn是否为空  
        if(conn != null){  
            try {  
                conn.close();   // 关闭数据库连接  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
    }
}

2、获取老的数据

package com.transferdata;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.entity.Customer;

public class GetOldData {

	private Connection oldConn;
	public GetOldData(Connection oldConn){
		this.oldConn = oldConn;
	}
	
	public List getCustomerList() { 
	    List customerList = new ArrayList();
	    String sql = "select * from customer";
	    PreparedStatement pstmt;
	    try {
	        pstmt = (PreparedStatement)oldConn.prepareStatement(sql);
	        ResultSet rs = pstmt.executeQuery();
	        while (rs.next()) {
            	Customer customer = new Customer();
            	customer.setId(rs.getString("id"));
            	customer.setEmail(rs.getString("email"));
            	customer.setIdcardNo(rs.getString("idcard_no"));
            	customer.setLoginName(rs.getString("login_name"));
            	customer.setMobileNo(rs.getString("mobile_no"));
            	customer.setPassword(rs.getString("password"));
            	customer.setRealName(rs.getString("real_name"));
            	customer.setRecomerMoNo(rs.getString("recomer_mo_no"));
                
                customerList.add(customer);
	                
	        }
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return customerList;
	}
	
	

}

3、实体类

package com.entity;

public class Customer {


	private String id;
	private String loginName;
	private String mobileNo;
	private String recomerMoNo;
	private String realName;
	private String email;
	private String idcardNo;
	private String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getLoginName() {
		return loginName;
	}
	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}
	public String getMobileNo() {
		return mobileNo;
	}
	public void setMobileNo(String mobileNo) {
		this.mobileNo = mobileNo;
	}
	public String getRecomerMoNo() {
		return recomerMoNo;
	}
	public void setRecomerMoNo(String recomerMoNo) {
		this.recomerMoNo = recomerMoNo;
	}
	public String getRealName() {
		return realName;
	}
	public void setRealName(String realName) {
		this.realName = realName;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getIdcardNo() {
		return idcardNo;
	}
	public void setIdcardNo(String idcardNo) {
		this.idcardNo = idcardNo;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	

}

4、插入新库

用throws Exception,而不用try/catch,目的是将异常全部抛到外层

如果用try/catch ,外层将不能捕获异常,不会执行回滚操作,这点注意

package com.transferdata;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.List;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

import com.entity.Customer;

public class InsertNewSchame {

	private Connection newConn;
	public InsertNewSchame(Connection newConn){
		this.newConn = newConn;
	}
	
	
	/*
	 * 用throws Exception,而不用try/catch,目的是将异常全部抛到外层
	 */
	public boolean insertCustomer(Customer customer, String id) throws Exception{
	// account_id\mobile_app_info\zhima_score\device_token
	    String sqlInsert = "INSERT INTO adm_sys_customer(email,idcard_no,login_name,mobile_no,password,real_name) "
	    		   + "VALUES (?,?,?,?,?,?)";
	    PreparedStatement pstmt;
	   
	        pstmt = (PreparedStatement) newConn.prepareStatement(sqlInsert);
	        pstmt.setString(1, customer.getEmail());
	        pstmt.setString(2, customer.getIdcardNo());
	        pstmt.setString(3, customer.getLoginName());
	        pstmt.setString(4, customer.getMobileNo());
	        pstmt.setString(5, customer.getPassword());
	        pstmt.setString(6, customer.getRealName());
	        
	        pstmt.executeUpdate();      
	        pstmt.close();
	   
	    return true;
	    
	}
	
}

5、测试

外层捕获异常后执行回滚操作

package com.zkbc.transferdata;
import java.sql.SQLException;
import java.util.List;

import com.mysql.jdbc.Connection;
import com..entity.Customer;
public class Testtest {


        /*
	 * 外层捕获异常后执行回滚操作
	 */
	public static void main(String args[]) {
		ConnectionUtils ConnectionUtils = new ConnectionUtils();
		Connection oldConn = ConnectionUtils.getOldConn();
		Connection newConn = ConnectionUtils.getNewConn();
		
		GetOldData oldData = new GetOldData(oldConn);
		InsertNewSchame newData = new InsertNewSchame(newConn);
		try{
			oldConn.setAutoCommit(false);
			newConn.setAutoCommit(false);
			String cuId = "0";
			List customerList = oldData.getCustomerList();
			for(Customer customer:customerList) {
				cuId = (Integer.parseInt(cuId) + 1) + "";
				//customer表和credit表
				newData.insertCustomer(customer, cuId);
			}
			
			oldConn.commit();
			newConn.commit();
		}catch(Exception e) {
			e.printStackTrace();
			try {
				oldConn.rollback();
				newConn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}finally {
			try {
				oldConn.setAutoCommit(true);
				newConn.setAutoCommit(true);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			ConnectionUtils.closeConnection(oldConn);
			ConnectionUtils.closeConnection(newConn);
			
		}	
	}

}


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...