JDBCJDBC全称"Java DataBase Connectivity",它是一套面向对象的应用程序接口(API),并且制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准的接口实现。通过使用JDBC技术,开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序,真正地实现软件的跨平台。
JDBC对多种关系型数据库的驱动和操作都进行了封装,因此,开发者不需要编写额外的程序来兼容不同的数据库连接,只需要通过加载不同的数据库驱动程序即可完成连接,我们首先简单地封装JDBC连接类:
import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import oracle.jdbc.driver.OracleConnection; /** * @Description: JDBC连接类(示例连接Oralce) * @CreateTime: 2014-1-19 下午9:46:44 * @author: chenzw * @version V1.0 */ public class JdbcUtil { //驱动名 private static String DRIVER = "oracle.jdbc.driver.OracleDriver"; //获得url private static String URL = "admin"; //获得连接数据库的用户名 private static String USER = "jdbc:oracle:thin:@localhost:7001:test"; //获得连接数据库的密码 private static String PASS = ""; static { try { //1.初始化JDBC驱动并让驱动加载到jvm中,加载JDBC驱动后,会将加载的驱动类注册给DriverManager类。 Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection(){ Connection conn = null; try { //2.取得连接数据库 conn = DriverManager.getConnection(URL,USER,PASS); } catch (SQLException e) { e.printStackTrace(); } return conn; } //关闭连接 public static void close(Object o){ if (o == null){ return; } if (o instanceof ResultSet){ try { ((ResultSet)o).close(); } catch (SQLException e) { e.printStackTrace(); } } else if(o instanceof Statement){ try { ((Statement)o).close(); } catch (SQLException e) { e.printStackTrace(); } } else if (o instanceof Connection){ Connection c = (Connection)o; try { if (!c.isClosed()){ c.close(); } } catch (SQLException e) { e.printStackTrace(); } } } //重载关闭连接 public static void close(ResultSet rs, Statement stmt, Connection conn){ close(rs); close(stmt); close(conn); } //重载关闭连接 public static void close(ResultSet rs, Connection conn){ close(rs); close(conn); } }
JDBC数据库连接的查询主要通过Statement对象来执行各种SQL语句。Statement对象主要分为以下3种类型:
1. Statement :执行静态SQL语句的对象。
Statement接口常用的2个方法:
(1) executeUpdate(String sql) :执行insert / update / delete 等SQL语句,成功返回影响数据库记录行数的int整数型。
(2) executeQuery(String sql) : 执行查询语句,成功返回一个ResultSet类型的结果集对象。
ResultSet rs = null; Statement stmt = null; try { stmt = conn.createStatement(); int num = stmt.executeUpdate("insert into company values(‘No.1‘,‘CSDN‘)"); rs = stmt.executeQuery("select * from company"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }
2. PrepareStatement: 执行预编译SQL语句对象。
PrepareStatement接口常用的2个方法:
(1) executeUpdate(String sql) :执行insert / update / delete 等SQL语句,成功返回影响数据库记录行数的int整数型。
(2) executeQuery(String sql) : 执行查询语句,成功返回一个ResultSet类型的结果集对象。
ResultSet rs = null; PreparedStatement ps; try { ps = conn.prepareStatement("insert into company values(?,?)"); ps.setString(1, "No1."); ps.setString(2, "csdn"); int num = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { ps = conn.prepareStatement("select * from company"); ps.setString(1, "No1."); ps.setString(2, "csdn"); rs = ps.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }
优点:(1)可以有效SQL注入式攻击,提高安全性。(2)使用预处理语句在性能上提升很多。
3. CallableStatement接口常用的2个方法:
(1) executeUpdate(String sql) :执行insert / update / delete 等SQL语句,成功返回影响数据库记录行数的int整数型。
(2) executeQuery(String sql) : 执行查询语句,成功返回一个ResultSet类型的结果集对象。
ResultSet rs = null; CallableStatement cs; try { cs = conn.prepareCall("{call p_insert(?,?)}"); cs.setString(1, "No1."); cs.setString(2, "csdn"); int num = cs.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { cs = conn.prepareCall("{call p_select(?)}"); cs.setString(1, "No1."); rs = cs.executeQuery(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }