Java 实现Dbhelper 支持大数据增删改

引言


在做项目的时候,技术选型很重要,在底层的方法直接影响了我们对大数据访问以及修改的速度,在Java中有很多优秀的ORM框架,比如说:JPA,Hibernate 等等,正如我们所说的,框架有框架的好处,当然也存在一些可以改进的地方,这个时候,就需要我们针对于不同的业务不同的需求,不同的访问量,对底层的架构重新封装,来支持大数据增删改。


代码:


import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.jsp.jstl.sql.*;

/**
 * DbHelper
 * @author qmx
 *
 */
public class Dbhelper {
   
private String sql;    //要传入的sql语句    
public void setSql(String sql) {
	this.sql = sql;
}
  
private List sqlValues;  //sql语句的参数
public void setSqlValues(List sqlValues) {
	this.sqlValues = sqlValues;
}


private List<List> sqlValue;  //sql语句的参数
public void setSqlValue(List<List> sqlValues) {
	this.sqlValue = sqlValues;
}

private Connection con;  //连接对象
	public void setCon(Connection con) {
	this.con = con;
}

	public Dbhelper(){
		this.con=getConnection();  //给Connection的对象赋初值
	}
	
	/**
	 * 获取数据库连接
	 * @return
	 */
    private  Connection getConnection(){ 
 
    	String driver_class=null;
    	String driver_url=null;
    	String database_user=null;
    	String database_password=null;
    	try {
    		InputStream fis=this.getClass().getResourceAsStream("/db.properties");  //加载数据库配置文件到内存中
    		Properties p=new Properties();
    		p.load(fis);
    		
    		driver_class=p.getProperty("driver_class");      //获取数据库配置文件
    		driver_url=p.getProperty("driver_url");
    		database_user=p.getProperty("database_user");
    		database_password=p.getProperty("database_password");
    
    		
			Class.forName(driver_class);
			con=DriverManager.getConnection(driver_url,database_user,database_password);
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
    }
    
  
    

    /**
     * 关闭数据库
     * @param con
     * @param pst
     * @param rst
     */
    private  void closeAll(Connection con,PreparedStatement pst,ResultSet rst){
    	if(rst!=null){
    		try {
				rst.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	if(pst!=null){
    		try {
				pst.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	if(con!=null){
    		try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	
    }
    

    /**
     * 关闭数据库
     * @param con
     * @param pst
     * @param rst
     */
    private  void closeAll(Connection con,Statement pst,ResultSet rst){
    	if(rst!=null){
    		try {
				rst.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	if(pst!=null){
    		try {
				pst.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	if(con!=null){
    		try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	
    	
    }
    
    /**
     * 查找
     * @param sql
     * @param sqlValues
     * @return
     */
    public  Result executeQuery(){
    	Result result=null;
    	ResultSet rst=null;
    	PreparedStatement pst=null;
    	try {
    	
			pst=con.prepareStatement(sql);
			if(sqlValues!=null&&sqlValues.size()>0){  //当sql语句中存在占位符时
				setSqlValues(pst,sqlValues);
			}
	    rst=pst.executeQuery();
	    result=ResultSupport.toResult(rst);  //一定要在关闭数据库之前完成转换
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			this.closeAll(con, pst, rst);
		}
		
    	return result;
    }
    
    
    /**
     * 增删改
     * @return
     */
    public int executeUpdate(){
    	int result=-1;
    	PreparedStatement pst=null;
        try {
			pst=con.prepareStatement(sql);
			if(sqlValues!=null&&sqlValues.size()>0){  //当sql语句中存在占位符时
				setSqlValues(pst,sqlValues);
			}
		result=pst.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			this.closeAll(con, pst, null);
		}       	
    	return result;
    }
    
    
    /**
     * 使用PreparedStatement加批量的方法
     * @return
     */
    public int[] executeUpdateMore(){    
    	int[] result=null;    	
    	try{   
    		PreparedStatement prest =con.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
    	     for(List sqlValueString : sqlValue){    	    
    	    	 for(int i=0;i<sqlValueString.size();i++){
    	     		try {
    	     			prest.setObject(i+1,sqlValueString.get(i));
    	 			} catch (SQLException e) {
    	 				// TODO Auto-generated catch block
    	 				e.printStackTrace();
    	 			}    	 				   	 			
    	     	}
    	    	prest.addBatch();
    	     }
    	     prest.executeBatch();  
    	 /*    con.commit();*/   
    	     this.closeAll(con, prest, null);
    	} catch (SQLException ex){   
    	  Logger.getLogger(Dbhelper.class.getName()).log(Level.SEVERE, null,ex);   
    	} 
    	return result;
        
    } 
    
    /**
     * 使用PreparedStatement加批量的方法,strvalue:
     * "INSERT INTOadlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3','localhost','20081009',8,'23123')"
     * @return
     * @throws SQLException 
     */
    public int[] executeUpdateMoreNotAuto() throws SQLException{      
    	int[] result =null;
	    con.setAutoCommit(false);   
	    Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
	                                       ResultSet.CONCUR_READ_ONLY);   
	    String[] SqlString= null;
	    for(String strvalue : SqlString){   	    	
	       stmt.execute(strvalue);   
	    }   
	    con.commit(); 
	    return result;
    }
    
    
    
    /**
     * 使用PreparedStatement加批量的方法,strvalue:
     * "INSERT INTOadlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3','localhost','20081009',8,'23123')"
     * @return
     * @throws SQLException 
     */
    public int[] executeMoreNotAuto() throws SQLException{      
    	//保存当前自动提交模式
    	Boolean booleanautoCommit=false;
    	String[] SqlString= null;
    	int[] result= null;
    	 try
    	 {
	    	booleanautoCommit=con.getAutoCommit();
	    	 //关闭自动提交
	    	con.setAutoCommit(false);
	    	Statement stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
                    ResultSet.CONCUR_READ_ONLY); 
	    	//使用Statement同时收集多条sql语句
	    	/*stmt.addBatch(insert_sql1);
	    	stmt.addBatch(insert_sql2);
	    	stmt.addBatch(update_sql3);*/
	    	for(String strvalue : SqlString){   	    	
	 	       stmt.addBatch(strvalue);   
	 	    } 
	    	
	    	 //同时提交所有的sql语句
	    	  stmt.executeBatch();
	    	  //提交修改
	    	  con.commit();
	    	  con.setAutoCommit(booleanautoCommit);
	    	  this.closeAll(con, stmt, null);
    	 }
    	 catch(Exception e)
    	 {
    	    e.printStackTrace();
    	    con.rollback();   //设定setAutoCommit(false)没有在catch中进行Connection的rollBack操作,操作的表就会被锁住,造成数据库死锁
    	 }
    	 return result;
    }
    
    
    
    /**
     * 给sql语句中的占位符赋值
     * @param pst
     * @param sqlValues
     */
    private void setSqlValues(PreparedStatement pst,List sqlValues){
    	for(int i=0;i<sqlValues.size();i++){
    		try {
				pst.setObject(i+1,sqlValues.get(i));
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    }
       
}

我们的在db.properties中写入访问数据库的信息:


driver_class=com.mysql.jdbc.Driver
driver_url=jdbc:mysql://192.168.22.246:3306/importexceltest
database_user=basic
database_password=basic

测试:


import java.util.*;

public class ImportExcelTest {
	public static void main(String[] args){
	
		/*Dbhelper db = new Dbhelper();
		String sql = "insert into tb_coursetype(id,courseTypeName) values('2012003','qmx3')";
		db.setSql(sql);
		db.executeUpdate();*/
		
		/*Dbhelper db1 = new Dbhelper();
		String sql1 = "insert into tb_coursetype(id,courseTypeName) values(?,?)";
		List sqlValues = new ArrayList();
		sqlValues.add("2012004");
		sqlValues.add("qmx4");
		db1.setSqlValues(sqlValues);
		db1.setSql(sql1);
		db1.executeUpdate();*/
		
		
		Dbhelper db = new Dbhelper();
		String sql = "insert into tb_coursetype(id,courseTypeName) values(?,?)";
		List<List> sqlValues = new ArrayList();
		List sqlValueString =new ArrayList();
		sqlValueString.add("2012010");
		sqlValueString.add("qmx10");
		sqlValues.add(sqlValueString);
		List sqlValueString1 =new ArrayList();
		sqlValueString1.add("2012011");
		sqlValueString1.add("qmx11");
		sqlValues.add(sqlValueString1);
		List sqlValueString2 =new ArrayList();
		sqlValueString2.add("2012012");
		sqlValueString2.add("qmx12");
		sqlValues.add(sqlValueString2);
		List sqlValueString3 =new ArrayList();
		sqlValueString3.add("2012013");
		sqlValueString3.add("qmx13");
		sqlValues.add(sqlValueString3);
		db.setSqlValue(sqlValues);
		db.setSql(sql);
		db.executeUpdateMore();
		
	}
}




你可能感兴趣的:(sql,大数据,DbHelper)