之前学习了数据库原理,上学期也学了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 }