批处理

Posted 康星悦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理相关的知识,希望对你有一定的参考价值。

批处理(batch)------------>好比快递员【不能一件一件的送快递】
        - 批处理指的是一次操作中执行多条SQL语句
        - 批处理相比于一次一次执行效率会提高很多
        
        - 批处理主要是分两步:
            1.将要执行的SQL语句保存
            2.执行SQL语句
            
        - Statement和PreparedStatement都支持批处理操作,此处以PreparedStatement的批处理方式为例:
            - 方法:
                void addBatch()
                    - 将要执行的SQL先保存起来,先不执行
                    - 这个方法在设置完所有的占位符之后调用
                int[] executeBatch()
                    - 这个方法用来执行SQL语句,这个方法会将批处理中所有SQL语句执行
                    
        - mysql默认批处理是关闭的,所以我们还需要去打开mysql的批处理:
                rewriteBatchedStatements=true
            我们需要将以上的参数添加到mysql的url地址中
        
        - 注意:低版本的mysql-jdbc驱动也不支持批处理,一般都是在修改的时候使用批处理,查询的时候不使用!
        
        
        
    案例演示:
        1.创建一张新的数据表
            CREATE TABLE t_emp(
                id INT PRIMARY KEY AUTO_INCREMENT,
                NAME VARCHAR(50)
            )
        2.反复打开数据库客户端,插入语句【相当于每次获取一个connection连接,执行executeUpdate语句】
            INSERT INTO t_emp(NAME) VALUES(‘张三‘);
            SELECT * FROM t_emp;
            TRUNCATE TABLE emp_batch;//清空表
            SELECT COUNT(*) FROM emp_batch;//统计插入数
            
        3.引出批处理--->执行效率高,资源利用率好!    

  技术分享
 1 public class JDBCUtil {
 2     private static String username="root";
 3     private static String password="123456";
 4     //添加问号?后参数,打开mysql批处理
 5     private static String url="jdbc:mysql://localhost:3306/student?rewriteBatchedStatements=true";
 6     private static String driver="com.mysql.jdbc.Driver";
 7     
 8     private static Connection conn=null;
 9     static{
10         try {
11             Class.forName(driver);
12         } catch (ClassNotFoundException e) {
13             e.printStackTrace();
14         }
15     }
16     public static Connection getConnection(){
17         try {
18             conn = DriverManager.getConnection(url, username, password);
19             return conn;
20         } catch (SQLException e) {
21             return null;
22         }
23     }
24     
25     public static void close(Connection conn,PreparedStatement ps){
26         if(conn!=null){
27             try {
28                 conn.close();
29             } catch (SQLException e) {
30                 // TODO Auto-generated catch block
31                 e.printStackTrace();
32             }
33         }
34         if(ps!=null){
35             try {
36                 ps.close();
37             } catch (SQLException e) {
38                 // TODO Auto-generated catch block
39                 e.printStackTrace();
40             }
41         }
42     }
43 }
数据库封装设置—此处打开mysql的批处理
  技术分享
 1  @Test//测试批处理
 2             public void testBatch(){
 3                 //向t_emp表中插入10000条数据
 4                 
 5                 //准备两个变量
 6                 Connection connection = null;
 7                 PreparedStatement ps = null;
 8                 
 9                 try {
10                     //获取数据库连接
11                     connection=JDBCUtil.getConnection();
12                     //准备SQL模板
13                     String sql = "INSERT INTO t_emp(NAME) VALUES(?)";
14                     //获取PrepareStatement
15                     ps = connection.prepareStatement(sql);
16                     //创建一个for循环,来设置占位符
17                     for(int i = 0; i < 10000 ;i++){
18                         //填充占位符
19                         ps.setString(1,"emp"+i);
20                         //添加到批处理方法中,调用无参的,有参的是Statement来调用的!
21                         ps.addBatch();
22                     }
23                     
24                     //获取一个时间戳
25                     long start = System.currentTimeMillis();
26                     //执行批处理
27                     ps.executeBatch();
28                     //获取一个时间戳
29                     long end = System.currentTimeMillis();
30                     System.out.println("共花费了:"+(end-start));
31                 } catch (SQLException e) {
32                     e.printStackTrace();
33                 }
34             }
设置批处理

  注意:将批处理加入到事务中时,批处理的效率会更高





































以上是关于批处理的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 python 中处理 graphql 查询和片段?

python常用代码片段总结

是否有在单个活动中处理多个片段的 Android 设计模式?

CSP核心代码片段记录

译文:18个实用的JavaScript代码片段,助你快速处理日常编程任务

在 Android 中使用片段时处理后按