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);
            }
        }
   

posted @ 2017-04-20 15:02  小悠丶  阅读(730)  评论(0编辑  收藏  举报