zoukankan      html  css  js  c++  java
  • java学习之JDBC

      之前学习了数据库原理,上学期也学了oracle数据库,我的学习视频上是讲的mysql数据库,其实都差不多,复习了下sql知识,数据库的学习就没有写下来了,就从Java怎么操作数据库开始吧。

      因为这年过完了,开始新的学习,有时间边学边写了。其实JDBC网上教程挺多的,我看视频学习的笔记都尽量写在代码里了。就直接上代码吧。

      1 package com.gh;
      2 
      3 import java.sql.Connection;
      4 import java.sql.DriverManager;
      5 import java.sql.PreparedStatement;
      6 import java.sql.ResultSet;
      7 import java.sql.SQLException;
      8 import java.sql.Statement;
      9 /**
     10  * PreparedStatement的setDate类是java.sql包里的Date
     11  * ResultSet 的getDate还回一个java.sql.Date
     12  * sql.Date是util.Date的子类 可以直接转util.Date
     13  * util.Date转sql.Date可以 new sql.Date(new util.Date().getTime());
     14  * @author ganhang
     15  *
     16  */
     17 public class JdbcDemo {
     18     //驱动类
     19     public static String Driver="oracle.jdbc.OracleDriver";
     20     //数据库地址
     21     public static String url="jdbc:oracle:thin:@localhost:1521:orcl";
     22     //数据库用户名
     23     public static String user="scott";
     24     //数据库密码
     25     public static String password=".";
     26     /**
     27      * 查找
     28      */
     29     public static void find(){
     30         try {
     31             Class.forName(Driver);
     32             Connection conn=DriverManager.getConnection(url, user, password);
     33             String sql="select * from test";
     34             PreparedStatement ps=conn.prepareStatement(sql);//不要用Stateme ,有sql注入问题,不安全
     35             ResultSet rs=ps.executeQuery();//返回结果集(实际上是引用)
     36             while(rs.next()){
     37                 System.out.println(rs.getInt(1));
     38             }
     39             rs.close();
     40             ps.close();
     41             conn.close();
     42             System.out.println("success!");
     43         } catch (ClassNotFoundException e) {
     44             e.printStackTrace();
     45         } catch (SQLException e) {
     46             e.printStackTrace();
     47         }
     48     }
     49     /**
     50      * jdbc事务处理
     51      * 处理多条sql语句(运行sql脚本)
     52      */
     53     public static void update(){
     54         /**
     55          * 这里我发现如果想用addBatch()方法添加批处理命令只能用Statement接口
     56          * 而且addBatch()方法不能添加查询语句
     57          * 如果用PreparedStatement只能单独执行一句sql
     58          */
     59         Connection conn=null;
     60         try {
     61             Class.forName(Driver);
     62             conn=DriverManager.getConnection(url, user, password);
     63             conn.setAutoCommit(false);//改为手动commit
     64             Statement ps=conn.createStatement();
     65             String sql1="insert into test values(16)";
     66             //PreparedStatement ps=conn.prepareStatement(sql1);
     67             //ps.addBatch();
     68             ps.addBatch(sql1);
     69             //String sql2="update test set n=17 where n=16";
     70             String sql2="delete from test where n=1";
     71             //ps=conn.prepareStatement(sql2);
     72             ps.addBatch(sql2);
     73             ps.executeBatch();
     74             //懒得数据库去查询。。。直接这边输出
     75             //ps=conn.prepareStatement(sql3);
     76             String sql3="select * from test";
     77             ResultSet rs=ps.executeQuery(sql3);
     78             while(rs.next()){
     79                 System.out.println(rs.getInt(1));
     80             }
     81             conn.commit();//提交事务
     82             ps.close();
     83             conn.close();
     84         } catch (ClassNotFoundException | SQLException e) {
     85             e.printStackTrace();
     86             try {
     87                 conn.rollback();
     88             } catch (SQLException e1) {
     89                 e1.printStackTrace();
     90             }
     91         }
     92         
     93     }
     94     //Statement实现,不安全
     95     public static void insert(){//更新删除只改sql就可以
     96         try {
     97             //加载驱动
     98             Class.forName(Driver);
     99             //获得连接,注意是java.sql的Connection,mysql包也有Connection接口
    100             Connection conn=DriverManager.getConnection(url, user, password);
    101             //sql语句
    102             String sql="insert into test values(100)";
    103             //获得Statement对象
    104             //说明文档有这么一句注释:在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。
    105             //因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
    106             //如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
    107             Statement stat=conn.createStatement();
    108             //执行sql(实际上是把sql发送给数据库,数据库去执行类似Scoket通信)
    109             stat.executeUpdate(sql);
    110             //关闭相关连接释放资源
    111             stat.close();
    112             conn.close();
    113             System.out.println("success!");
    114         } catch (ClassNotFoundException e) {
    115             e.printStackTrace();
    116         } catch (SQLException e) {
    117             e.printStackTrace();
    118         }
    119     }
    120     //PreparedStatement实现
    121     public static void insert2(int n){
    122         try {
    123             Class.forName(Driver);
    124             Connection conn=DriverManager.getConnection(url, user, password);
    125             String sql="insert into test values(?)";
    126             PreparedStatement ps=conn.prepareStatement(sql);
    127             ps.setInt(1, n);
    128             ps.executeUpdate();
    129             ps.close();
    130             conn.close();
    131             System.out.println("success!");
    132         } catch (ClassNotFoundException e) {
    133             e.printStackTrace();
    134         } catch (SQLException e) {
    135             e.printStackTrace();
    136         }
    137     }
    138     public static void main(String[] args) {
    139         //insert();
    140         //insert2(1);
    141         //find();
    142         update();
    143     }
    144 }
  • 相关阅读:
    Codeforces 884E E. Binary Matrix
    基础练习 矩形面积交
    蓝桥杯基础练习---矩阵乘法
    C. An impassioned circulation of affection(Round 418)
    B. An express train to reveries(Round 418)
    A. An abandoned sentiment from past (Round 418)
    数学建模培训二 ---- matlab的基本应用
    数学建模培训第一天---线性规划
    基础练习 回形取数
    github初步---将本地代码传到github上面
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5199455.html
Copyright © 2011-2022 走看看