JDBC(Java Data Base Connectivity,java数据库链接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此能够构建更高级的工具和接口,使数据库开发人员可以编写数据库应用程序。java
JDBC是对数据库操做的接口抽象,而不一样数据库厂商的数据库驱动程序则对应JDBC接口实现,经过抽象出JDBC接口,应用程序和实际的数据库驱动即JDBC实现解耦。mysql
1.Driver接口sql
Driver接口由数据库厂家提供,做为java开发人员,只须要使用Driver接口就能够了。在编程中要链接数据库,必须先装载特定厂商的数据库驱动程序,不一样的数据库有不一样的装载方法。如:数据库
装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");编程
装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");oracle
2.Connection接口工具
Connection与特定数据库的链接(会话),在链接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法创建在JDBC URL中定义的数据库Connection链接上。sqlserver
链接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");url
链接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");spa
链接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");
经常使用方法:
3.Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。
三种Statement类:
经常使用Statement方法:
4.ResultSet接口
ResultSet提供检索不一样类型字段的方法,经常使用的有:
ResultSet还提供了对结果集进行滚动的方法:
使用后依次关闭对象及链接:ResultSet → Statement → Connection
加载JDBC驱动程序 → 创建数据库链接Connection → 建立执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源
1.注册驱动 (只作一次)
方式一:Class.forName(“com.MySQL.jdbc.Driver”);
推荐这种方式,不会对具体的驱动类产生依赖。
方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
会形成DriverManager中产生两个同样的驱动,并会对具体的驱动类产生依赖。
2.创建链接
Connection conn = DriverManager.getConnection(url, user, password);
URL用于标识数据库的位置,经过URL地址告诉JDBC程序链接哪一个数据库,URL的写法为:
其余参数如:useUnicode=true&characterEncoding=utf8
3.建立执行SQL语句的statement
1 //Statement 2 String id = "5"; 3 String sql = "delete from table where id=" + id; 4 Statement st = conn.createStatement(); 5 st.executeQuery(sql); 6 //存在sql注入的危险 7 //若是用户传入的id为“5 or 1=1”,那么将删除表中的全部记录
1 //PreparedStatement 有效的防止sql注入(SQL语句在程序运行前已经进行了预编译,当运行时动态地把参数传给PreprareStatement时,即便参数里有敏感字符如 or '1=1'也数据库会做为一个参数一个字段的属性值来处理而不会做为一个SQL指令) 2 String sql = “insert into user (name,pwd) values(?,?)”; 3 PreparedStatement ps = conn.preparedStatement(sql); 4 ps.setString(1, “col_value”); //占位符顺序从1开始 5 ps.setString(2, “123456”); //也可使用setObject 6 ps.executeQuery();
4.处理执行结果(ResultSet)
1 ResultSet rs = ps.executeQuery(); 2 While(rs.next()){ 3 rs.getString(“col_name”); 4 rs.getInt(1); 5 //… 6 }
5.释放资源
//数据库链接(Connection)很是耗资源,尽可能晚建立,尽可能早的释放
//都要加try catch 以防前面关闭出错,后面的就不执行了
1 try { 2 if (rs != null) { 3 rs.close(); 4 } 5 } catch (SQLException e) { 6 e.printStackTrace(); 7 } finally { 8 try { 9 if (st != null) { 10 st.close(); 11 } 12 } catch (SQLException e) { 13 e.printStackTrace(); 14 } finally { 15 try { 16 if (conn != null) { 17 conn.close(); 18 } 19 } catch (SQLException e) { 20 e.printStackTrace(); 21 } 22 } 23 }