JDBC数据批处理

JDBC(Java Data Base Connectivity):SUN公司为统一对数据库的操作定义的一套Java操作规范(接口),成为JDBC;

API中组成JDBC的两个包:java.sql  |  javax.sql

JDBC过程(以MySQL、Oracle数据库为例)

mysql数据库默认端口:3306
oracle数据库默认端口:1521

services.msc:查看系统中所有的服务

mysql数据库中最重要的配置文件
C:\Program Files (x86)\MySQL\MySQL Server 5.0\my.ini

port=3306   端口号
default-character-set=utf8   mysql数据库编码
C:/Program Files (x86)/MySQL/MySQL Server 5.0/  mysql安装路径
C:/Program Files (x86)/MySQL/MySQL Server 5.0/Data/  数据库文件存放路径
default-storage-engine=INNODB  mysql数据库引擎

1、加入驱动包,注册Driver(除jar包,还需要导入相应JDBC的数据库实现(即数据库驱动))

    //加载数据库驱动  
       a、 Class.forName("com.mysql.jdbc.Driver");//MySQL两种方式,采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱     动,使程序的灵活性更高。

   b、DriverManager. registerDriver(Driver driver)

   //Oracle

   Driver driver = new oracle.jdbc.driver.OracleDriver();

   Properties info = new Properties();
        //Oracle指定数据用户名以及密码
        info.setProperty("user", "scott");
        info.setProperty("password", "tiger")

2、获取连接 

   //MySQL获取连接                //协议:子协议   主机         端口 数据库          
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root"); 

   //Oracle获取连接
        Connection con = driver.connect("jdbc:oracle:thin:@127.0.0.1:1521:orcl", info);

3、获取statement

  //准备sql语句
        String sql = "insert into tb_user(loginname,username,password) values(?,?,?)";
        //获取集装箱
        PreparedStatement pstm = null;

4、发送sql

5、处理返回的结果集ResultSet

6、关闭资源

try {
            pstm = con.prepareStatement(sql);
            for(int i=0;i<list.size();i++){
                pstm.setString(1, list.get(i).getLoginname());
                pstm.setString(2, list.get(i).getUsername());
                pstm.setString(3, list.get(i).getPassword());
                //将sql语句添加至批处理命令中
                pstm.addBatch();
            }
            
            //执行批处理
            int[] flag = pstm.executeBatch();
            System.out.println("影响的行数:"+flag.length);
            //清空批处理命令
            pstm.clearBatch();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
             //关闭数据库连接
            ConnectionFactory.close(con, pstm, null);
        }

Statement 与PrepareStatement

PrepareStatement是Statement子类 支持占位符?

批量插入时 性能更好 效率更高

防止SQL注入,更安全

代码不同:

Statement:
 
    //将sql语句添加至批处理命令中
   a、 statement.addBatch(sql);
    //执行批处理
    b、statement.executeBatch();

//清空批处理命令
    c、statement.clearBatch();

PreparedStatement:
   
   //将sql语句添加至批处理
   a、pstm.addBacth();    注意此处不需要传入sql语句,因为在获取集装箱(PreparedStatement)的时候已将sql
   语句传入
   //执行批处理
  b、 pstm.executeBatch();

//清空批处理命令
   c、pstm.clearBatch();

数据库连接池:优化项目的性能
   现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。
   通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
   也有一些开源组织提供了数据源的独立实现:
   DBCP 数据库连接池(tomcat)
   C3P0 数据库连接池(hibernate)

//获取数据源
    BasicDataSource basicDataSource = new BasicDataSource();
    //设置连接地址
    basicDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/bookapp");
    //最大活动数
    basicDataSource.setMaxActive(3);
    //设置最大保存数
    basicDataSource.setMaxIdle(3);
    //超时等待时间  单位毫秒
    basicDataSource.setMaxWait(5000);
    //设置用户名
    basicDataSource.setUsername("root");
    //设置密码
    basicDataSource.setPassword("root");
    //获取连接
    Connection con = basicDataSource.getConnection();

实际开发中我们可以web服务器来配置数据源
    找到server中的context.xml文件

