服务器之家

服务器之家 > 正文

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

时间:2020-03-25 13:28     来源/作者:邱慕夏

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

代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
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中写入访问数据库的信息:

?
1
2
3
4
driver_class=com.mysql.jdbc.Driver
driver_url=jdbc:mysql://192.168.22.246:3306/importexceltest
database_user=basic
database_password=basic

测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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();
     
  }
}
标签:

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
返回顶部