JDBC连接Oracle数据库Java程序和JDBC及数据库系统的关系Java应用程序数据库数据库JDBCAPIJDBC驱动程序管理器JDBC/ODBC桥ODBC驱动程序JDBC驱动程序传统C/S(客户/服务)器模式客户端JDBC数据库服务器数据库协议(数据库驱动程序)B/S(浏览器/服务器)应用程序客户端浏览器中间层(业务逻辑)JDBC数据库服务器HTTP协议数据库协议JDBC开发过程裁入某种数据库的驱动程序与某一个数据库建立连接对数据库进行查询对数据库进行更新插入数据修改数据删除数据SELECTINSERTUPDATEDETELEJDBC中常用的类型•DriverManager•Connection•Statement(PreparedStatement)•ResultSetSQLJDBC工作流程驱动管理器连接语句结果集创建创建创建驱动程序数据库数据DriveMangerConnectionStatementPreparedStatementResultSetgetconnectioncreateStatmentexecuteQueryJDBC连接数据过程1.加载数据库驱动2.创建数据库连接3.创建语句对象4.通过语句对象向数据库发送并执行sql语句5.得到数据库的结果集(可选)数据库驱动•ODBC驱动sun.jdbc.odbc.JdbcOdbcDriver•Oracle驱动oracle.jdbc.driver.OracleDriver加载驱动•加载驱动–Class.forName(sun.jdbc.odbc.JdbcOdbcDriver“)–Class.forName(oracle.jdbc.driver.OracleDriver“)•注意加载驱动需要导入第三方驱动包创建数据库连接•相关信息–数据库URL–数据库连接用户名–数据库连接密码数据库URL•JDBC使用URL来标识驱动程序和数据源两者的位置,格式如下,–jdbc:subprotocol:datesourceidentifier–jdbc:指定JDBC驱动程序:数据源标识•例子如下:–jdbc:odbc:TestDB–jdbc:oracle:thin:@172.23.0.233:1521:ora创建数据库连接•创建数据库连接Connectioncon=DriverManager.getConnection(jdbc:oracle:thin:@172.23.0.233:1521:ora,scott,tiger);创建语句对象(增删改)Stringsql=insertintoadminvalues(‘张三’,20);Statementstmt=con.createStatement();introw=stmt.executeUpdate(sql);•对于增删改的操作,主要的变化在于SQL语句。•连接对象和语句对象使用完毕必须释放资源–stmt.close();–con.close();查询操作Stringsql=“select*fromadmin;Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(sql);对于结果集的操作•结果集游标•con.createStatement()•等价于•con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY)•游标的移动类型、游标的操作类型ResultSet其他常量•游标指针移动类型–TYPE_FORWARD_ONLY表示游标只能向前移动。–TYPE_SCROLL_INSENSITIVE双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。–TYPE_SCROLL_SENSITIVE双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。ResultSet其他常量•游标指针操作类型–CONCUR_READ_ONLY结果集只读操作–CONCUR_UPDATABLE结果集可更新操作ResultSet常用方法•游标操作方法–booleannext()–booleanprevious()–booleanabsolute(introw)–booleanfirst()–booleanlast()–voidafterLast()–voidbeforeFirst()–booleanisAfterLast()–booleanisBeforeFirst()–booleanisFirst()–booleanisLast()ResultSet常用方法•获得结果集指针对于的数据–TypegetType(StringcolumnLabel)–TypegetType(intcolumnIndex)•关闭结果集–voidclose();通过结果集插入数据•rs.moveToInsertRow();•rs.updateString(name,cc);•rs.updateInt(age,33);•rs.insertRow();•rs.moveToCurrentRow();通过结果集删除数据•rs.absolute(1);•rs.deleteRow();通过结果集修改操作•rs.absolute(1);•rs.updateInt(age,100);•rs.updateRow();PreparedStatement•解决sql注入问题。•能够动态赋值sql参数。Stringsql=“Updateadminsetname=?,age=?”PreparedStatementpstmt=con.prepareStatement(sql);使用PreparedStatement对象•Stringsql=“Updateadminsetname=?,age=?”•用set方法给主机变量赋值:–pstmt.setString(1,”张三”);–pstmt.setString(2,20);•执行SQL语句–pstmt.executeUpdate();•关闭语句–pstmt.close();CallableStatementStringsql=“{?=callget_age(?)}”cstmt.registerOutParameter(1,java.sql.Types.INTEGER);cstmt.setString(2,aa);cstmt.execute();intage=cstmt.getInt(1);关于事务的实现•事务:代表着一系列的操作语句。事务只有两个状态,要么成功,要么失败。成功时提交,失败时回滚。•举例如下:con.getAutoCommit(false);Statementstmt=con.createStatement()try{stmt.executeUpdate(command1);stmt.executeUpdate(command2);stmt.executeUpdate(command3);…………}catch(SQLExceptione){con.rollback();}con.commit();•List有序可重复•Set•加有参和无参