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 }

 

posted @ 2016-02-18 22:15  CodeNoob  阅读(345)  评论(0编辑  收藏  举报