Java實現Dbhelper支援大資料增刪改_java

來源:互聯網
上載者:User

在做項目的時候,技術選型很重要,在底層的方法直接影響了我們對大資料訪問以及修改的速度,在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();        } } 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.