<Resource name="jdbc/shop_app" auth="Container" type="javax.sql.DataSource"
               maxTotal="100" maxIdle="30" maxWaitMillis="10000"
               username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/bank"/>

代码初始化数据源
   static{
    try {
        InitialContext context = new InitialContext();
        //通过context的lookup方法来检索JNDI容器中的DataSource资源名来进行检索       注意:在检索的时候需要加上web容器的对应的资源前缀     tomcat容器的前缀:java:/comp/env
        dataSource = (DataSource)context.lookup("java:/comp/env/jdbc/bookapp");
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
      }

元数据
    try {
        con = ConnectionFactory.getConnection();
        String sql = "select * from tb_user";
        //获取集装箱
        pstm = con.prepareStatement(sql);
        rs = pstm.executeQuery();
        //获取元数据(该数据中包含,表中列的数量,列类型、列名称)
        ResultSetMetaData metaData = rs.getMetaData();
        //获取列的数量
        int column = metaData.getColumnCount();
        System.out.println("得到列的数量:"+column);
        //遍历结果集
        rs.next();
            for(int i=1;i<=column;i++){
                //获取列名
                String name = metaData.getColumnName(i);
                //获取数据类型
                String type = metaData.getColumnTypeName(i);
                //根据列名获取数据
                Object object = rs.getObject(name);    
                System.out.println("列名:"+name+"类的类型:"+type+" 得到的数据:"+object);
            }
        }

时间: 2024-11-05 16:05:27

JDBC数据批处理的相关文章

javaweb学习总结(三十六)——使用JDBC进行批处理

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和preparedstatement 一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: 1 Statement.addBatch(sql1); 2 Statement.addBatch(sql2); 3 Statement.addBatch(sql3);

使用JDBC进行批处理

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式: statement 和 preparedstatement 一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: Statement.addBatch(sql1); Statement.addBatch(sql2); Statement.addBatch(sql3); 2.

JDBC batch批处理Statement executeBatch 具体解释

JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系统进行改造,採用了batch处理的方式,删除5万条数据基本上不会超过1分钟.看一段JDBC代码: // 关闭自己主动运行 con.setAutoCommit(false); Statement stmt = con.createStatement(); stmt.addBatch("INSERT I

[转]使用JDBC进行批处理

http://mousepc.iteye.com/blog/1131462 •业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. 一.•实现批处理有两种方式,第一种方式:•Statement.addBatch(sql)•执行批处理SQL语句•executeBatch()方法:执行批处理命令•clearBatch()方法:清除批处理命令 Connection conn = null; Statement st = nul

深入分析JavaWeb Item30 -- 使用JDBC进行批处理

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和preparedstatement 一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: Statement.addBatch(sql1); Statement.addBatch(sql2); Statement.addBatch(sql3); 2.执行批

JavaWeb学习总结(十一)--JDBC之批处理

一.批处理的介绍 在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率.批处理只针对更新(增.删.改)语句,批处理没有查询什么事儿! JDBC实现批处理有两种方式:statement和preparedstatement 可以多次调用Statement类的addBatch(String sql)方法,把需要执行的所有SQL语句添加到一个"批"中,然后调用Statement类的executeBatch

JDBC的批处理操作三种方式

SQL批处理是JDBC性能优化的重要武器,经本人研究总结,批处理的用法有三种. package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; /** * JDBC的批量操作三种方式 * * @auth

Spring04-SpringEL&amp;Spring JDBC数据访问

一. SpringEL入门 Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性. 1. 准备工作 项目:spring-el 2. 需要导入jar包 spring-expression.jar maven项目pom文件添加: 1 <dependency> 2 <groupId>org.springframework</groupId> 3 <artifactId&g

hibernate4使用原生jdbc进行批处理

在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用.比如有较大的数据量交互的话,缓存反而会降低效率.最近在做一个有关批量更新的程序,在调用session.update()之后,对象会保存在缓存中,如果数据量超过缓存的容量就会出错.解决方法是:在hibernate中调用jdbc批量处理的API,使用原生的jdbc来进行批量操作. 但是这里又出现了新的问题,在hibernate4中,通过session是不能直接