JDBC(Java Database Connectivity):Java访问数据库的解决方案。
JDBC只定义接口,具体实现由各个数据库厂商负责。
原生jdbc技术的使用基本都是模板式的开发,基本格式比较固定。
JDBC增删改查
try{//导入驱动包、加载具体驱动类Class.forName("具体驱动类");//与数据库建立连接,不同数据库写法可能不同,相同数据库不同版本写法可能也不一样,之前开发中遇到的//sqlserver2000的写法就与新版本的不一样Connection connection = DriverManager.getConnection("...");//通过connection,获取操作数据库的对象(Statement\preparedStatement\callablestatement)Statement stmt = connection.createStatement("...");//增删改操作都用stmt.executeUpdate("...");//(查询)处理结果集//ResultSet rs = stmt.executeQuery("...")while(rs.next()){rs.getXxx(..) }}catch(ClassNotFoundException e ){ ...}catch(SQLException e){...}catch(Exception e){...}finally{//关闭各种连接资源,关闭顺序与打开顺序相反相反if(rs!=null)rs.close()if(stmt!=null) stmt.close();if(connection!=null)connection.close();}
Statement\preparedStatement\callablestatement的区别
Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行时,数据库都要编译该SQL语句。
PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句,也可以不带参数。编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题。
CallableStatement提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。继承自PreparedStatement,支持带参数的SQL操作。提供了对输出和输入/输出参数(IN/OUT)的支持。不同数据库的存储过程是不可移植的,因此CallableStatement
面临移植性差问题。
JDBC调用存储过程
//jdbc调用存储过程sql语句://{call <procedure-name>[(<arg1>,<arg2>, ...)]}String sql = "{call queryEmp(?,?,?,?)}";Connection conn = null;CallableStatement cstmt= null;try{//提前将获取数据库连接的方法封装为JDBCUtils公共方法conn = JDBCUtils.getConnection();cstmt= conn.prepareCall(sql);//赋值参数cstmt.setInt(1, 7839);//注册参数,声明类型cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);cstmt.registerOutParameter(3, java.sql.Types.DOUBLE);cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);//执行cstmt.execute();//获取值String name = call.getString(2);double sal = call.getDouble(3);String job = call.getString(4);}catch (Exception e){e.printStackTrace();}finally{//释放资源JDBCUtils.release(conn, cstmt, null);}
JDBC调用存储函数
//jdbc调用存储函数sql语句://{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}//第一个占位符为返回值String sql = "{? = call queryEmpIncome(?)}";Connection conn = null;CallableStatement cstmt= null;try{//获取连接conn = JDBCUtils.getConnection();//获取调用存储函数的对象cstmt= conn.prepareCall(sql);//注册返回值类型cstmt.registerOutParameter(1, java.sql.Types.DOUBLE);//参数赋值cstmt.setInt(2, 7839);//执行cstmt.execute();//取出返回值double income = cstmt.getDouble(1);}catch (Exception e){e.printStackTrace();}finally{//释放资源JDBCUtils.release(conn, cstmt, null);}