访问数据库掌握JDBC的工作原理掌握如何获取数据库连接掌握如何对数据进行增、删、改、查本章目标为什么需要JDBCJDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力Java应用程序JDBCJDBCJSP/Servlet客户端数据库服务器应用服务器数据库服务器客户端JDBC程序的工作原理JDBCAPI提供者:sun公司内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如:DriverManager类Connection接口Statement接口ResultSet接口DriverManager提供者:sun公司作用:载入各种不同的JDBC驱动JDBC驱动提供者:数据库厂商作用:负责连接各种不同的数据库SqlServerOracleJDBCAPIJDBCDriverManagerJDBC驱动JDBC驱动Java应用程序JDBCAPIJDBCAPI可做三件事:与数据库建立连接、执行SQL语句、处理结果ConnectionDriverManagerStatementResultSetDriverManager:依据数据库的不同,管理JDBC驱动Connection:负责连接数据库并担任传送数据的任务Statement:由Connection产生、负责执行SQL语句ResultSet:负责保存Statement执行后所产生的查询结果客户端数据库服务器1234JDBC程序的工作模板try{Class.forName(JDBC驱动类);}catch(ClassNotFoundExceptione){System.out.println(无法找到驱动类);}try{Connectioncon=DriverManager.getConnection(JDBCURL,数据库用户名,密码);Statementstmt=con.createStatement();ResultSetrs=stmt.executeQuery(SELECTa,b,cFROMTable1);while(rs.next()){intx=rs.getInt(a);Strings=rs.getString(b);floatf=rs.getFloat(c);}con.close();}catch(SQLExceptione){e.printStackTrace();}获得数据库连接发送Sql语句处理结果注册JDBC驱动JDBCURL用来标识数据库必须处理的异常释放资源必须处理的异常JDBC驱动5-1JDBC驱动由数据库厂商提供在个人开发与测试中,可以使用JDBC-ODBC桥连方式在生产型开发中,推荐使用纯Java驱动方式DBServerDBServerJDBCAPIJDBCDriverManager纯Java驱动JDBC–ODBC桥Java应用程序ODBCJDBC驱动5-2桥连将对JDBCAPI的调用,转换为对另一组数据库连接API的调用优点:可以访问所有ODBC可以访问的数据库缺点:执行效率低、功能不够强大JDBC-ODBC桥Java应用程序JDBCAPIODBCAPIODBC层DBServerJDBC驱动5-3使用JDBC-ODBC进行桥连1、在控制面板ODBC数据源系统DSN中配置数据源2、编程,通过桥连方式与数据库建立连接------语法------Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Connectioncon=DriverManager.getConnection(jdbc:odbc:news,sa,sa);JDBC-ODBC桥驱动类的完全限定类名数据源名称演示:配置ODBC数据源JDBC驱动5-4纯Java驱动由JDBC驱动直接访问数据库优点:100%Java,快又可跨平台缺点:访问不同的数据库需要下载专用的JDBC驱动JDBC驱动Java应用程序JDBCAPIDBServerJDBC驱动5-5使用纯Java驱动方式进行直连1、下载数据库厂商提供的驱动程序包2、将驱动程序包引入工程中3、编程,通过纯Java驱动方式与数据库建立连接------语法------StringURL=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news;Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);Connectioncon=DriverManager.getConnection(URL,sa,sa);sqlserver数据库驱动类的完全限定类名演示:在工程中引入JDBC驱动程序包数据库名称小结1JDBC桥连与纯Java驱动两种方式的优缺点分别是什么?JDBCURL的作用是什么?创建数据表:FirstLevelTitleJDBC应用要求对新闻标题进行管理:1、新闻标题存储在SqlServer2000中2、通过JDBC对新闻标题进行增、删、改、查操作操作步骤使用Statement插入数据使用PreparedStatement增、删、改、查数据字段名称字段说明数据类型大小Id序号int4TitleName标题名称varchar50Creator创建者varchar50CreateTime创建时间datetime812使用Statement插入数据2-1使用桥连方式向FirstLevelTitle表中插入一条记录——代码片断——publicstaticvoidmain(String[]args){Connectioncon=null;Statementstatement=null;try{StringstrSql=insertintoFirstLevelTitlevalues(1,'军事','网管',getdate());try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(ClassNotFoundExceptione){System.out.println(无法找到驱动类);}con=DriverManager.getConnection(jdbc:odbc:news,sa,sa);statement=con.createStatement();statement.executeUpdate(strSql);}catch(SQLExceptionsqlE){sqlE.printStackTrace();}finally{closeStatement(statement);closeConnection(con);}}建立连接执行sql语句数据库连接使用完毕,及时释放载入JDBC-ODBC桥驱动类异常处理异常处理完整代码实现使用Statement插入数据2-2使用纯Java驱动方式向FirstLevelTitle表中插入一条记录——代码片断——publicstaticvoidmain(String[]args){Connectioncon=null;Statementstatement=null;try{StringstrSql=insertintoFirstLevelTitlevalues(1,'军事','网管',getdate());try{Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);}catch(ClassNotFoundExceptione){System.out.println(无法找到驱动类);}con=DriverManager.getConnection(jdbc:microsoft:sqlserver://localhost:1433;+DatabaseName=news,sa,sa);statement=con.createStatement();statement.executeUpdate(strSql);}catch(SQLExceptionsqlE){sqlE.printStackTrace();}finally{//释放连接}}载入sqlserver数据库驱动类建立连接执行sql语句完整代码实现小结2在使用纯Java驱动方式进行数据库连接时,如果程序在运行时抛出异常:java.sql.SQLException:Nosuitabledriverfoundforjdbc:microsoft:sqlserver://localhost:1433;DatabaseName=news那么出错的原因是什么?如何解决?请单独建立一个类ConnectionManager,专门负责建立数据库连接、以及关闭连接,并思考这样做带来的好处是什么找不到合适的驱动类,原因:没有把数据库驱动包引入工程好处在于:既便于管理、又可以提高代码的复用性完整代码实现PreparedStatementPreparedStatement接口(预编译的SQL语句)Statement接口当SQL语句将运行多次时,尽量使用PreparedStatement,以便提高运行效率PreparedStatement接口继承Statement接口PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率使用PreparedStatement插入数据publicclassNewsFirstTitleDB2{publicstaticvoidmain(String[]args){Connectioncon=null;PreparedStatementpStatement=null;try{SimpleDateFormathmFromat=newSimpleDateFormat(yyyy-MM-ddhh:mm:ss);con=ConnectionManager.getConnection();StringstrSql=insertintoFirstLevelTitlevalues(?,?,?,?);pStatement=con.prepareStatement(strSql);pStatement.setInt(1,1);pStatement.setString(2,军事);pStatement.setString(3,管理员);pStatement.setString(4,hmFromat.format(newDate()));pStatement.executeUpdate();}catch(SQLExceptionsqlE){sqlE.printStackTrace();}finally{ConnectionManager.closeStatement(pStatement);ConnectionManager.closeConnection(con);}}}参数化的查询语句设置每个?参数的值,列号从1开始执行sql语句使用PreparedStatement删除数据publicclassNewsFirstTitleDB3{publicstaticvoidmain(String[]args){Connectioncon=null;PreparedStatementpStatement=null;try{con=ConnectionManager.getConnection();StringstrSql=deletefromFirstLevelTitlewhereTitleName=?;pStatement=con.prepareStatement(strSql);pStatement.setString(1,军事);introw=pStatement.executeUpdate();System.out.println(“成功删除了+row+行数据!);}catch(SQLExceptionsqlE){sqlE.printStackTrace();}finally{ConnectionManager.closeStat