《应用数据库》PPT课件.ppt
第9章数据库的使用,WEB系统开发与设计,2,教学目的,了解JDBC驱动程序的4种类型掌握MySQL数据库的安装掌握MySQL-Front的安装和使用掌握JDBC操作数据库的三个主要步骤,WEB系统开发与设计,3,主要内容,1、数据库使用的完整过程2、数据库的增删改查实例3、连接池技术,WEB系统开发与设计,4,1、数据库使用的完整过程,1.1 连接和访问数据库1.2 处理结果集1.3 关闭对象1.4 异常处理,WEB系统开发与设计,5,1.1 连接和访问数据库,引入java.sql包加载驱动程序建立到数据库的连接访问数据库,WEB系统开发与设计,6,1.2 处理结果集,(1)插入、删除或者更新执行完即可(2)查询要处理查询结果,String username=“张三”;Statement stmt=con.createStatement();String sql=“select*from user where username=”+username+”;ResultSet rs=stmt.executeQuery(sql);,user,查询结果,对行遍历,使用结果集的next()方法获取某列,用get方法。,WEB系统开发与设计,7,next()方法的应用1、判断有没有结果集2、向下移动游标,以备获取某记录中某列的值,String sql=select*from user where username=+username+and userpass=+userpass+;rs=stmt.executeQuery(sql);if(rs.next()HttpSession session=request.getSession();session.setAttribute(username,username);else,while(rs.next()out.println(“用户名:”+rs.getString(2);,WEB系统开发与设计,8,get方法getInt(int columnIndex)获取整数字段的值getInt(String columnName)getString(int columnIndex)获取字符串字段的值getString(String columnName)getDouble(int columnIndex)getDouble(String columnName),String user=rs.getString(2);String user=rs.getString(“username”);,WEB系统开发与设计,9,1.3 关闭对象,为了避免资源浪费,要及时关闭创建的对象。关闭连接:conn.close();关闭语句:stmt.close();关闭结果集:rs.close();注意:关闭的顺序要和创建对象的顺序相反。若操作过程中无结果集,则不需关闭。,WEB系统开发与设计,10,1.4 异常处理,在对数据库处理过程中可能会发生各种异常,所以要对这些异常进行处理。一般使用如下的处理框架:,/异常处理框架try/要执行的可能出错的代码catch(Exception e)/出错后的代码处理finally/不管是否出错都要执行的代码,WEB系统开发与设计,11,实例,1、输出查询结果,WEB系统开发与设计,12,2、数据库的增删改查实例,(1)Statement对象和PreparedStatement对象(2)数据的更新,WEB系统开发与设计,13,(1)Statement对象和PreparedStatement对象,在数据库连接建立后,需要对数据库进行访问,执行SQL语句。为此java.sql包提供了3个接口,分别定义了对数据库的不同调用方式StatementPreparedStatementCallableStatement,WEB系统开发与设计,14,Statement,功能:执行静态的SQL语句,返回执行结果创建方法:利用在Conncetion接口中定义的createStatement()方法来创建Statement对象。Statement createStatement()throws SQLExceptionStatement接口中定义了若干方法用来执行SQL语句执行指定的SQL语句,返回一个ResultSet对象:ResultSet executeQuery(String sql)throws SQLException执行更新语句int executeUpdate(String sql)throws SQLException,Connection conn=DriverManager.getConnection(url,user,password);Statement stmt=conn.createStatement();,Connection conn=DriverManager.getConnection(url,user,password);String username=“张三”;Statement stmt=conn.createStatement();String sql=“select*from user where username=”+username+”;ResultSet rs=stmt.executeQuery(sql);sql=“insert into user(username,userpass)values(zhangsan,111)”;stmt.executeUpdate(sql);,WEB系统开发与设计,15,PreparedStatement,功能:使用不同的参数来多次执行同一个SQL语句时可以提高效率。创建方法:利用在Conncetion接口中定义的prepareStatement()方法来得到PreparedStatement对象。PreparedStatement prepareStatement()throws SQLException,Connection conn=DriverManager.getConnection(url,user,password);String sql=“insert user values(?,?,?)”;PreparedStatement pstmt=conn.prepareStatement(sql);pstmt.setInt(1,1);pstmt.setString(2,”zhangsan”);pstmt.setString(3,”123456”);pstmt.executeUpdate();pstmt.setInt(1,2);pstmt.setString(2,”王五”);pstmt.setString(3,”abcd”);pstmt.executeUpdate();,WEB系统开发与设计,16,CallableStatement(了解),功能:用于执行SQL的存储过程。是从PreparedStatement接口继承而来。创建方法:通过Connection对象的prepareCall()方法得到CallableStatement对象。注意:存储过程直接保存在数据库端,因此效率大大提高。但是不同数据库厂商提供的数据库产品采用的存储过程语法有差异,所以可移植性降低。MySQL5.0之前的版本不支持存储过程。,WEB系统开发与设计,17,(2)数据的更新,添加insert语句修改(更新)update语句删除-delete语句,WEB系统开发与设计,18,添加insert语句,语法:insert into table_name(column_list)values(data_values)应用Statement对象向数据表中添加数据的关键代码:Statement stmt=conn.cteateStatement();int rtn=stmt.executeUpdate(“insert into tb_user(name,pwd)values(hope,111)”);sql=insert into user(username,userpass,gender,birthdate,nativeplace)values(+vb.getUsername()+,+vb.getUserpass()+,+vb.getGender()+,+vb.getBirthdate()+,+vb.getNativeplace()+);Int rnt=stmt.executeUpdate(sql);,WEB系统开发与设计,19,添加语句,往往语句较长,涉及的变量较多,可以利用StringBuffer对象来编写动态的添加语句。,StringBuffer newsql=new StringBuffer();newsql.append(insert into user(username,userpass,gender,birthdate,nativeplace)values();newsql.append(vb.getUsername();newsql.append(,);newsql.append(vb.getUserpass();newsql.append(,);newsql.append(vb.getGender();newsql.append(,);newsql.append(vb.getBirthdate();newsql.append(,);newsql.append(vb.getNativeplace();newsql.append();stmt.executeUpdate(newsql.toString();,WEB系统开发与设计,20,添加insert语句,利用PreparedStatement对象向数据表中添加数据的代码:PreparedStatement pStmt=conn.prepareStatement(“insert into tb_user(name,pwd)values(?,?)”);pStmt.setString(1,”dream”);pStmt.setString(2,”111”);int rtn=pStmt.executeUpdate();,WEB系统开发与设计,21,修改(更新)update语句,语法update table_name set=,=where update user set username=“zhangsan”where username=“张三”,WEB系统开发与设计,22,StringBuffer newsql=new StringBuffer();newsql.append(update user set username=);newsql.append(vb.getUsername();newsql.append(,userpass=);newsql.append(vb.getUserpass();newsql.append(,gender=);newsql.append(vb.getGender();newsql.append(,birthdate=);newsql.append(vb.getBirthdate();newsql.append(,nativeplace=);newsql.append(vb.getNativeplace();newsql.append();stmt.executeUpdate(newsql.toString();,WEB系统开发与设计,23,删除-delete语句,delete from where delete from user where username=“zhangsan”,WEB系统开发与设计,24,WEB系统开发与设计,25,实例,1、用户的注册2、用户资料的管理显示用户修改用户删除用户3、新闻发布修改新闻删除新闻显示新闻,WEB系统开发与设计,26,常见问题,如何确认执行查询后有具体的记录被查询到?因为查询结果会返回给ResultSet对象,如下:可以根据游标来判断,利用next()语句来移动游标,根据next()的返回值判断。如何确认记录插入成功或者记录删除成功或者记录修改成功?这些操作会将受影响的记录数返回给整形变量,如下:若i值小于等于0,则表示没有记录被操作,更新失败。实例:删除记录,ResultSet rs=stmt.executeQuery(sql);,int i=stmt.executeQuery(sql);/i中是操作后受影响的记录数,stmt=conn.createStatement();int i=stmt.executeUpdate(sql);if(i0)session.setAttribute(msg,删除成功!);elsesession.setAttribute(msg,删除失败!);response.sendRedirect(showUsers.jsp);,WEB系统开发与设计,27,附加:数据库连接及操作类的编写,在开发程序时,经常会用到数据库的连接和操作,例如注册用户时需要对连接数据库并插入记录显示用户时需要对连接数据库并进行查询操作删除用户时需要对连接数据库并进行并删除操作更改用户时需要对连接数据库并进行修改操作为了避免代码重复,可以将这些处理封装到单独的类中。可以将其看成是一种特殊的JavaBean,WEB系统开发与设计,28,对数据库的主要操作内容,public DB(),public void createConn(),public void getStmt(),public ResultSet executeQuery(String sql),public boolean executeUpdate(String sql),类名:DB所属包:tools需导入的类:java.sql.*,WEB系统开发与设计,29,类的大体内容,package toolbean;import java.sql.*;public class DB private String classname=;/数据库驱动类路径private String url=jdbc:mysql:/localhost:3306/class;/数据库URLprivate String user=root;/登录数据库的用户名private String pwd=123456;/登录数据库的密码private Connection conn=null;/申明一个Connection对象private Statement stmt=null;/声明一个Statement对象/*通过构造方法加载数据库驱动*/public DB()/*创建数据库连接*/public void createConn()/*获取Statement对象*/public void getStmt()/*创建对数据库进行操作的增加、删除和修改的executeUpdate()方法*/public boolean executeUpdate(String sql)/*查询数据库*/public ResultSet executeQuery(String sql),import;import;import;import;import;,WEB系统开发与设计,30,载入数据库驱动,public DB()/DB类的构造方法tryClass.forName(classname).newInstance();/加载数据库驱动catch(Exception e)e.printStackTrace();/输出异常信息System.out.println(加载数据库驱动失败!);,WEB系统开发与设计,31,public void createConn(),public void createConn()tryconn=DriverManager.getConnection(url,user,pwd);catch(SQLException e)e.printStackTrace();System.out.println(获取数据库连接失败!);,WEB系统开发与设计,32,public void getStmt(),public void getStmt()createConn();try/调用Connection类实例的createStatement()方法创建一个Statement类对象stmt=conn.createStatement();catch(SQLException e)e.printStackTrace();System.out.println(创建Statement对象失败!);,WEB系统开发与设计,33,public ResultSet executeQuery(String sql),public ResultSet executeQuery(String sql)ResultSet rs=null;trygetStmt();tryrs=stmt.executeQuery(sql);catch(Exception e)e.printStackTrace();(查询数据库失败!);catch(Exception e)e.printStackTrace();finallytryrs.close();catch(Exception ee)trystmt.close();catch(Exception ee)tryconn.close();catch(Exception ee)return rs;,WEB系统开发与设计,34,public boolean executeUpdate(String sql),public boolean executeUpdate(String sql)boolean mark=false;trygetStmt();/创建一个Statement对象int iCount=stmt.executeUpdate(sql);/执行操作,并获取所影响的记录数if(iCount0)/更新数据库成功mark=true;else/更新失败mark=false;catch(SQLException e)e.printStackTrace();finallytrystmt.close();catch(Exception ee)tryconn.close();catch(Exception ee)return mark;,WEB系统开发与设计,35,3、连接池技术(DataBase Connection Pool,DBCP),(1)背景建立数据库连接耗时、耗资源,且一个数据库能同时建立的连接数有限。对于大型的Web应用,可能同时会有成百上千个访问数据库的请求,若每个Web应用程序为每一个客户请求分配一个数据库连接,会导致性能急剧下降。为了重复利用数据库连接,提高对请求的响应时间和服务器的性能,可采用连接池技术。,WEB系统开发与设计,36,3、连接池技术(DataBase Connection Pool,DBCP),(2)概要预先建立多个数据库连接对象,将其保存在连接池中。有客户请求时,从池中取出一个连接对象为客户服务。当请求完成,客户调用close()方法,将连接对象放回池中。需要配置JNDI数据源。,WEB系统开发与设计,37,3、连接池技术(DataBase Connection Pool,DBCP),(3)应用过程数据源配置在Tomcat中配置JDBC数据源,可以在%CATCALLINA_HOME%confserver.xml中进行配置在元素的内容中利用元素来配置数据源。,WEB系统开发与设计,39,配置实例,WEB系统开发与设计,40,复制驱动程序,复制驱动程序:将MySQL的驱动程序复制到安装目录lib下。原因:要使用Tomcat提供的数据源来访问MySQL,这个过程中实际的数据访问操作仍然由JDBC驱动来完成,所以要将驱动复制到相应目录下。,WEB系统开发与设计,41,配置web.xml可省略,配置web.xmlDB Connectionjdbc/TestDBContainer,WEB系统开发与设计,42,使用连接池访问数据库,使用连接池访问数据库与使用JDBC直接访问数据库过程基本相同,仅在得到连接的方式不同,import;import;import;Context ctx=new InitialContext();/创建上下文对象ctx,表示JNDI的根/引入环境命名上下文java:/comp/env解决JNDI中命名冲突问题Context envContext=(Context)ctx.lookup(java:/comp/env);DataSource ds=(DataSource)envContext.lookup(jdbc/mysql);conn=ds.getConnection();/获取连接池对象,WEB系统开发与设计,43,实例,显示信息 showUser.jsp,