一万年太久,只争朝夕
What JDBC
上部
JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持
java.sql包中定义的常用的基本的 JDBC API:
类 DriverManager-管理一组 JDBC 驱动程序的基本服务 接口 Connection-获得与特定数据库的连接
接口 Statement-用于执行静态 SQL 语句并返回它所生成结果的对象
接口 ResultSet-表示数据库结果集的数据表,通常通过执行
查询数据库的语句生成 类 SQLException-有关数据库操作的异常
使用JDBC 访问数据库的前提条件
数据库的主机地址(IP地址)localhost 127.0.0.1 如果你访问的是别人的数据库,记得输入别人的IP
端口号:oracle 1521 ,MySql 3306, SqlServer 1433 因为我连得数据库是oracle,Ojdbc14.jar包,千万别忘了
数据的用户名/密码
JDBC核心API
Driver接口:驱动程序接口
Connection connect(String url, Properties info) 用于连接数据库的方法
可以使用驱动程序管理类获取这样的连接
DriverManager.getConnection(String url, String user, String password)
Connection 接口 :代表和数据库的连接
Statement createStatement() 创建Statement接口的对象
PreparedStatement prepareStatement(String sql) 创建PreparedStatement接口的对象
Statement接口 用于执行静态sql语句
int executeUpdate(String sql) 执行DDL和DML语句,如果不记得什么是DDL和DML,可以参考上一篇oracle基础
ResultSet executeQuery(String sql) 执行DQL语句,同理
PreparedStatement接口 : 用于执行预编译的sql语句
int executeUpdate(String sql) 执行DDL和DML语句
ResultSet executeQuery(String sql) 执行DQL语句
ResultSet接口:表示数据库的结果集
boolean next() 将光标转移到下一行的位置
getXXX() 获取结果集中每列的值
很少用,了解
CallableStatement prepareCall(String sql)
CallableStatement接口 :(了解)用于存储过程的SQL语句
下部
详解DriverManager类
用DriverManager加载驱动,,获得与数据库的连接,
驱动设备管理器进行连接
Driver driver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(driver);
//推荐使用该方法
//驱动程序(只注册一次)
Class.forName("oracle.jdbc.driver.OracleDriver");
关于url 的写法
jdbc:oracle:thin:@localhost:1521:orcl
详解Connection 类
用于与数据库的连接,数据库与客户端的打交道都是由Connection方法来完成的,常用方法:
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
setAutoCommit(boolean autoCommit):设置事务是否自动提交。
commit() :提交事务。
rollback() :回滚事务。
详解Statement 接口
Statement对象用于向数据库发送SQL语句, Statement对象常用方法:
executeQuery(String sql) :用于向数据发送查询语句。
executeUpdate(String sql):用于向数据库发送insert、update或delete语句
详解ResultSet 接口
ResultSet用于代表Sql语句的执行结果。开始的时候,游标在第一行之前,调用ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
ResultSet既然获得数据库执行后的对象,提供了获取数据的get 方法
获取指定类型的数据,例如:
getString(int index)
getString(String columnName)
ResultSet还提供了对结果集进行滚动的方法:
next():移动到下一行
关于释放资源:
切记一点,一定要记得关闭,还有就是先开的后关,后开的先关。
详解部分参照API文档:
代码展示
目录结构:
1 package Jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 /** 10 * statement 用于执行静态sql 但是实际开发很少用, PreparedStatement :用于执行预编译的sql语句 11 * @author Administrator 12 * 13 */ 14 public class FirstJdbc { 15 16 private static String user = "scott"; 17 private static String password = "tiger"; 18 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 19 20 public static void main(String[] args) throws ClassNotFoundException, SQLException { 21 22 // 加载驱动 23 24 Class.forName("oracle.jdbc.driver.OracleDriver"); 25 26 //获取数据库连接 27 28 Connection conn = DriverManager.getConnection(url, user, password); 29 30 System.out.println(conn); 31 // 下面是输出 conn 的结果 ;证明数据库连接成功 32 //oracle.jdbc.driver.T4CConnection@5afec107 33 34 //准备sql语句 35 String sql = "select * from userinfo"; 36 37 //获取用于向数据库发送sql语句的statement 38 Statement stmt = conn.createStatement(); 39 //获取数据库连接对象 40 ResultSet rs = stmt.executeQuery(sql); 41 while(rs.next()){ 42 43 System.out.println("uname="+rs.getString("uname")); 44 System.out.println("upass="+rs.getString("upass")); 45 } 46 //关闭连接,释放资源(遵循原则 先开喉管) 47 rs.close(); 48 stmt.close(); 49 conn.close(); 50 } 51 52 53 }
1 package Jdbc; 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 public class SecondJdbc { 11 12 /** 13 * PreparedStatement :用于执行预编译的sql语句,动态拼接sql ?作为占位符, 可以有效的防止Sql注入的问题 14 * 15 */ 16 private static Connection conn = null; 17 private static String user = "scott"; 18 private static String password = "tiger"; 19 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 20 21 public static void main(String[] args) throws ClassNotFoundException, SQLException { //为了使页面使页面干净,在这里处理的异常都向外抛出 22 // TODO Auto-generated method stub 23 24 // 加载驱动 25 26 Class.forName("oracle.jdbc.driver.OracleDriver"); 27 28 //获取数据库连接 29 30 Connection conn = DriverManager.getConnection(url, user, password); 31 32 System.out.println(conn); 33 // 下面是输出 conn 的结果 ;证明数据库连接成功 34 //oracle.jdbc.driver.T4CConnection@5afec107 35 36 //准备sql语句 37 String sql = "insert into userinfo(uname,upass)values (?,?)"; 38 39 //获取用于向数据库发送sql语句的preparedStatement 40 PreparedStatement stmt = conn.prepareStatement(sql); 41 //设置参数 注意这里的参数设置从1开始,不像数组等下标从0开始 42 stmt.setString(1,"张作霖"); 43 stmt.setString(2, "123"); 44 //获取数据库连接对象 45 int count = stmt.executeUpdate(); 46 //事务处理 47 if(count>0){ 48 conn.commit(); 49 }else{ 50 //这里的rollback肯定执行不了,因为上面执行的sql(insert)用户名是可以重复的,用重名的可能性 51 conn.rollback(); 52 } 53 System.out.println("影响了"+count+"行"); 54 //关闭连接,释放资源(遵循原则 先开喉管) 55 56 stmt.close(); 57 conn.close(); 58 } 59 60 }
1 package Jdbc; 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 9 import javax.naming.Context; 10 import javax.naming.InitialContext; 11 import javax.naming.NamingException; 12 import javax.sql.DataSource; 13 14 15 /** 16 * 为了日后开发方便,不用频繁的获取驱动,获取连接, 17 * 定义url ,数据库,用户名 等参数,所以自己封装Jdbc工具类 18 * 19 */ 20 public class JdbcUtils { 21 22 //定义url 数据库用户名和密码 23 private static Connection conn = null; 24 private static PreparedStatement pst; 25 private static String user = "scott"; 26 private static String password = "tiger"; 27 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 28 29 private JdbcUtils() { 30 } 31 32 //单例模式 33 public static Connection getcConnection() { 34 if (conn == null) { 35 try { 36 Class.forName("oracle.jdbc.driver.OracleDriver"); 37 conn = DriverManager.getConnection(url, user, password); 38 System.out.println("获取connection连接成功"); 39 40 } catch (ClassNotFoundException e) { 41 System.out.println("加载驱动失败"); 42 e.printStackTrace(); 43 } catch (SQLException e) { 44 System.out.println("连接数据库失败"); 45 e.printStackTrace(); 46 } 47 } 48 return conn; 49 50 } 51 //之前用作数据库连接池连接,自己封装,如果没有用请忽略 52 /* public static Connection getPoolConnection(){ 53 if(conn==null){ 54 try { 55 Context context = new InitialContext(); 56 DataSource ds = 57 (DataSource) context.lookup("java:/comp/env/jdbc/oracleds"); 58 conn = ds.getConnection(); 59 System.out.println("连接池数据库成功!"); 60 } catch (NamingException e) { 61 System.out.println("连接池数据库失败!"); 62 e.printStackTrace(); 63 } catch (SQLException e) { 64 System.out.println("连接池数据库失败!"); 65 e.printStackTrace(); 66 } 67 } 68 69 return conn; 70 }*/ 71 72 //关闭连接 73 public static void close() { 74 75 try { 76 if (conn != null) { 77 conn.close(); 78 conn = null; 79 } 80 if (pst != null) { 81 pst.close(); 82 pst = null; 83 } 84 System.out.println("关闭成功"); 85 } catch (SQLException e) { 86 System.out.println("关闭失败"); 87 e.printStackTrace(); 88 } 89 90 } 91 92 // 执行更新操作 93 public static int executeUpdate(String sql, Object[] obj) { 94 int count = 0; 95 96 try { 97 pst = conn.prepareStatement(sql); 98 if (obj != null) { 99 for (int i = 0; i < obj.length; i++) { 100 pst.setObject(i + 1, obj[i]); 101 } 102 } 103 count = pst.executeUpdate(); 104 } catch (SQLException e) { 105 count = 0; 106 e.printStackTrace(); 107 } 108 109 return count; 110 } 111 //执行查询操作,带参数 112 public static ResultSet executeQuery(String sql, Object obj[]) { 113 ResultSet rs = null; 114 try { 115 pst = conn.prepareStatement(sql); 116 if (obj != null) { 117 for (int i = 0; i < obj.length; i++) { 118 pst.setObject(i + 1, obj[i]); 119 } 120 } 121 rs = pst.executeQuery(); 122 } catch (SQLException e) { 123 // TODO Auto-generated catch block 124 e.printStackTrace(); 125 } 126 127 return rs; 128 } 129 //执行查询操作.无参数 130 public static ResultSet executeQuery(String sql) { 131 ResultSet rs = null; 132 133 try { 134 pst = conn.prepareStatement(sql); 135 rs = pst.executeQuery(); 136 } catch (SQLException e) { 137 // TODO Auto-generated catch block 138 e.printStackTrace(); 139 } 140 141 return rs; 142 } 143 //开始事物 144 public static void beginTransation() { 145 try { 146 conn.setAutoCommit(false); 147 System.out.println("开始事物"); 148 } catch (SQLException e) { 149 System.out.println("开始事物失败"); 150 e.printStackTrace(); 151 } 152 153 } 154 //提交事物 155 public static void commit() { 156 try { 157 conn.commit(); 158 System.out.println("提交事物"); 159 } catch (SQLException e) { 160 System.out.println("提交事物失败"); 161 e.printStackTrace(); 162 } 163 164 } 165 //回滚事物 166 public static void rollback(){ 167 try { 168 conn.rollback(); 169 System.out.println("回滚事务"); 170 } catch (SQLException e) { 171 System.out.println("回滚事务失败"); 172 e.printStackTrace(); 173 } 174 } 175 }
数据库表
select * from userinfo;
第一次代码FirstJdbc 执行的结果:
第二次代码SecondJdbc 执行的结果: