sql批处理

来源:互联网 发布:plc编程指令大全 编辑:程序博客网 时间:2024/05/19 16:51
有时候,需要批量执行sql语句,例如批量保存数据等。

批处理特点:
   批处理的SQL语句的主题必须一样,不同的是批处理中的占位符的值。


注意事项:

    使用批处理的时候,如果一次执行的记录数过多,最好按10条或者100条执行一次操作,并清空批处理,这样做主要是为了避免内存溢出。


批处理相关方法

         |-- Statement

                  void addBatch(String sql)     添加批处理

                  void clearBatch()            清空批处理(PreparedStatement接口里面的方法)

                  int[] executeBatch()         执行批处理

         |--PreparedStatement

                  void addBatch()              添加批处理


测试批处理Batch.java

package com.cn.statement;import java.sql.Connection;import java.sql.PreparedStatement;import java.util.ArrayList;import org.junit.Test;import com.cn.Util.JdbcUtil;import com.cn.entity.User;public class Batch {/** * 测试批处理 * @throws Exception */@Testpublic void testBatch(){Connection conn = null;PreparedStatement pstmt = null;//准备参数ArrayList<User> list = new ArrayList<User>();list.add(new User("小李", "1234"));list.add(new User("吴莫愁", "4444"));try {//获取连接对象conn = JdbcUtil.getConnection();//准备sqlString sql = "insert into users(name, password) values(?,?)";//预编译sqlpstmt = conn.prepareCall(sql);//设置参数for(int i=0; i<list.size(); i++){User user = list.get(i);pstmt.setString(1, user.getName());pstmt.setString(2, user.getPassword());pstmt.addBatch();//将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。不需要传入sqlif(i%5 == 0){pstmt.executeBatch();//执行批处理pstmt.clearBatch();//空此 Statement 对象的当前 SQL 命令列表。}}pstmt.executeBatch();//执行批处理pstmt.clearBatch();//空此 Statement 对象的当前 SQL 命令列表。} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}finally{JdbcUtil.close(conn, pstmt);}}}

User.java

package com.cn.entity;public class User {private String name;private String password;public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(String name, String password) {super();this.name = name;this.password = password;}}

JdbcUtil.java

package com.cn.Util;import java.io.FileInputStream;import java.io.InputStream;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * jdbc的工具类 * @author liuzhiyong * */public class JdbcUtil {private static String url = null;private static String user = null;private static String password = null;private static String driverClass = null;/** * 静态代码块(只调用一次) */static{try {//读取db.properties文件Properties properties = new Properties();/** *  * 加载文件 *  *  . 代表java的命令运行的目录 *  在java项目下,  . java命令的运行目录从项目的根目录MyEclipse工作空间/bin 目录开始 *  在web项目下, . java命令的运行目录从tomact/bin 目录开始 *  所以不能用. *//** * 使用类路径的读取方式 * /  斜杠表示classpath的根目录 * 在java项目下,classpath的根目录从bin目录开始 * 在web项目下,classpath的根目录从WEB-INF/classes目录开始 */InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");properties.load(in);//读取信息url = properties.getProperty("url");user = properties.getProperty("user");password = properties.getProperty("password");driverClass = properties.getProperty("driverClass");System.out.println(url);System.out.println(user);System.out.println(password);System.out.println(driverClass);//注册驱动程序Class.forName(driverClass);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("驱动程序注册出错!");}}/** * 获取连接对象的方法 */public static Connection getConnection(){try {Connection conn = DriverManager.getConnection(url, user, password);return conn;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();throw new RuntimeException(e);}}/** * 释放资源的重载方法 */public static void close(Connection conn, Statement stmt, ResultSet rs){//关闭资源(顺序:后打开,先关闭)if(rs != null){try {rs.close();} catch (SQLException e) {System.out.println("ResultSet关闭失败!");throw new RuntimeException(e);}}if(stmt != null){try {stmt.close();} catch (SQLException e) {System.out.println("Statement关闭失败!");throw new RuntimeException(e);}}if(conn != null){try {conn.close();} catch (SQLException e) {System.out.println("Connection关闭失败!");throw new RuntimeException(e);}}}/** * 释放资源的重载方法 */public static void close(Connection conn, Statement stmt){//关闭资源(顺序:后打开,先关闭)if(stmt != null){try {stmt.close();} catch (SQLException e) {System.out.println("Statement关闭失败!");throw new RuntimeException(e);}}if(conn != null){try {conn.close();} catch (SQLException e) {System.out.println("Connection关闭失败!");throw new RuntimeException(e);}}}}
数据插入成功:
 
0 0
原创粉丝点击