zoukankan      html  css  js  c++  java
  • JDBC(oracle)

    一.jdbc访问数据库的步骤:
    1. 注册驱动
       Class.forName("oracle.jdbc.driver.OracleDriver");
    2. 根据url/dbUser/dbPwd构造连接(Connection)
       Connection conn = DriverManager.getConnection(url, dbUser, dbPwd);
    3. 根据Connection对象构造语句(Statement)对象
       由语句对象传递sql语句到数据库,并接收结果.
       Statement stmt = conn.createStatement();
      
       if 查询: 返回ResultSet
          ResultSet rs = stmt.executeQuery(sql);
       if DML(insert,update,delete): 返回影响的记录数
          int n = stmt.executeUpdate(sql);
    4. 关闭资源   
       rs.close();
       stmt.close();
       conn.close();

    需要用到的接口
    java.sql.*
    Connection
    Statement 和PreparedStatement
    ResultSet
    DriverManager

    例子:

     
     1 package day1;
     2 import java.sql.*;
     3 
     4 public class JDBCDemo {
     5  //驱动
     6  private static final String DRIVER
     7   ="oracle.jdbc.driver.OracleDriver";
     8  //连接字符串
     9  private static String URL 
    10   = "jdbc:oracle:thin:@192.168.2.205:1521:hqr";
    11  //数据库的帐号和密码
    12  private static final String DBUSER = "openlab";
    13  private static final String DBPWD = "open123";
    14 
    15  /**
    16   * 使用JDBC API 连接数据库
    17   */
    18  public static void main(String[] args) {
    19   //findAllUers();
    20   System.out.println(login("1002","1234"));
    21  }
    22  
    23  private static void findAllUers() {
    24   try {
    25    //1.注册驱动
    26    Class.forName(DRIVER);
    27    //2.构造连接
    28    Connection conn 
    29    = DriverManager.getConnection(URL, DBUSER, DBPWD);
    30    //3.构造语句对象,执行sql语句,并接受结果
    31    String sql = "select * from users_hqr";
    32    Statement stmt = conn.createStatement();
    33    ResultSet rs = stmt.executeQuery(sql);
    34    //遍历结果集
    35    while(rs.next()){
    36     //操作一行数据
    37     System.out.println(rs.getString("name"));
    38    }
    39    
    40    //4.关闭资源
    41   } catch (Exception e) {
    42    e.printStackTrace();
    43   }
    44  }
    45 }

    封装成ConntceionUtils.java类
    需要用到的ConnectionUtils.java类

     1 package day1;
     2 import java.io.*;
     3 import java.sql.*;
     4 import java.util.*;
     5 /**
     6  * 工具类,负责读入属性文件中的参数
     7  * 注册驱动,获得连接,关闭资源
     8  */
     9 public class ConnectionUtils {
    10  private static String driver;
    11  private static String url;
    12  private static String dbUser;
    13  private static String dbPwd;
    14  public static void getParam(String filename){
    15   Properties props = new Properties();
    16   try {
    17    //把file中的键值对数据装载入集合中
    18    props.load(new FileInputStream(new File(filename)));
    19    driver = props.getProperty("driver");
    20    url = props.getProperty("url");
    21    dbUser = props.getProperty("dbUser");
    22    dbPwd = props.getProperty("dbPwd");
    23   } catch (FileNotFoundException e) {
    24    e.printStackTrace();
    25   } catch (IOException e) {
    26    e.printStackTrace();
    27   }
    28  }
    29  /**
    30   * 根据四个全局变量参数构造连接对象并返回
    31   * @return Connection对象 
    32   */
    33  public static Connection getConnection(){
    34   Connection conn = null;
    35   try {
    36    getParam("src/db_oracle.properties");
    37    Class.forName(driver);
    38    conn = DriverManager.getConnection(url, dbUser, dbPwd);
    39   } catch (Exception e) {
    40    e.printStackTrace();
    41   }
    42   return conn;
    43   
    44  }
    45  public static void close(ResultSet rs){
    46   if(rs != null){
    47    try {
    48     rs.close();
    49    } catch (SQLException e) {
    50     e.printStackTrace();
    51    }
    52   }
    53  }
    54  public static void close(Statement stmt){
    55   if(stmt != null){
    56    try {
    57     stmt.close();
    58    } catch (SQLException e) {
    59     e.printStackTrace();
    60    }
    61   }
    62  }
    63  public static void close(Connection conn){
    64   if(conn != null){
    65    try {
    66     conn.close();
    67    } catch (SQLException e) {
    68     e.printStackTrace();
    69    }
    70   }
    71  }
    72  
    73 }


    二.JDBC 的 DML操作(增,改,删)

    例子:

      1 package day1;
      2 import java.sql.*;
      3 public class JDBCDemo_DML {
      4  public static void main(String[] args) {
      5   System.out.println(changePwd(1002,5678)?"update success":"update faild");
      6   System.out.println(deleteUser(1001)?"success":"faild");
      7   addUser(1015,"dsads",1234,"19212512457","24@2.com");
      8  }
      9  public static boolean changePwd(int id,int pwd){
     10   String sql = "update users_hqr set pwd = " + pwd +
     11      " where id = " + id;
     12   boolean flag  = false;
     13   Connection conn = ConnectionUtils.getConnection();
     14   Statement stmt = null;
     15   try {
     16    stmt = conn.createStatement();
     17    int n = stmt.executeUpdate(sql);
     18    if(n == 1){
     19     flag = true;
     20    }
     21   } catch (SQLException e) {
     22    e.printStackTrace();
     23   } finally{
     24    ConnectionUtils.close(stmt);
     25    ConnectionUtils.close(conn);
     26   }
     27   return flag;
     28  }
     29  
     30  /**
     31   * 删除考生
     32   * @param id 指定的id
     33   * @return if成功返回true,否则返回false;
     34   */
     35  public static boolean deleteUser(int id){
     36   String sql = "delete users_hqr where id = " + id;
     37   boolean flag = false;
     38   Connection conn = ConnectionUtils.getConnection();
     39   Statement stmt = null;
     40   try {
     41    stmt = conn.createStatement();
     42    int n = stmt.executeUpdate(sql);
     43    if (n == 1) {
     44     flag = true;
     45    }
     46   } catch (SQLException e) {
     47    e.printStackTrace();
     48   } finally {
     49    ConnectionUtils.close(stmt);
     50    ConnectionUtils.close(conn);
     51   }
     52   return flag;
     53  }
     54  /**
     55  *添加用户方法1
     56  */
     57  public static boolean addUser_1(int id,int pwd,String name,
     58    String phone,String email){
     59   String sql = "insert into users_hqr " +
     60     "values ("+id+",'"+name+"',"+pwd+",'"+phone+"','"+email+"')" ;
     61   boolean flag  = false;
     62   Connection conn = ConnectionUtils.getConnection();
     63   Statement stmt = null;
     64   try {
     65    stmt = conn.createStatement();
     66    int n = stmt.executeUpdate(sql);
     67    if(n == 1){
     68     flag = true;
     69    }
     70   } catch (SQLException e) {
     71    e.printStackTrace();
     72   } finally{
     73    ConnectionUtils.close(stmt);
     74    ConnectionUtils.close(conn);
     75   }
     76   return flag;
     77  }
     78  /**
     79  *添加用户方法2
     80  */
     81  public static boolean addUser(int id,String name,int pwd,
     82    String phone,String email){
     83   String sql = "insert into users_hqr values(?,?,?,?,?)";
     84   boolean flag  = false;
     85   Connection conn = ConnectionUtils.getConnection();
     86   PreparedStatement stmt = null;
     87   try {
     88    stmt = conn.prepareStatement(sql);
     89    //给sql语句中的占位符赋值
     90    stmt.setInt(1, id); 
     91    stmt.setString(2, name);
     92    stmt.setInt(3, pwd);
     93    stmt.setString(4, phone);
     94    stmt.setString(5, email);
     95    stmt.executeUpdate();
     96   } catch (Exception e) {
     97    e.printStackTrace();
     98   } finally{
     99    ConnectionUtils.close(stmt);
    100    ConnectionUtils.close(conn);
    101   }
    102   return flag;
    103  }
    104 }

    三.JDBC中的事务(需要导入ConnectionUtils类)
    sqlplus: 显式终止事务(提交 或 回滚)
      set autocommit on|off :切换是否自动提交
     默认关闭自动提交(off)
    JDBC:自动提交,autocommit on
      conn.setAutoCommit(false);
     dml1: -500;
     dml2:+500;
     if(没有问题) conn.commit();
     else conn.rollback

    例子:
    1.帐户表,帐户A,帐户B
    2.程序TransactionDemo
    conn.setAutoCommit(false);
    int n1 = stmt.executeUpdate(sql1);
    int n2 = stmt.executeUpdate(sql2);

    TransactionDemo.java:

     1 package day2;
     2 import java.sql.*;
     3 
     4 import day1.ConnectionUtils;
     5 /**
     6  * 测试JDBC中的事务
     7  * @author soft01
     8  *
     9  */
    10 public class TransactionDemo {
    11  public static void main(String[] args) {
    12   transferMoney(500);
    13  }
    14  /**
    15   * 转帐,从帐户A转到帐户B
    16   */
    17  public static void transferMoney(double money){
    18   String sql1 = "update account_hqr set money = money - " + money
    19    + " where id = 'A' ";
    20   String sql2 = "update account_hqr set money = money + " + money
    21    + " where id = 'B' ";
    22   Connection conn = ConnectionUtils.getConnection();
    23   Statement stmt = null;
    24   try{
    25    conn.setAutoCommit(false);//关闭自动提交
    26    stmt = conn.createStatement();
    27    int n1 = stmt.executeUpdate(sql1);
    28    int n2 = stmt.executeUpdate(sql2);
    29    if(n1==1 && n2==1){
    30     conn.commit();
    31    }else{
    32     conn.rollback();
    33    }
    34   }catch (Exception e){
    35    try {
    36     conn.rollback();
    37    } catch (SQLException e1) {
    38     // TODO Auto-generated catch block
    39     e1.printStackTrace();
    40    }
    41    e.printStackTrace();
    42   } finally{
    43    ConnectionUtils.close(stmt);
    44    ConnectionUtils.close(conn);
    45   }
    46   
    47  }
    48 
    49 }


    四.JDBC中的批处理
    批处理:批量处理SQL语句
     缓存:用来存放批量的SQL语句.

    比如:JDBC中批量执行insert语句
    1.create table mytemp_hqr(id number primary key);

    2.BatchDemo.java
    conn.setAutoCommit(false);
    for(int i = 0; i < 10000; i +=){
     String sql =" insert into mytemp values(?)";
     stmt.addBatch(sql);
     if(i % 1000 ==0){
      stmt.executeBatch(); 
      stmt.clearBatch();
     }
    }
    stmt.executeBatch();
    conn.commit();
    批处理时必须关掉JDBC的自动提交功能

    源代码:

     1 package day2;
     2 import java.sql.*;
     3 
     4 import day1.ConnectionUtils;
     5 /**
     6  * 测试JDBC批量处理操作
     7  * @author soft01
     8  *
     9  */
    10 public class BatchDemo {
    11  public static void main(String[] args) {
    12   addTemp();
    13  }
    14  /**
    15   * 批量增加数据到mytemp_hqr表中
    16   */
    17  public static void addTemp() {
    18   String sql = "insert into mytemp_hqr values(?)";
    19   Connection conn = ConnectionUtils.getConnection();
    20   PreparedStatement stmt = null;
    21   try { 
    22    //关闭自动提交
    23    conn.setAutoCommit(false);
    24    //获得于编译语句对象
    25    stmt = conn.prepareStatement(sql);
    26    //循环100次,把sql加入到Batch中
    27    for(int i=1;i<=100;i++){
    28      
    29     stmt.setInt(1, i);
    30     stmt.addBatch();
    31     if(i % 10 ==0){
    32      stmt.executeBatch();
    33      stmt.clearBatch();
    34     }
    35    }
    36    stmt.executeBatch();
    37    conn.commit();
    38   } catch (SQLException e) {
    39    // TODO Auto-generated catch block
    40    e.printStackTrace();
    41   }
    42  }
    43 }
  • 相关阅读:
    [LeetCode]130 Surrounded Regions(DFS)
    [LeetCode]233 Number of Digit One(数位DP)
    POJ 3225.Help with Intervals-线段树(成段替换、区间异或、简单hash)
    POJ 2528.Mayor's posters-线段树(成段替换、离散数据、简单hash)
    POJ 3468.A Simple Problem with Integers-线段树(成段增减、区间查询求和)
    HDU 1698.Just a Hook-线段树(成段替换、输出总和tree[1])
    POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)
    计蒜客 28437.Big brother said the calculation-线段树+二分-当前第k个位置的数 ( ACM训练联盟周赛 M)
    HDU 5649.DZY Loves Sorting-线段树+二分-当前第k个位置的数
    计蒜客 28449.算个欧拉函数给大家助助兴-大数的因子个数 (HDU5649.DZY Loves Sorting) ( ACM训练联盟周赛 G)
  • 原文地址:https://www.cnblogs.com/hqr9313/p/2502631.html
Copyright © 2011-2022 走看看